Unity脚本执行顺序疑问:未改配置下Awake函数执行顺序求助
用户问题:

在Unity中,我对多个类中Awake()函数的执行顺序感到好奇,于是打印日志得到了上图结果。结果显示,创建时间更早、编号更小的脚本反而更晚执行,但我不清楚其中的原理和原因……能否为我解答相关疑问或提供官方文档说明?
注:我未修改Script Execution Order配置。
测试代码:
public class TEST1 : MonoBehaviour { private void Awake() { Debug.Log("TEST1"); } } public class TEST2 : MonoBehaviour { private void Awake() { Debug.Log("TEST2"); } } public class TEST3 : MonoBehaviour { private void Awake() { Debug.Log("TEST3"); } }
解答:
当未修改Script Execution Order(脚本执行顺序)配置时,Unity的Awake()函数执行顺序遵循以下核心规则:
- GameObject层级优先级:挂载脚本的GameObject在场景层级面板中的排列顺序是最关键的影响因素。Unity会从上到下遍历层级面板中的激活状态GameObject,依次调用其身上所有脚本的
Awake()方法。如果你的TEST3对应的GameObject在层级最顶部,TEST2次之,TEST1在最底部,就会出现TEST3→TEST2→TEST1的执行顺序,这和脚本的创建时间完全无关。 - 同一GameObject上的脚本顺序:若多个脚本挂载在同一个GameObject上,执行顺序由它们在Inspector面板中的排列顺序决定——从上到下依次执行。你可以通过拖拽调整Inspector中脚本的位置来改变这个顺序。
- 编译与类名顺序(次要):当上述两个条件都完全相同时,Unity会根据脚本类名的字母顺序(A-Z)来决定执行顺序。但这个规则不建议依赖,因为脚本所在的编译组变化可能会改变这个顺序。
另外需要明确:Awake()的执行时机是脚本实例被加载时,也就是GameObject被激活(或场景加载时GameObject已处于激活状态)的时刻。如果是运行时动态创建的GameObject,它们的Awake()会在创建完成后立即执行,顺序与创建顺序一致。
你的测试结果中编号更小的脚本执行更晚,大概率是对应GameObject在层级面板中的位置更靠下,或是在同一GameObject上的脚本排列顺序更靠后,和脚本创建时间没有直接关联。
内容的提问来源于stack exchange,提问作者JunYoung Yoon
相关产品推荐
相关产品推荐

