环境:Unreal5.6 语言:C++
面向:Unreal初学者
总起
Unity日渐式微,Unreal方兴未艾。趁此时重头开始研究Unreal,以作为工作上的参考,亦是为日后做准备。
此文章作为学习中记录,因为我对Unity比较熟悉,所以会优先以Unity的角度理解Unreal。
Unreal文档建设相当完善,不确定的内容可以直接跳转至官方内容查看,实在不行,Unreal也有全套源代码作为参考。
生命周期函数
首先是这张图片:

四种初始化流程:
- 从磁盘中加载
- 在编辑器中运行,Play in Editor
- 生成
- 延迟生成
Actor 的生命周期函数:
- AActor::PreInitializeComponents
- UActorComponent::InitializeComponent,初始化组件,主要功能是标记组件已被创建
- AActor::PostInitializeComponents
- AActor::BeginPlay
- AActor::EndPlay

销毁会运行GC,Unreal中一般会群集处理(将紧密关联的UObject分组为一个"群集",在GC时作为一个整体单元进行扫描和回收,可关闭)
- UObject::BeginDestroy
- UObject::IsReadyForFinishDestroy,默认返回true,Actor中有个判断渲染完成才能销毁的逻辑
- UObject::FinishDestroy
- 使用命令Obj GC强制垃圾回收
Tick
- Tick组排序
- TG_PrePhysics,物理帧之前,Actor默认
- TG_DurationPhysics,和物理帧同时运行,适合那些无视物理数据或允许一帧偏差的逻辑,Component默认
- TG_PostPhysics,物理帧之后
- TG_PostUpdateWork,摄像机更新之后,需要知道摄像机准确位置的情况
- 以上步长都是跟渲染帧同步的,没有类似Unity FixedUpdate的概念
- 查到比较类似的是AActor.AsyncPhysicsTickActor
- 但主要是在物理线程中处理,需考虑线程安全
- 另一种方式是手动实现固定间隔的逻辑,或使用Timer
- 查到比较类似的是AActor.AsyncPhysicsTickActor
- Tick的最大时长
- 可以通过Config/DefaultEngine.ini中的[/Script/Engine.Engine]分段的MaxDeltaTime设置

- (类似Unity中的Project Settings的Maximum Allowed Timestep)
- 另:Tick会被蓝图覆盖掉,蓝图中的TickEvent没后接内容,C++中的Tick也不会运行