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而言,应该尽量简洁高效。并且,在处理事件监听器等资源时,要确保添加和移除的操作是配对的,避免出现内存泄漏或者意外的事件触发。


4929

被折叠的 条评论
为什么被折叠?



