探索笔记 - Unity生命周期和实例化GameObject的相关时序问题

现有 A B C 三个游戏对象,A挂在场景下作为Root GameObject,仅对Awake Enable Start Update作分析

1.A中Awake实例化B,B的Awake中实例化C

探索笔记 - Unity生命周期和实例化GameObject的相关时序问题

A中Awake实例化B,B的OnEnable中实例化C,执行顺序和上图没有本质上的差别

可以理解成Awake方法末尾调用OnEnable

Awake-OnEnable在第0帧执行,但Start-Update却在第1帧执行

2.A中Awake实例化B,B的Start中实例化C

探索笔记 - Unity生命周期和实例化GameObject的相关时序问题

除了AB,C是Awake-OnEnable-Start-Update都在第1帧执行,可以看出第0帧的区别

3.A中Start实例化B,B的Awake中实例化C

探索笔记 - Unity生命周期和实例化GameObject的相关时序问题

3.A中Start实例化B,B的Start中实例化C

探索笔记 - Unity生命周期和实例化GameObject的相关时序问题

C的Start在AB的Update之后执行,什么情况?

4.A中Update实例化B,B的Update中实例化C

探索笔记 - Unity生命周期和实例化GameObject的相关时序问题

省略了A在Update中实例化B,B在Awake Start中实例化C的情况

可以确定Update中实例化对象,对象的Awake Start会在同一帧,但Updata一定会在一下一帧执行

另外如果你想在Update中去操作刚实例化的对象,那你可能会遇到时序问题,因为它一定执行完了Awake和OnEnable,但在Update这个方法的这一帧里里一定没执行Start

总结起来就是Awake和OnEnable是在Instantiate方法中立刻执行的,Instantiate方法并不直接调用Start方法

顺手做了个试验发现SetActive方法中直接调用了OnEnable方法 

做个笔记,遇到类似的时序问题可以翻出来看一下