見出し画像

Unityのコールバックの実装方法

Unityの「コールバック」の実装方法をまとめました。

・Unity 2018.4.17f1

1. Unityのコールバックの実装方法

Unityの「コールバック」の実装方法には、以下の4種類があります。

・delegate
・event
・System.Action / UnityAction
・UnityEvent

2. delegate

「delegate」は、コールバックを実装する標準的な方法です。「delegate」のコールバックの型の定義と変数の定義を行い、変数で関数を保持し、最後にInvoke()を呼ぶことでコールバックを呼び出すことができます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

// コールバックテスト
public class MyCallbackTest : MonoBehaviour {

    // スタート時に呼ばれる
    void Start () {
        MyProcess myProcess = new MyProcess();
        myProcess.CompleteHandler = MyCallbackMethod;
        myProcess.ExeMyProcess();
    }

    // コールバック時に呼ばれる
    public void MyCallbackMethod(string result) {
        Debug.Log("処理完了 : " + result);
    }
}

// 処理クラス
public class MyProcess {
    public delegate void OnCompleteDelegate(string result);
    public OnCompleteDelegate CompleteHandler;

    // 処理実行
    public void ExeMyProcess() {
        // 処理実行
        Debug.Log("処理実行");

        // コールバック実行
        CompleteHandler?.Invoke("成功");
    }
}
処理実行
処理完了 : 成功

メソッドはラムダ式で記述することも可能です。
(他のコールバック実装も同様)

myProcess.CompleteHandler = ((result) => {
    Debug.Log("処理完了 : " + result);
});

3. event

「event」は、delegateの修飾命令で、複数のコールバックを登録できるようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

// コールバックテスト
public class MyCallbackTest : MonoBehaviour {

    // スタート時に呼ばれる
    void Start () {
        MyProcess myProcess = new MyProcess();
        myProcess.CompleteHandler += MyCallbackMethod;
        myProcess.ExeMyProcess();
    }

    // コールバック時に呼ばれる
    public void MyCallbackMethod(string result) {
        Debug.Log("処理完了 : " + result);
    }
}

// 処理クラス
public class MyProcess {
    public delegate void OnCompleteDelegate(string result);
    public event OnCompleteDelegate CompleteHandler;

    // 処理実行
    public void ExeMyProcess() {
        // 処理実行
        Debug.Log("処理実行");

        // コールバック実行
        CompleteHandler?.Invoke("成功");
    }
}
処理実行
処理完了 : 成功

4. System.Action / UnityAction

「delegate」のコールバックの型の定義と変数の定義は、System.Actionを使うことで1行で記述することができます。「System.Action」の代わりに「UnityAction」も同様に使えます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

// コールバックテスト
public class MyCallbackTest : MonoBehaviour {

    // スタート時に呼ばれる
    void Start () {
        MyProcess myProcess = new MyProcess();
        myProcess.CompleteHandler += MyCallbackMethod;
        myProcess.ExeMyProcess();
    }

    // コールバック時に呼ばれる
    public void MyCallbackMethod(string result) {
        print("処理完了 : " + result);
    }
}

// 処理クラス
public class MyProcess {
    public event System.Action<string> CompleteHandler;

    // 処理実行
    public void ExeMyProcess() {
        // 処理実行
        Debug.Log("処理実行");

        // コールバック実行
        CompleteHandler?.Invoke("成功");
    }
}
処理実行
処理完了 : 成功

5. UnityEvent

「UnityEvent」は、delegateを修飾命令ではなく、単体で動作します。
登録されたメソッドをまとめて呼びだします。publicにすることで、Inspectorウィンドウで編集することもできます。

画像1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

// コールバックテスト
public class MyCallbackTest : MonoBehaviour {
    // UnityEventの定義
    UnityEvent unityEvent;

    // スタート時に呼ばれる
    void Start () {
        // UnityEventのテスト
        unityEvent = new UnityEvent();
        unityEvent.AddListener(MyInvokeMethod1);
        unityEvent.AddListener(MyInvokeMethod2);
        unityEvent.Invoke();
    }

    // Invoke時に呼ばれるメソッド1
    private void MyInvokeMethod1() {
        Debug.Log ("処理実行1");
    }

    // Invoke時に呼ばれるメソッド2
    private void MyInvokeMethod2() {
        Debug.Log ("処理実行2");
    }
}
処理実行1
処理実行2


この記事が気に入ったらサポートをしてみませんか?