You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

用户问题:

My test result

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:50:18