游戏循环函数解析:
主要循环逻辑在EngineLoop类中实现,在引擎初始化之前有一个PreInit阶段,在经历该阶段之后才正式初始化(初始化对应代码GEngineLoop.Init),之后每帧更新(GEngineLoop.Tick),直到最后退出游戏(GEngineLoop.Exit())
一,在类进行PreInit阶段时,引擎加载底层模块,之后如果有,加载引擎或者插件中PreInit阶段的模块
二,Default阶段,如果定义了Actor子类或者GameMode子类,那么EngineLoop就会为类的默认实例分配空间,之后运行构造函数,使用其父类传入的CDO作为模板(因此构造函数不应当包含任何关于游戏性相关的代码)
以上完成了初始化工作,底层模块加载以及类注册工作等内容,之后继续执行Init方法
三,
Init方法简单粗暴的交给了UEngine类来执行
Eingine模块->模块中有一个Engine.h的头文件->头文件中定义了一个UEngine的类->衍生为UEditorEngine和UGameEngine两个类
在游戏的整个Init阶段
FEngineLoop检查Engine的配置文件,找出应当使用哪个GameEngine类,之后创建该类的实例,并且用全局UEingine类型指针指向它,从而能够在Engine/Engine.h中声明的全局变量GEngine来访问它,
当Engine实例被创建并且被初始化之后,EngineLoop触发一个全局委托来告知引擎目前已经初始化了(下)
最终,引擎启动√
初始化完成√
Ⅱ Engine的初始化流程
Engine会在地图加载之前进行初始化,并且加载一些重要对象
ViewportClient作为用户和引擎之间的交互接口
GameInstance处理一下原本由Engine对象来处理的特定于项目的功能
初始化之后得到了什么呢?
一个GameEngine,一个GameInstance,一个GameViewportClient,一个LocalPlayer
首次调用LoadMap:
在调用LoadMap之后,将拥有一个UWorld对象来包含所有保存在游戏地图中的Actor
还将生成构成GameFramework核心的一系列Actor对象:包括GameMode,GameSession,GameState,GameNetworkManager,PlayController,PlayerState以及Pawn对象
从高层系统上说,需要考虑两种生命周期,以地图加载进来为分界线
地图加载前就生成的对象和整个游戏运行过程紧密相关
有些资源伴随地图存在而存在,伴随地图消失而消失
例如:GameMode,GameState以及PlayerController
如果直接切换到新地图/连接到其他服务器/退回主菜单——所有Actor对象都会被销毁,类被清空,类的对象也不复存在,直到加载下一张地图
未完待续