cocos2dxやObjective-cなどにも存在する「デリゲート」をUnityもといC#で実装をしたいと思い、色々調べました。 主に、何かの処理が終わった時に呼び出して利用することができるのですが、これを自由に実装することができるようになれば表現の幅も広がります。
デリゲート
デリゲートで宣言されたメソッド名をクラスにして利用します。 参照する先のメソッドと同じ「引数」「戻り値」を付けます。 [c]
//引数(int)、戻り値(int) public delegate int ReturnValue(int value);
[/c]
デリゲートが参照するメソッド
デリゲートに合わせたメソッドを作成します。 [c]
public int ActionMethod(int value){
return value + 1;
}
[/c]
実際に利用する場合
利用する場合には、参照するメソッドをデリゲートのインスタンスで利用します。 [c] ReturnVale callTest = new CallBackTest(); int hoge = callTest.ActionMethod(5); Debug.Log("ReturnVale ActionMethod = " + hoge); //6
[/c]
静的メソッドでデリゲードを実装
これまではインスタンスをしたオブジェクトを利用していましたが、静的メソッドでもデリゲードは実装できます。 [c] //デリゲードの実装 public delegate int ReturnValue(int value);
public class CallBackTest {
public static int ActionMethod(int value){
return value + 1;
} }
//呼び出す側の実装 ReturnValue hoge = CallBackTest.ActionMethod; int addInt = hoge(5); Debug.Log("addInt = " + addInt); //6
[/c]
コールバック
コールバックを実装は以下のサイトを参考にしました。 Unity C# Callbackパターンの書き方 - Qiita [c]
public class CallBackTest {
//デリゲートを作成 public delegate void setFinishCallBack();
//呼び出されるメソッド public void setCallBack(setFinishCallBack callback){
Debug.Log("CALLBACK"); callback();
}
}
[/c]
コールバックを呼び出す実装。 インスタンスを作成して、コールバックを呼び出します。 [c]
CallBackTest callTest = new CallBackTest(); callTest.setCallBack(CallBackFinish);
public void CallBackFinish(){
Destroy(gameObject);
}
[/c]
解説
デリゲートで宣言されたメソッドに参照メソッドを引数で渡すことで、CallBackTestクラスで参照先のメソッドを呼び出すことができます。 [c] //デリゲードにメソッドの参照を渡しています。 _callTest.setCallBack(CallBackFinish);
//これをcallback();で呼び出しています。 callback();
[/c]
今回の例では、オブジェクトがDestroy()する前に、コールバックを使ってCallBackTestクラスのメソッドを呼び出しています。
最後に
色々と試した所、中々理解が難しいです。 cocos2dxでは、何かの処理が終わった時にコールバックを使う場合がほとんどでしたので、これをUnityでも実装ができれば便利だなと感じました。
Unity5 3Dゲーム開発講座 ユニティちゃんで作る本格アクションゲーム (Smart Game Developer) まつだす,BATA,㊥Maruchu,うにたじゃむお,栗坂こなべ,森理 麟,alwei 翔泳社 売り上げランキング : 27545 Amazonで詳しく見る |