Menu
CoddyTech

OnEnable 和 OnDisable

本课属于 Coddy Unity 学习旅程的“Unity 脚本基础”单元。第 72 课,共 85 课。

OnEnable() 会在脚本每次变为活动状态时运行:对象首次出现时(紧接在 Awake() 之后),以及每次通过 SetActive(true) 显示对象,或通过 enabled = true 重新启用脚本时。每次隐藏对象、关闭脚本或销毁对象时,都会运行 OnDisable()。

其他脚本通过 SetActive 打开和关闭的传送门,可以报告自身状态:

void OnEnable()
{
    Debug.Log("Portal open");
}

void OnDisable()
{
    Debug.Log("Portal closed");
}

场景开始时,传送门会记录 Portal open。隐藏后再次显示时,会依次记录 Portal closed 和 Portal open,而 Awake() 和 Start() 不会再次运行。因此,每次出现时都必须执行的代码,例如重置计时器或统计访问次数,应放在 OnEnable() 中。传送门隐藏时,它的 Update() 不会运行,这就是为什么要由另一个对象上的脚本来打开和关闭它。

challenge icon

挑战

中等

让每个 Switchable 在启用和停用时都进行报告。

  1. 添加一个 int count; 字段和 void OnEnable():将 count 加 1,然后记录 name + " on (" + count + ")",例如 Bubble on (2)。
  2. 添加 void OnDisable(),记录 name + " off"。

按“运行”并按下 Space:控制台会显示 Player on (1),然后显示 Bubble on (1) 和 Bubble off。接着点击“检查”。

亲手试试

using UnityEngine;

public class Switchable : MonoBehaviour
{
    public GameObject target;

    void Update()
    {
        if (target != null && Input.GetKeyDown(KeyCode.Space))
        {
            target.SetActive(!target.activeSelf);
        }
    }

    // 每次打开这个对象时:计数加 1,并记录 "<name> on (<count>)"
    // 每次关闭这个对象时:记录 "<name> off"
}

Unity 脚本基础中的所有课

自己练习: Unity 在线编辑器