UnityでCallbackを行う Part2
かずまです。
久しぶりに更新します。
ちなみに11月ですね!
なんと11/28は僕の誕生日です!
よっ!!ぱちぱち〜。
なので、Amazonのほしいものリストを公開しました!
就活も終わったり、卒業論文との格闘始まったり、するので物産を恵んでいただけるとめっちゃ嬉しいです!
本もほしい!特にEffective C#!
さてさて、本題へ。
UnityでCallback
これは前回の記事を見ていただくといいかと思います。
blog.kazumalab.com
ラムダ式を使う場合などは
kan-kikuchi.hatenablog.com
こことか参考になります。
基本的に何かの処理が終わったあとに実行したいメソッドを渡しておくと実行される!みたいな便利なものです。
SendMesageよりもこっちがいいかな、って個人的には思ってます。
今回、コードを書いててふと思ったことをメモ、検証しておきます。
検証コード
namespace CallbackTest { public class SuperManager : MonoBehaviour { public TestController TController; void Awake () { TController.SetCallback (Func); } public virtual void Func () { print ("From Super Class"); } } }
サブクラス
namespace CallbackTest { public class SubManager : SuperManager { public override void Func () { print ("From Sub Class"); } } }
呼び出すコントローラー
public class TestController : MonoBehaviour { public delegate void Callback(); private Callback callback; private void Update () { if (Input.GetMouseButton(0)) { this.callback(); } } public void SetCallback (Callback c) { this.callback = c; } }
気持ち
やっぱりCallbackを使うとオブジェクト同士が分離して書くことができるのでいいですね。
結果
Awakeが呼ばれるか?
呼ばれてました!
どっちが呼ばれるの?
サブクラスでオーバーライドしたものが呼ばれてます。
また疑問
- スーパークラスにもAwake書いて、サブクラスにもAwake書いたらどっちも呼ばれる?
検証コード
// Super Class Awake Method. void Awake () { print ("Awake From Super Class"); TController.SetCallback (Func); }
// Sub Class Awake Method. void Awake () { print ("Awake From Sub Class"); TController.SetCallback (Func); }
中身は同じですが、printでどっちから呼ばれたかを確認します。
結果
Subクラスから呼ばれた!
ってことは間違えてスーパークラスのAwakeにセットするコード書いてて、
サブクラスでは全く違うコード書いてたらdelegateには何も登録されてないことになっちゃう?
試しにサブクラスのSetCallbackをコメントアウトしてみます。
!!!
ちゃんとNullが返ってくる!
忘れちゃってAwakeに違う処理書いちゃうのはバグの元ですね。