以下のクラスのSetFlag()が呼ばれた事を別のクラスから検知したい。
public class FlagManager : MonoBehaviour
{
public void SetFlag(bool b){
Debug.Log("Set " + b);
}
}
UnityEventを登録してInvokeする。
ついでに引数のboolもイベントリスナーに渡すようにしてみた。
public class FlagManager : MonoBehaviour
{
public UnityEvent<bool> OnSetFlag;
public void SetFlag(bool b){
Debug.Log("Set " + b);
OnSetFlag.Invoke(b);
}
}
イベント購読側のクラス
Awake()内に定義することでStart()より早くイベント購読できる。
一度呼ばれたら購読を破棄するようにしてみた。
public class EventListner : MonoBehaviour
{
FlagManager flag;
void Awake()){
flag = FindObjectOfType<FlagManager>();
flag.OnSetFlag.AddListener(OnEventInvoked);
}
void Start()){
flag.SetFlag(true);
}
void OnEventInvoked(bool b){
Debug.Log("Invoked " + b);
flag.OnSetFlag.RemoveListener(OnEventInvoked);
}
}
実行するとログに”Invoked true”と表示されるはず。
補足
C#のdelegateとかeventとかでやろうと思ったらなかなか難しくて躓いたけど
UnityEventだとめっちゃ楽に実装できた。