简介: LaunchEngineLoop.cpp 内的 Init() 里面有调用了 GEngine 的 Init,而这个 GEngine 才是真正的引擎实例。这个 GEngine 又根据是不是 eidtor 来决定具体实例化为 UGameEngine 还是 UUnrealEdEngine
- UGameEngine 继承自 UEngine 继承自 UObject
- UUnrealEdEngine 继承自 UEditorEngine 继承自 UEngine 继承自 UObject
它们的父类也都有自己的 Init ,套娃啊,接下来我计划两个都捋一遍
UEditorEngine::Init(IEngineLoop* InEngineLoop)
此类位于 EditorEngine.cpp 文件内,在 UUnrealEdEngine 内的 Init 开始出就调用的这方法,所以我先捋它
使用 DECLARE_SCOPE_CYCLE_COUNTER 开启CPU周期计数统计
绑定 UEditorEngine::OnModalMessageDialog 到 FCoreDelegates::ModalMessageDialog
绑定 UEditorEngine::OnShouldLoadOnTop 到 FCoreUObjectDelegates::ShouldLoadOnTop
绑定 PreWorldOriginOffset 到 FCoreDelegates
绑定 OnAssetLoaded 到 FCoreUObjectDelegates
绑定 OnLevelAddedToWorld、OnLevelRemovedFromWorld到 FWorldDelegates
绑定 OnAssetCreated 到 IAssetRegistry
向 FEditorDelegates 的三个阶段添加 Lambda
- BeginPIE (Begin Play In Editor)
- PrePIEEnded (Pre Play In Editor Ended)
- EndPIE (End Play In Editor)
检查引擎是否为原厂版本 UpdateIsVanillaProduct()
FSourceCodeNavigation 注册新添加模块时的 lambda
初始化 Editor,在这个初始化函数里调用了 UEngien的Init,这个函数调用在 UGameEngine 类里也有调用,所以放在后文在写吧
LoadEditorFeatureLevel();加载 Editor 特性关卡
CreateTrans() 创建并启动一个编辑事务,实现对场景或资源的 Redo/Undo
加载默认的 Editor 模块
UModel 设置全局的 BSP 纹素缩放
加载并应用游戏用户设置
获取默认编辑器 style
FEditorCommandLineUtils 初始化 Eidtor CommandLine 工具
检查丢失的高级渲染 Require
标记 bIsInitialized=true
UUnrealEdEngine::Init(IEngineLoop* InEngineLoop)
此类的具体逻辑位于 UnrealEdEngine.cpp 文件内
调用上方基类 UEditorEngine 的Init
将 自定义编辑器元素(菜单、工具栏、命令、面板等)注册到引擎框架中
重建地图模版数据
检查磁盘剩余空间
FSourceCodeNavigation 代码导航初始化
PackageAutoSaver 重置并加载文件
检查 GEditorSettingsIni 位置文件是否为空,如果为空则创建一个新的 性能监控实例
UPackage 添加 PackageDirtyStateChangedEvent 回调函数
初始化 Content 路径并检查写入权限
获取 FDirectoryWatcherModule 模块实例的指针
FPackageName 添加新的 Content 路径的挂在和写在监听
FCoreUObjectDelegates 添加 OnPostGarbageCollect 监听
添加其它监听,例如,OnColorPickerChanged、OnPreWindowMessage、OnPostWindowMessage、OnHISMTreeBuilt、OnEditorElementSelectionPtrChanged
FSnappingUtils 编辑器吸附工具初始化
AVolume 向 VolumeShapeChangedDelgate 添加形状变动事件
检查并加载所有需要完全加的 Package
FSpriteCategoryInfo 精灵分类索引重建
UAutoReimportManager 自动重新导入管理器 初始化
注册自定义面板设置
- BlueprintEditorSettings
- BlueprintEditorProjectSettings
- EditorLoadingSavingSettings
- GameMapsSettings
- LevelEditorPlaySettings
- ProjectPackagingSettings
- LevelEditorPlayNetworkEmulationSettings
获取 ISettingsModule 模块
绑定 导入、导出 事件
获取 FPropertyEditorModule 模块
非 CMD 模式下 设置编辑器进行 ID 的环境变量
获取 UEditorExperimentalSettings
获取 UCookerSettings
设置 CookerServer 的实例和初始化
创建 FExternalCookOnTheFlyServer 的实例
根据命令行参数 nomcp 设置子进程的 命令行
添加主框架打开后的 卡顿检测系统
注册 编辑器关闭时的 lambda 函数
总结
两个类加起来的内容还可以不是很多
罗列一下新东西
- IAssetRegistry 资源元数据管理系统核心接口
- FSourceCodeNavigation 源代码与编辑器之间的导航工具类
- FPackageAutoSaver 自动保存未持久化包的工具
- USelection 编辑器中选择状态管理器
- FSnappingUtils 吸附工具
- AVolume 一个Actor 实例类,在场景中定义一个3D空间区域,就是体积
- FSpriteCategoryInfo 精灵片分类信息
- FPropertyEditorModule 属性编辑器模块
- UCookerSettings 烘焙设置
- FExternalCookOnTheFlyServer 分布式烘焙,及动态加载核心类 (COTF)
- UE::FStallDetector 初始化卡顿(Stall)检测系统