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() 不会运行,这就是为什么要由另一个对象上的脚本来打开和关闭它。
挑战
中等让每个 Switchable 在启用和停用时都进行报告。
- 添加一个
int count;字段和void OnEnable():将count加 1,然后记录name + " on (" + count + ")",例如Bubble on (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 在线编辑器