網上查了一下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);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/27787.html
標籤:其他
