kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

Unity C#でDelegate&Callbackを使う

かずまです。


今回はUnityのC#DelegateとCallbackを使って見たいと思います。

Delegateとは

簡単に言うと処理を渡して、その先で処理を実行するというもの。ゲームプログラミングでは重要みたいです。

デザインパターンとしてはObserver パターンになります。

使い方

  public class DelegateTest : MonoBehaviour {
     public delegate void Callback ();
     private Callback callback;
}

こんな感じ。
コレに関数を渡してあげるメソッドを準備します。

  public class DelegateTest : MonoBehaviour {
     public delegate void Callback ();
     private Callback callback;

     public void SetCallback (Callback _callback) {
		this.callback = _callback;
     }

     public void AddCallback (Callback _callback) {
		this.callback += _callback;
     }
}

Setは一つの関数のみ実行可能で、Addは登録された分を一気に実行可能です。

実際に使ってみる

今回はボタンの処理をさせて見ます。

f:id:kazumalab:20160927172648g:plain
*Defenseの文字が間違ってます。。。すみません笑

上の3つで切り替えて下のボタン一つでその関数を実行します。
前回の記事でUnityのUIボタンの処理をさせるのを書きましたが、今回はまた別の方法で処理を変えます。
kazumalab.hatenablog.com

下のボタンの中身はこの関数を設定しておきます。
f:id:kazumalab:20160927171329p:plain

コードは先程のに追記します。
ボタンで呼び出すのはClickButtonメソッドですね。


今度は上の3つのボタンを設定します。

以下のコードのClickAttack, ClickDefense, ClickDamageをボタンに設定します。

DelegateTestを読み込み、SetCallbackを呼びます。その引数としてセットしたいメソッドを入れてあげます。これでDelegateTest側でAttack, Defense, Damageが呼び出されます。

つまり、DelegateTest.csは追記せず、コードの処理を増やすことができます。
あとはタイミングも好きなタイミングでできるので今回はボタンのおした時にしてあります。

最後に

はじめはわからなかったのですが書いてみると結構便利だな、と実感しました。
いいですね。

追記

18/9/9
スコープを間違えていたのを修正しました。
コメントありがとうございました。