種類
コールバックは「ファイルのダウンロードが完了するまで処理を止めたい」などの場合によく使われる手法です。
今回はUnityで扱えるコールバックを
- UnityAction
- UnityEvent
- delegate
の3つに分けて、それぞれの記述方法をまとめました。
UnityAction
引数は持てないがシンプルにコールバックが実装できる。
挙動はSystem.Actionと同じです(たぶん)
// 追加
using UnityEngine.Events;
↑忘れずに。
void Start () {
// 処理を実行するメソッドにコールバックを受け取りたいメソッドを渡す
ActionMethod (ActionCallbackMethod);
// ラムダ式UnityAction
ActionMethod (() => {
Debug.Log("ラムダ式UnityAction実行完了 : "+testVal);
});
}
// 実行メソッド
private void ActionMethod (UnityAction callback) {
// コールバック実行
callback ();
}
// UnityActionのコールバックで呼び出されるメソッド
public void ActionCallbackMethod () {
Debug.Log ("UnityAction実行完了");
}
delegate
引数付きのコールバックを実装したいときはこれ。
自分で引数付きの型を作り、その型を使ってコールバック用の変数を宣言する。
delegate型の宣言をする。
// delegate型の宣言
private delegate void OnComplete (string text);
void Start () {
// 処理を実行するメソッドにコールバックを受け取りたいメソッドを渡す
DelegateMethod (DelegateCallbackMethod);
// ラムダ式delegate
DelegateMethod ((string text) => {
Debug.Log ("ラムダ式delegate実行完了 : " + text);
});
}
// 実行メソッド
private void DelegateMethod (OnComplete callback) {
// コールバック実行
callback ("文字列だよ");
}
// delegateのコールバックで呼び出されるメソッド
public void DelegateCallbackMethod (string text) {
Debug.Log ("delegate実行完了 : "+text);
}
UnityEvent
メソッドを複数登録できるので実行対象が多い場合に有効。
登録したメソッドを呼び出すにはInvoke()を使う。
Invoke()を使うと登録したメソッドが一斉に実行される。
Inspector上でもメソッドの登録ができるのがキモ。
// 追加
using UnityEngine.Events;
UnityEventはインスタンスの生成を忘れずに。
private UnityEvent unityEvent;
void Start () {
// インスタンスを生成
if (unityEvent == null)
unityEvent = new UnityEvent ();
// Invoke()で実行させるメソッドを登録する
unityEvent.AddListener (UnityEventCallbackMethod_1);
unityEvent.AddListener (UnityEventCallbackMethod_2);
// 登録されたメソッドを一斉に実行する
unityEvent.Invoke();
}
// Invoke時に実行されるメソッド1
private void UnityEventCallbackMethod_1 () {
Debug.Log ("UnityEvent実行完了 その1");
}
// Invoke時に実行されるメソッド2
private void UnityEventCallbackMethod_2 () {
Debug.Log ("UnityEvent実行完了 その2");
}
以上
GitHubに上記をまとめたプロジェクト置いておきました。
GitHub - UnityCallbackSample