Appearance
生命周期函数

Unity 中生命周期函数的赋值顺序(从脚本实例化到第一帧更新):
Awake
脚本实例被加载时立即调用(无论组件是否启用)。
用途:初始化不依赖其他脚本的字段或状态。OnEnable
当脚本组件被启用或对象激活时调用。
可能发生在 Awake 之后、Start 之前,每次激活都会重复。Start
在脚本启用且在第一帧更新前调用,仅执行一次。
用途:访问其他已初始化的组件或进行跨脚本赋值。FixedUpdate
按固定时间间隔(默认 0.02 s)调用,与物理更新同步。
用途:处理 Rigidbody 等物理相关赋值。Update
每帧调用一次,时间间隔不固定。
用途:处理常规逻辑赋值。LateUpdate
每帧在 Update 之后调用。
用途:在 Update 赋值完成后,再做跟随、相机等最终赋值。OnDisable
当脚本组件被禁用或对象失活时调用。
可在此清理或保存临时赋值。OnDestroy
脚本或游戏对象被销毁时调用。
用途:释放资源、解除事件注册等最终赋值。OnApplicationQuit
当应用程序即将退出时调用(包括编辑器中停止播放模式)。
用途:执行应用程序级别的清理工作,如保存游戏数据、关闭网络连接、释放全局资源等。
注意:
- 同一生命周期函数在不同脚本之间的执行顺序可通过 Script Execution Order 设置调整。
- 不要在 Awake 里访问其他尚未 Awake 的脚本;若必须跨脚本赋值,放在 Start 更安全。
检视面板与脚本赋值顺序
在 Unity 中,检视面板(Inspector)中的赋值与脚本内的赋值执行顺序如下:
执行顺序
- 检视面板赋值:在脚本实例化时自动完成(序列化值的加载)
- Awake:脚本实例被加载时调用,此时可访问并修改检视面板中的值
- OnEnable:组件启用时调用
- Start:第一帧更新前调用,可进行依赖其他脚本的赋值
注意事项
- 检视面板中的值是序列化的,会在对象创建时自动应用
- 在 Awake 中可以覆盖检视面板中的值,这些修改会在游戏运行时生效
- 在 Start 中也可以修改检视面板中的值,但此时所有脚本的 Awake 都已执行
- 若在脚本中定义了默认值,检视面板中的值会覆盖这些默认值
多脚本执行顺序
在 Unity 中,多脚本之间的生命周期函数执行顺序遵循以下规则:
1. 默认执行顺序
- 同一游戏对象上的多个脚本,其生命周期函数的执行顺序默认是不确定的(取决于脚本添加顺序等因素)
- 不同游戏对象之间的脚本执行顺序同样不确定
2. 可调整的执行顺序
- 可通过 Script Execution Order 设置来精确控制不同脚本的执行顺序
- 此设置位于:Edit → Project Settings → Script Execution Order
3. 生命周期函数间的顺序关系
- 所有脚本的 Awake 会在 Start 之前执行
- 所有脚本的 Start 会在第一帧 Update 之前执行
- 同一帧内,所有脚本的 Update 会在 LateUpdate 之前执行
4. 跨脚本赋值的最佳实践
- 避免在 Awake 中访问其他脚本,因为无法保证其他脚本是否已初始化
- 跨脚本的赋值操作建议放在 Start 中执行,此时所有脚本的 Awake 都已完成
- 对于需要精确控制的场景,使用 Script Execution Order 明确指定执行顺序
5. 组件启用/禁用的影响
- OnEnable 和 OnDisable 会在组件状态变化时触发,不受其他脚本执行顺序影响
- 即使脚本被禁用,其 Awake 仍会执行(但 Start 不会)