メモ的な何か

任意のメソッドをUnityEventに対応させて呼び出された事を検知する

以下のクラスの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だとめっちゃ楽に実装できた。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です