
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ウィンドウで編集することもできます。
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
この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
気軽にクリエイターの支援と、記事のオススメができます!