Unity的GameObject生命周期

本文详细介绍了Unity引擎中MonoBehaviour脚本的不同生命周期方法,如Awake、OnEnable、Start等,以及脚本在不同状态下的执行顺序。通过实例测试展示了脚本的启用、禁用和销毁过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 也就是MonoBehaviour脚本的生命周期。
  • Awake:游戏脚本被实例化后立即调用,只会在游戏对象被实例化时调用一次。        

        用于初始化一些全局变量或者在游戏对象被实例化时进行一些设置。

  • OnEnable:当游戏对象变为可用或者激活状态时被调用。

        用于事件监听。

  • Start:在每个游戏对象被激活时调用一次,函数第一次运行前调用

        用于初始化一些游戏运行时动态获取的组件或者资源。

  • FixedUpdate:每隔固定物理事件调用一次。

        用于物理状态的更新,更符合现实世界的运行行为。

  • Update:每帧调用一次。

        用于更新游戏场景和状态。

  • LateUpdate:每帧调用一次,在Update之后调用。

        用于更新游戏场景和状态,以及摄像机相关的更新。

  • OnGUI:渲染和处理OnGUI事件。
  • OnDisable:当对象变为不可用或非激活状态时被调用。事件移除。
  • OnDestroy:当对象被销毁时调用。 
2. 一个游戏脚本运行测试
  • 游戏脚本激活状态运行

  • 此运行时将脚本改为非激活状态:执行OnDisable

  •  该运行状态下 再次激活脚本:将会执行一次OnEnable,随后FixedUpdate、Update、LateUpdate、OnGUI正常执行。

  •  销毁游戏脚本

  • 在游戏脚本未激活状态时 第一次运行:只执行Awark

  • 该运行状态下 激活游戏脚本:从OnEnable、Start生命周期开始执行

3. 多个游戏脚本运行执行顺序 

绑定脚本顺序:先绑定Mono、再绑定Mono1、最后绑定Mono2

执行顺序:Mono2、Mono1、Mono

由此可见:最后绑定的脚本先执行。(调整绑定脚本顺序也是如此)

### Unity 中脚本的生命周期解释 #### 初始化阶段 Awake 函数会在对象实例化时立即被调用,这通常用于初始化变量或其他组件之间的连接。此函数在整个生命周期内仅执行一次[^4]。 OnEnable 方法会在 MonoBehaviour 被设置为启用状态时触发,无论是启动场景还是重新激活已停用的对象都会引起该事件的发生。这意味着它可以被执行多次,只要脚本的状态从禁用变为启用就会发生。 Start 是一种特殊的方法,在第一次帧更新之前会被调用,并且只会在脚本处于活动状态下才会运行;如果 GameObject 不活跃,则不会调用 Start[]^4]。 #### 更新循环 FixedUpdate 主要针对物理计算而设计,按照固定的间隔时间(默认每秒50次)来处理与物理学有关的操作,比如移动刚体或应用力矩等操作。 Update 是最常用的一个回调方法之一,它会随着每一帧渲染周期同步地被反复调用,适用于大多数常规的游戏逻辑控制,如输入检测、动画播放以及简单的变换管理等任务。 LateUpdate 同样遵循着逐帧调用的原则,不过它的特别之处在于总是位于同一帧内的所有 Update 完成之后才开始工作,常用来修正由其他脚本引起的视觉变化或是摄像机跟随目标等功能。 #### 销毁阶段 OnDisable 当MonoBehaviour不再有效的时候将会发出信号,即当GameObject上的这个组件失活或者是整个实体本身失去活力的情况下会发生这样的情况。 OnDestroy 则是在游戏对象即将永久消失前一刻得到通知的机会,可以利用这段时间来进行资源清理或者其他必要的收尾动作,例如停止协程或者释放外部链接等等。 ```csharp using UnityEngine; public class LifecycleExample : MonoBehaviour { private void Awake() { Debug.Log("Awake called"); } private void OnEnable() { Debug.Log("OnEnable called"); } private void Start() { Debug.Log("Start called"); } private void FixedUpdate() { Debug.Log("FixedUpdate called"); } private void Update() { Debug.Log("Update called"); } private void LateUpdate() { Debug.Log("LateUpdate called"); } private void OnDisable() { Debug.Log("OnDisable called"); } private void OnDestroy() { Debug.Log("OnDestroy called"); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏轼轼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值