網上查了一下Unity的SetActive變化事件沒有找到,我想到用另一種思路來實現這個事件通知,它可用來調試是何處把某個gameobject隱藏掉了
Unity提供了這兩個函數,OnEnable,OnDisable,當SetActive時會調用這兩個函數,所在這兩個函數中發出事件就可以實現想要的效果。
用法:新建一個腳本掛在你需要監聽變化的gameobject上,代碼如下
using UnityEngine;
using System;
/// <summary>
/// 把此MonoBehaviour掛在你需要監聽的gameobject上
/// </summary>
public class MonBehaviourEvent : MonoBehaviour
{
/// <summary>
/// gameobject的SetActive事件變化通知
/// </summary>
public Action<bool> OnActiveChange;
void OnEnable()
{
OnActiveChange?.Invoke(true);
}
void OnDisable()
{
OnActiveChange?.Invoke(false);
}
}
擴展SetActive
SetActive(true),會觸發MonoBehaviour.OnEnable()事件,就算對象之前本就是activeSelf=true,事件依然會發生;
SetActive(false),會觸發MonoBehaviour.OnDisable()事件,就算對象之前本就是activeSelf=false,事件依然會發生;
所以在調用SetActive之前需要進行判斷,擴展了如下,對於
public static class GameObjectEx
{
public static void SetActiveX(this GameObject go, bool state)
{
if (go && go.activeSelf != state)
{
go.SetActive(state);
}
}
public static void SetActive(this Component go, bool state)
{
if (go && go.gameObject && go.gameObject.activeSelf != state)
{
go.gameObject.SetActive(state);
}
}
}