Unity常用API 05-脚本生命周期之OnEnable和OnDisable

1. 调用时机

1.1 OnEnable调用

   当游戏对象从非激活状态变为激活状态时,OnEnable 函数就会被调用。这会发生在多种情况下,比如在游戏开始时场景中的游戏对象被激活,或者通过代码将游戏对象的 SetActive (true) 方法调用后。

private void OnEnable()
{
    print("OnEnable调用");
}

   当开始运行游戏时,我们会发现控制台打印了这一条语句。因为默认情况下我们挂载的GameObject是被激活的状态,所以OnEnable会被调用,就像是Awake一样。
在这里插入图片描述
   但和Awake不同的是,Awake只能调用一次,但OnEnable可以调用很多次。每当GameObject或者脚本被激活的时候都会调用OnEnable。
在这里插入图片描述

1.2 OnDisable调用

   和OnEnable类似,可以看作OnEnable的逆操作,也就是说当脚本或者挂载的GameObject被禁用时会被调用,同样的也可以调用很多次。另外,当一个脚本从游戏对象上被移除时,也会调用 OnDisable。

private void OnDisable()
{
    print("OnDisable调用");
}

在这里插入图片描述

2. 功能用途

2.1 OnEnable功能

   可以用于重新初始化一些在游戏对象激活期间需要用到的变量或者状态。例如,重新启动一个计数器,或者重新初始化一个动画状态机。

private int counter;
void OnEnable()
{
    counter = 0;
}

   另外还常用于注册事件监听器。比如,在一个 UI 脚本中,当 UI 元素被激活时,可以在 OnEnable 中注册按钮点击事件的监听器。

public class UIController : MonoBehaviour
{
    void OnEnable()
    {
        Button myButton = GetComponentInChildren<Button>();
        myButton.onClick.AddListener(ButtonClicked);
    }
    void ButtonClicked()
    {
        // 按钮点击后的操作
    }
}

2.2 OnDisable功能

主要用于清理在 OnEnable 中注册的事件监听器等资源。例如,在前面提到的 UI 脚本中,当 UI 元素被禁用时,需要在 OnDisable 中移除按钮点击事件的监听器。

public class UIController : MonoBehaviour
{
    void OnDisable()
    {
        Button myButton = GetComponentInChildren<Button>();
        myButton.onClick.RemoveListener(ButtonClicked);
    }
    void ButtonClicked()
    {
        // 按钮点击后的操作
    }
}

3. 注意事项

  • 对于OnEnable而言,每次游戏对象激活都会调用 OnEnable,所以要注意其中代码的执行效率。并且,如果在 OnEnable 中进行了资源加载等操作,要确保在对应的 OnDisable 中进行资源释放,以避免资源泄漏。
  • 对于OnDisable而言,应该尽量简洁高效。并且,在处理事件监听器等资源时,要确保添加和移除的操作是配对的,避免出现内存泄漏或者意外的事件触发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值