【Unity入门】脚本生命周期简介及MonoBehaviour常用方法

本文详细介绍了Unity中MonoBehaviour脚本的生命周期过程,包括Awake、Start、Update、FixedUpdate、LateUpdate、OnEnable、OnDisable、OnDestroy等方法的执行顺序及用途。

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

一、脚本生命周期简介

脚本作为我们游戏的“灵魂”,往往不单独存在,而是经常作为组件的形式挂载到特定的游戏物体身上,比如: 游戏主角,敌人,Boss,子弹,建筑物…脚本的生命周期,也就是所挂载到的游戏物体的生命周期脚本的生命周期,就是挂载到的游戏物体“从出生到死亡”,所经历的一些事件。这些生命周期事件,是一些特定的方法,且是由 Unity 引擎事先定义好的,在游戏的运行过程中,由引擎自动调用。这些生命周期事件,全部定义的 MonoBehaviour 这个类中。也就意味着只有继承自这个类的脚本,才有这些生命周期事件。

二、MonoBehaviour常用方法

  1. Awake()
    当脚本被加载后立即调用Awake方法,这个方法通常在Start()开始之前声明某些变量或者游戏的状态标记符。同样,Awake也是在MonoBehaviour声明周期内被调用一次。Awake在所有的对象(个人认为是GameObject)实例化后被调用,因此绑定这个脚本的对象能与其他对象之间相互作用,例如,同过GameObjectFindWithTag方法查找其他对象。

  2. OnEnable()
    启用事件,每当组件启用时执行。项目运行时,紧跟在Awake函数后面执行。
    在这里插入图片描述

  3. Start()
    在Update方法被调用之前开始调用Start方法,而且Start方法在整个MonoBehaviour生命周期内只被调用一次。Awake和Start不同的地方在于Start方法仅仅在脚本初始化后被调用,这样允许你延迟加载任何代码,直到代码真正被使用时。Awake方法总是在Start方法执行之前被调用,这样允许你初始化脚本代码。

  4. FixedUpdate()
    按固定时间间隔进行更新,可自定义间隔。可以在Edit -> ProjectSetting -> time -> Fixedtimestep中设置。所以,FixedUpate每秒调用次数是一定的,但每帧调用的次数不是一定的,因游戏中每帧时间不一样。
    timeScale =0 时将不会调用FixedUpdate函数,Update和LateUpdate函数本身的执行是不会受Time.timeScale的影响。
    在这里插入图片描述

当处理Rigdibody时FixedUpdate()应该代替Update()方法,比如,当一个物体需要增加一个力时,应该将这个力的代码写在FixedUpdate()里面。

void FixedUpdate() {
	rigidbody.AddForce(Vector3.up);
}
  1. Update()
    在Start方法执行过后,游戏的每一帧都在调用此方法。

  2. LateUpdate()
    每一帧都在调用此方法。当每一帧的Update方法全部执行完后,此方法开始被调用。举个例子来说吧,当一个角色移动而摄像机也要跟着移动时,摄像机的处理就应该在LateUpdate()里面了。

  3. OnGUI()
    GUI渲染事件,执行N此,执行的次数是Update()事件的两倍。OnGUI()在每一帧被调用数次(several times),假如MonoBehaviour的enabled属性设置为false时,OnGUI()就失去作用了。

  4. OnDisable()
    禁用事件,每当组件禁用时执行。
    在这里插入图片描述

  5. OnDestory()
    销毁事件,执行一次。当脚本所挂载的游戏物体被销毁时执行。

  6. DontDestroyOnLoad()
    游戏中的常驻节点:进入另一个场景时,保证绑定此脚本的对象的内存不被释放掉。也就是说绑定此脚本的GameObject在下一个场景中依然存在。使用方式:在其脚本的 Awake() 方法中添加此代码 DontDestroyOnLoad(transform.gameObject); 即可。

三、执行顺序

Awake——>OnEnable––>Start——>FixedUpdate——>Update——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy

若开启禁用的脚本的执行顺序,先执行OnEnable,再执行Start,此时禁用脚本后再启用,Start不会执行,因为只执行一次。
已禁用的脚本,其消息函数Start、Update不会被调用,Awake会被调用。
不同组件的执行顺序:先全部执行每一个组件的Awake,再执行每一个Start。

四、AddComponent

对于AddComponent添加的脚本,其Awake,Start,OnEnable是在Add的当前帧被调用的,其中Awake,OnEnable与AddComponent处于同一调用链上,Start会在当前帧稍晚一些的时候被调用,Update则是根据Add调用时机决定何时调用:如果Add是在当前帧的Update前调用,那么新脚本的Update也会在当前帧被调用,否则会被延迟到下一帧调用。关于Unity在运行时使用AddComponent添加脚本后,新脚本的生命周期执行时机探究

### 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
发出的红包

打赏作者

KeepJian

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

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

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

打赏作者

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

抵扣说明:

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

余额充值