阅读了雨松MOMO的《Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)》感觉有些地方还是没有说清楚。
问题如下:
①当在Inspector面板上勾上GameObject的active,但没有勾选脚本时的执行顺序是怎样
②当在Inspector面板上没有勾上GameObject的active,但勾选了脚本时的执行顺序是怎样
③当在Inspector面板上没有勾上GameObject的active,也没有勾选了脚本时的执行顺序是怎样
④当在Inspector面板上勾上了GameObject的active,也勾上了脚本时的执行顺序是怎样
解决这四个问题必须要知道,以下几条规则:
1.正常的脚本时执行顺序为Awake->OnEnable->Start->....->OnDisable->OnDestroy
2.OnDisable 当物体被销毁时 OnDisable将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。注意: OnDisable不能用于协同程序。
3.OnDestory 当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用。注意:OnDestroy也不能用于协同程序。
4.Awake和Start在一个游戏物体的生命周期中只调用一次,但是OnEnable会在每次激活脚本的时候再次执行。
所以,
关于第④个问题,执行顺序因为Awake->OnEnable->Start->....->OnDisable->OnDestroy。
关于第③个问题,不会有任何函数执行,当运行时勾上GameObject的active,Awake函数会立即调用,勾上GameObject的脚本后OnEnable和Start会接着被调用。
关于第②个问题,不会有任何函数执行,当运行时勾上GameObject时,Awake,OnEnable,Start会立即执行。
关于第①个问题,Awake会先执行,当运行时勾上GameObject的脚本时,OnEnable,Start会立即执行。
同时注意到汇总后的执行顺序如下
后台()
{
//脚本A
A-Awake();
A-OnEnable();
//脚本B
B-Awake();
B-OnEnable();
A-Start();//脚本A
B-Start();//脚本B
......
......
A-OnDisable();
B-OnDisable();
A-OnDestroy();
B-OnDestroy();
}
最后一张图说明一切