当前位置: 首页 > news >正文

Unreal游戏初始化流程

前言

本文主要是总结Unreal在游戏启动时的初始化流程,包括讨论PIE和Standalone的区别,避免把一些初始化逻辑放在不合适的位置,比如我希望在所有Actor BeginPlay后执行某个逻辑,那我如果把它放在Subsystem的initialize中显然就会搞砸
在这里插入图片描述

启动入口

当我们PlayStandalone或者打包后启动后使用的Engine类型是GameEngine,在编辑器中的Engine类型是EditorEngine,Standalone状态下分两步Init和Start,PIE则只有一步StartPlayInEditorSession但内部其实也可以拆成Init和Start。

GameInstance

Init

两者分别通过GameInstance的InitializeStandaloneInitializeForPlayInEditor初始化GameInstance,区别在于Editor状态下在初始化GameInstance前我们其实已经有了World,所以会先通过PostCreatePIEWorld触发World的初始化,也就是说PIE的InitWorld是在InitGameInstance之前的,WorldSubsystem的Initialize会优先于GameInstanceSubsystem
在GameInstance的Init中会先执行ReceiveInit,对于Unlua游戏这里往往是lua侧的初始化入口(初始化lua侧的一切系统)。然后初始化Subsystem

Start

入口分别是StartGameInstanceStartPlayInEditorGameInstance,对于PIE因为World已经初始化好,所以在OnStart后会立刻对World进行InitializeActor和BgeinPlay。而Standalone会通过LoadMap进行异步加载地图,DS联机的话客户端会等待Server广播的加载地图消息,待地图加载完毕后依次对World执行Init、InitializeActor和BeginPlay

World

Init

这步只包括Subsystem初始化

InitializeActorsForPlay

这里首先会初始化所有世界中所有的Component,具体方式是对每个Actor进行PreRegister->Register->PostRegister,在Register中每个Actor会依次注册自己的TickFunction->注册RootComponent->注册其他Component。
然后会初始化GameMode调用InitGame,并广播OnActorInitialized,这里MatchState也会进入EnteringMap阶段

BeginPlay

这里会分别调用WorldSubsystem的OnWorldBeginPlay和广播OnWorldBeginPlay事件,此外会调用GameMode的StartPlay
在StartPlay中会遍历场景中所有Actor调用BeginPlay,然后广播OnWorldMatchStarting事件
这里MatchState会进入WaitingToStart,如果ReadyToStartMatch的话则进入InProgress

小结

所有组件注册后 OnActorsInitialized
所有Actor BeginPlay后 OnWorldMatchStarting或者OnWorldBeginPlay
WorldSubsystem的OnWorldBeginPlay在所有Actor BeginPlay前

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 将 Parallels Desktop(PD虚拟机)安装在移动硬盘上,有影响吗?
  • Fortran:program 和 subroutine 的区别
  • 综合型医院适合什么样的数据摆渡方式,才能服务与安全兼顾?
  • 如何通过深度学习实践来理解深度学习的核心概念
  • STM32 之 SDRAM 详解
  • 【编程基础知识】数据库表设计三范式
  • Open3D(C++) 点云中的植被信息提取
  • 【四范式】浅谈NLP发展的四个范式
  • Java 21的Logging的笔记
  • 79.Options Object 模式
  • Knife4j:打造优雅的SpringBoot API文档
  • NAS远程下载,Docker部署qBittorrent、Transmission、贝锐花生壳
  • matlab处理函数2
  • 多维时序 | Matlab基于TCN-Transformer+LSTM双输入神经网络时间序列预测
  • 大模型——LLaVA和LLaMA的介绍和区别
  • 《Java编程思想》读书笔记-对象导论
  • C++入门教程(10):for 语句
  • jQuery(一)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • npx命令介绍
  • react 代码优化(一) ——事件处理
  • SOFAMosn配置模型
  • Sublime text 3 3103 注册码
  • TCP拥塞控制
  • Terraform入门 - 3. 变更基础设施
  • TypeScript迭代器
  • vue--为什么data属性必须是一个函数
  • 初识 webpack
  • 大型网站性能监测、分析与优化常见问题QA
  • 我看到的前端
  • 自动记录MySQL慢查询快照脚本
  • 06-01 点餐小程序前台界面搭建
  • 如何正确理解,内页权重高于首页?
  • 移动端高清、多屏适配方案
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # 飞书APP集成平台-数字化落地
  • ######## golang各章节终篇索引 ########
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (1)常见O(n^2)排序算法解析
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (六)c52学习之旅-独立按键
  • (十一)图像的罗伯特梯度锐化
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)C#调用WebService 基础
  • (转)甲方乙方——赵民谈找工作
  • (转)详解PHP处理密码的几种方式
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET delegate 委托 、 Event 事件
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 直连SAP HANA数据库
  • .NET4.0并行计算技术基础(1)