今有需求,需要在物体隐藏/显示的同时触发一些事件,经过查看API文档,发现GameObject并没有相关接口,但是脚本的基类MonoBehaviour里面有一下两个函数:
void OnEnable() // 脚本生效时触发
void OnDisable() // 脚本失效时被触发
我做了如下测试:
Test脚本挂载在一个cube下,Control脚本挂载在Main Camera下,并在编辑器中,把cube的赋给Control脚本中的public GameObject obj;
</pre><pre name="code" class="csharp">// Test.cs
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour
{
void Start ()
{
//DontDestroyOnLoad(gameObject);
}
void Update ()
{
}
void OnEnable()
{
Debug.Log("script was added " + Time.frameCount);
}
void OnDisable()
{
print("script was removed " + Time.frameCount);
}
}
// Control.cs
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class control : MonoBehaviour
{
public GameObject obj;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
if(Input.GetMouseButtonDown(0))
{
obj.SetActive(!obj.activeSelf);
Debug.Log("Controller : " + Time.frameCount);
}
if (Input.GetMouseButtonDown(1))
{
SceneManager.LoadScene(1);
}
}
}
运行时,Log日志如下图
测试证明:
1、OnEnable会在脚本从无效变成有效时被触发,包括第一次进入场景时也会被触发(如果初始设置为无效则不会);
2、OnDisable会在脚本从有效变成无效是被触发,包括退出场景时也会被触发;
3、上述两个消息的触发在gameObject的ActiveSelf被改变的同一帧执行完毕,所以完全满足 “在游戏对象在隐藏和显示时被触发”