#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序

#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序
Unity的生命周期一直是个老生常谈的问题,一般的完整生命周期规律就不再重复了。
之前也分析了一次Awake_Start的执行顺序。
https://blog.csdn.net/wwlcsdn000/article/details/80068216
最近又碰到了一个新问题,如果用Intantiate代码来生成的物体,它的生命周期执行顺序是怎样的。
为此我查看了十余篇文章并自行进行了测试。最后有附带的测试工程,可以自行实验。

Unity前言

关于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执行后的下一帧开始执行。
如下图所示,
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第1张图片

场景启动同时有多个物体

场景中有三个物体,每个物体挂一个脚本,CUbe Capsule Sphere
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第2张图片
整体规律为上边相同。

正常Instantiate时Awake、OnEnable、Start、Update顺序

Awake中正常的实例化一个预制体

预制体为一个Cube,挂有一个脚本,并且预制体默认激活状态,脚本默认激活状态(请注意这个前置条件是必须的)
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第3张图片

整体顺序执行一致,Start与Update在Awake执行后的下一帧开始执行。

Start中正常的实例化一个预制体

#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第4张图片

整体顺序执行一致,Start Update Awake在同一帧。

Update中正常的实例化一个预制体

#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第5张图片
整体顺序执行一致,Update在Awake Start执行后的下一帧开始执行。

Awake中正常的实例化多个预制体

同时初始化了三个预制体在Awake中,在Start和Update中可自行测试。
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第6张图片
整体顺序执行一致,Start与Update在Awake执行后的下一帧开始执行,与实例化单个物体的情况一致。
同一层次间的顺序与代码书写的顺序一致。
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第7张图片

整体规律总结

基本顺序上保持 Awake OnEnable Start Update的顺序
但是具体每帧执行的内容与调用时候 所处的方法有关。
如果把Awake OnEnable为划分为第一层
Start划分为第二层
Update划分为第三层
则规律可总结为
Awake中实例化,本帧执行Awake层(包括OnEnable),下一帧执行后续Start与Update
Start中实例化,所有内容同一帧执行。
Update中实例化,本帧执行Awake层(包括OnEnable)与Start层,下一帧执行后续Update

特殊Instantiate时Awake、OnEnable、Start、Update顺序(脚本未激活)

预制体为一个Cube,挂有一个脚本,并且预制体默认激活状态脚本为未激活状态(请注意这个前置条件是必须的)
脚本未激活不会执行OnEnable

Awake中特殊的实例化一个预制体

在这里插入图片描述

勾选激活预制体上的脚本时候
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第8张图片

Start中特殊的实例化一个预制体

#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第9张图片
勾选激活预制体上的脚本时候
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第10张图片

Update中特殊的实例化一个预制体

按下空格后
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第11张图片
勾选激活预制体上的脚本时候
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第12张图片

整体规律总结

基本顺序上保持 Awake OnEnable Start Update的顺序
同时我们可以注意到,勾选脚本激活的过程可以认为是启动OnEnable的过程
每帧的内容执行与正常执行时候Awake中实例化时候一致。Awake脚本未激活也会执行。
类似Awake中实例化,本帧执行Awake层(这里只剩OnEnable),下一帧执行后续Start与Update

特殊Instantiate时Awake、OnEnable、Start、Update顺序(物体未激活)

预制体为一个Cube,挂有一个脚本,并且预制体为未激活状态脚本为激活状态(请注意这个前置条件是必须的)

Awake中特殊的实例化一个预制体

开始运行没有日志,勾选预制体为激活后如下
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第13张图片

Start中特殊的实例化一个预制体

开始运行没有日志,勾选预制体为激活后如下
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第14张图片

Update中特殊的实例化一个预制体

开始运行没有日志,按下空格,勾选预制体为激活后如下
#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第15张图片

整体规律总结

基本顺序上保持 Awake OnEnable Start Update的顺序
同时我们可以注意到,勾选物体激活的过程可以认为是激活了挂载的脚本同时OnEnable。
每帧的内容执行与正常执行时候Awake中实例化时候一致。
类似Awake中实例化,本帧执行Awake层(包括OnEnable),下一帧执行后续Start与Update

实例化物体时同时执行脚本方法顺序

在实例化物体的同时,执行脚本上的一个方法。

 GameObject go  = Instantiate(Prefab);
 go.GetComponent().Init();

Awake中实例化并执行

#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第16张图片

Start中实例化并执行

#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第17张图片

Update中实例化并执行

#Untiy中Instantiate时Awake、OnEnable、Start、Update顺序_第18张图片
三者的整体顺序保持 Awake OnEnable Init Start Update顺序,并且每帧执行内容与正常实例化物体一致。

实验工程测试

链接: https://pan.baidu.com/s/1C8QSFqc_ljPldREZZxAruw 提取码: 2pc5

思考疑问

其实这里的Awake与Start一直没有找到一个合适的名称叫法,从测试来看他们并不是表面名称所代表的含义。
后续需要进一步思考。

你可能感兴趣的:(Unity)