LoginSignup
22
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-06

コールバックの実装

やりたいことは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)
22
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
16