对于未加入 Script Execution Order 的脚本,Unity 并不会给出固定的执行顺序,其行为是**不确定(Non-deterministic)**的,不能依赖它来保证初始化或逻辑的先后。
🎯 核心规则:Default Time 与"不确定"顺序
在 Script Execution Order 设置窗口中,所有没有显式加入列表的脚本,都默认属于 Default Time 这个执行组。-1
关于 Default Time 组内的脚本,官方文档有非常明确的定义:
当多个脚本拥有相同的配置顺序(包括默认顺序)时,它们之间的执行顺序是不确定的。 虽然这个顺序在测试时可能看起来一致,但你绝不能依赖 这种行为,因为它在不同构建、机器或 Unity 版本之间是没有保证的。-2-6
这意味着,所有未设置的脚本,它们的 Awake、OnEnable、Start 等方法之间的调用顺序是任意的。
⛓️ 生命周期内的"绝对顺序"依然成立
虽然脚本之间 的顺序不确定,但单个脚本内部 的生命周期方法是严格有序的。对于场景中加载的、所有激活的脚本,Unity 会保证:
所有脚本的 Awake 和 OnEnable 调用完毕后,才会开始调用任何脚本的 Start 。-18
因此,一个稳妥的初始化策略是:
-
在
Awake中设置脚本自身的引用(如GetComponent)。 -
在
Start中访问其他脚本设置的数据,因为此时所有Awake都已执行完毕。-18
📊 完整执行顺序概览
将显式设置的脚本与默认脚本放在一起,Unity 的完整执行顺序(针对 Awake、OnEnable、Update 等生命周期函数)如下:-1
| 执行顺序 | 脚本分组 | 说明 |
|---|---|---|
| 1 | 负数值脚本 | 在 Script Execution Order 中,数值为负(如 -200, -100)的脚本,数值越小越先执行。 |
| 2 | Default Time 脚本 |
所有未加入列表的脚本 。组内顺序不确定。 |
| 3 | 正数值脚本 | 数值为正(如 50, 100)的脚本,数值越小越先执行。 |
💡 如何主动控制执行顺序
如果你需要确保脚本间的执行先后,可以采用以下两种方式:
-
在代码中 :为 MonoBehaviour 类添加
[DefaultExecutionOrder(int order)]特性。-2 -
在编辑器中 :通过
Edit > Project Settings > Script Execution Order菜单,手动添加脚本并设置其顺序值。-1
注意 :如果同一个脚本同时在代码和项目设置中定义了顺序,Unity 会优先使用项目设置窗口中的值 。-2
⚠️ 重要限制:并非"万能顺序控制器"
Script Execution Order 的设置并不影响所有回调 。它主要作用于 Awake、OnEnable、Update 等生命周期函数。对于以下情况,它不保证 执行顺序:-6
-
使用
[RuntimeInitializeOnLoadMethod]标记的方法。-2 -
OnDestroy和OnDisable的调用顺序。-2 -
物理触发/碰撞回调,如
OnTriggerEnter、OnCollisionEnter等。
DEEP SEEK 生成