专题推荐文章:
本系列目录
一、生命周期流程图
二、OnCreate()
- 这个好理解,就是在SystemBase被创建时调用的
- 在子类重写该函数,初始话SystemBase所需要的资源
- 在第一次OnStartRunning()和OnUpdate()前调用
三、OnStartRunning()
- 在系统被停止之后,第一次调用OnUpdate()之前调用,类似MonoBehaviour里面的OnEnable()
- 当SystemBase因为匹配不到所需EntityQuery而停止时,等到匹配到对应EntityQuery,则会在OnUpdate()前调用OnStartRunning()
- 当因开发人员手动设置系统的Enabled=false时,当Enabled恢复为true时,也会在OnUpdate()前调用OnStartRunning()
四、OnUpdate()
- 当SystemBase匹配到所需EntityQuery时,或SystemBase含[AlwaysUpdateSystem] attribute,或者SystemBase压根没有EntityQuery时,会在主线程里每帧调用
- 父System Group会在Update()中调用所有子系统的OnUpdate()
- Entities.ForEach 和 Job.WithCode提供了便利的方式来定义Job,当然,也可以自己定义IJobChunk类来实例化、执行。你既可以选择在主线程执行,也可以选择在Work线程执行,也可以在多个线程执行
- 如果使用EntityManager里面的方法来修改Entity的结构(如增删IComponentData,或者直接删除了Entity),需要注意对后续SystemBase的更新相同Entity的影响(类似MonoBehaviour里面Destroy并不会立刻删,跟注意使用DestroyImmediate相似)[1]
五、OnStopRunning()
- 在SystemBase被停止之后调用(停止原因见三、OnStartRunning()),也会在SystemBase被删除时,OnDestroy()之前调用
六、OnDestroy()
- 当SystemBase被Destroy之后调用
- SystemBase被Destroy原因:
- 应用被关闭
- World被销毁
- 被开发人员调用DestroySystem(ComponentSystemBase)
- 编辑器模式模式下,还会在代码编译时退出
七、与生命周期息息相关的ShouldRunSystem()成员方法
- 返回SystemBase的entity queries是否匹配成功,用来决定是否需要跳过当前帧的OnUpdate()
- 当SystemBase有AlwaysUpdateSystemAttribute.时,也返回true
八、与生命周期息息相关的Enabled成员属性
- 用于OnUpdate()是否会被执行
- 当Enabled为false时,即使ShouldRunSystem()返回true,SystemBase也不会执行