delegateでコールバックっぽい実装【Unity, C#】

  • 15
    Like
  • 0
    Comment
More than 1 year has passed since last update.

コールバックの実装

やりたいことはDipatcherクラスにメソッドを外部から登録して、Dispatcher自身で登録されたメソッドを呼び出すというイベントっぽい感じのことをやりたかったので、メモ。

delegate

C#にはdelegate修飾子が存在します。(まだ完全に理解したわけではありません)
このdelegate修飾子をつけるとdelegateの型として宣言できます。

Dispatcher

  • コールバックメソッドを外部から登録できる
  • 任意のタイミングでコールバックを呼び出す(今回は100フレーム経過後にコールバックを呼び出します)
Dispatcher.cs
public class Dispatcher : MonoBehaviour {
    // delegateの宣言
    public delegate void MyCallback(string msg);
    // メソッドを格納する変数
    private MyCallback callbacks;
    // フレームカウンタ
    private int frame = 0;

    void Update () {
        // 100フレーム経過すれば登録されているメソッドを呼び出す
        if (frame == 100 && callbacks != null) // nullチェックを忘れずに
            callbacks ("dispatch");
        frame++;
    }

    public void addCallback(MyCallback callback) {
        // コールバックを登録します
        callbacks += callback;
    }
}

Listener

  • Dispatcherオブジェクトを知っている
  • 自身のメソッドをコールバックとして登録する
Listener.cs
public class Listener : MonoBehaviour {

    void Start () {
    // 今回はGameObjectにDispatcherスクリプトをアタッチしたので、Dispatcherオブジェクトを取得してきます
        GameObject
            .Find ("Dispatcher")
            .GetComponent<Dispatcher> ()
            .addCallback (temp);    // コールバックの追加
    }

    public void temp(string msg) {
        Debug.Log("on callback : " + msg);
    }
}

出力結果

100フレーム経過後に以下が出力されます。

on callback : dispatch
UnityEngine.Debug:Log(Object)