最近在面试中遇到这样的问题,没有能够很好的回答,回来后经过试验和查验资料,发现一篇文章讲解的比较完整,直接搬过来翻译一下吧
原文地址:http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html
直接说说结果吧:
同一个脚本上的这四个方法在初始化时的执行顺序总是如下:
Awake()->OnEnable()->OnLevelWasLoaded()(仅在场景改变时)->Start();
但如果这个脚本.Enable=false;顺序就会变了:
OnLevelWasLoaded()(仅在场景改变时)会最先执行,然后是Awake(),而OnEnale()和Start()直到Enable=true时才执行;
对于不同的脚本的四类方法的执行顺序是交错的,假设我们声明一个特殊的自定义的顺序:A<B,那么执行顺序:
A.Awake()->A.OnEnable()->B.Awake()->B.OnEnable()->?.OnLevelWasLoaded()->?.OnLevelWasLoaded()->A.Start()->B.Start()
?表示无法确定谁先执行
?表示无法确定谁先执行
如果一个脚本是DontDestroyOnLoad(),则情况会更加复杂,执行顺序会如下,而自定义的顺序将不再遵守
Awake()仅在

博客介绍了Unity3d中Awake、OnEnable、Start、OnLevelWasLoaded等方法在初始化时的执行顺序。同一脚本内,顺序为Awake->OnEnable->OnLevelWasLoaded(场景变化时)->Start;如果脚本.Enable=false,OnLevelWasLoaded会先执行。不同脚本间这些方法的执行顺序交错。对于DontDestroyOnLoad的脚本,执行顺序有所不同,Awake和Start只在最初始状态执行一次。文章提醒,随着Unity版本更新,具体执行顺序需通过测试确认。

1257

被折叠的 条评论
为什么被折叠?



