#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序
Unity的生命周期一直是个老生常谈的问题,一般的完整生命周期规律就不再重复了。
之前也分析了一次Awake_Start的执行顺序。
https://blog.csdn.net/wwlcsdn000/article/details/80068216
最近又碰到了一个新问题,如果用Intantiate代码来生成的物体,它的生命周期执行顺序是怎样的。
为此我查看了十余篇文章并自行进行了测试。最后有附带的测试工程,可以自行实验。
关于Intantiate实例化物体的生命周期,我并没有在官方手册找到相关资料。
以下的过程全靠网上的文章理解与自行测试理解修正,如有发现错误还请及时留言,好作出改正修复。
主要参考文章链接如下:
http://unitylib.com/wp/2017/10/29/awake-onenable-start-order/
同一个物体上挂在多个脚本执行顺序整体上保持Unity的生命周期规律。
假如有三个脚本1 2 3,
基本顺序是Awake1,Awake2,Awake3
Start1,Start2,Start3
Update1,Update2,Update3
并且Start与Update在Awake执行后的下一帧开始执行。
如下图所示,
场景中有三个物体,每个物体挂一个脚本,CUbe Capsule Sphere
整体规律为上边相同。
预制体为一个Cube,挂有一个脚本,并且预制体默认激活状态,脚本默认激活状态(请注意这个前置条件是必须的)
整体顺序执行一致,Start与Update在Awake执行后的下一帧开始执行。
整体顺序执行一致,Start Update Awake在同一帧。
整体顺序执行一致,Update在Awake Start执行后的下一帧开始执行。
同时初始化了三个预制体在Awake中,在Start和Update中可自行测试。
整体顺序执行一致,Start与Update在Awake执行后的下一帧开始执行,与实例化单个物体的情况一致。
同一层次间的顺序与代码书写的顺序一致。
基本顺序上保持 Awake OnEnable Start Update的顺序
但是具体每帧执行的内容与调用时候 所处的方法有关。
如果把Awake OnEnable为划分为第一层
Start划分为第二层
Update划分为第三层
则规律可总结为
Awake中实例化,本帧执行Awake层(包括OnEnable),下一帧执行后续Start与Update
Start中实例化,所有内容同一帧执行。
Update中实例化,本帧执行Awake层(包括OnEnable)与Start层,下一帧执行后续Update
预制体为一个Cube,挂有一个脚本,并且预制体默认激活状态,脚本为未激活状态(请注意这个前置条件是必须的)
脚本未激活不会执行OnEnable
基本顺序上保持 Awake OnEnable Start Update的顺序
同时我们可以注意到,勾选脚本激活的过程可以认为是启动OnEnable的过程
每帧的内容执行与正常执行时候Awake中实例化时候一致。Awake脚本未激活也会执行。
类似Awake中实例化,本帧执行Awake层(这里只剩OnEnable),下一帧执行后续Start与Update
预制体为一个Cube,挂有一个脚本,并且预制体为未激活状态,脚本为激活状态(请注意这个前置条件是必须的)
基本顺序上保持 Awake OnEnable Start Update的顺序
同时我们可以注意到,勾选物体激活的过程可以认为是激活了挂载的脚本同时OnEnable。
每帧的内容执行与正常执行时候Awake中实例化时候一致。
类似Awake中实例化,本帧执行Awake层(包括OnEnable),下一帧执行后续Start与Update
在实例化物体的同时,执行脚本上的一个方法。
GameObject go = Instantiate(Prefab);
go.GetComponent().Init();
三者的整体顺序保持 Awake OnEnable Init Start Update顺序,并且每帧执行内容与正常实例化物体一致。
链接: https://pan.baidu.com/s/1C8QSFqc_ljPldREZZxAruw 提取码: 2pc5
其实这里的Awake与Start一直没有找到一个合适的名称叫法,从测试来看他们并不是表面名称所代表的含义。
后续需要进一步思考。