Delegate。はっきり言ってよくわからん。
でもなんだか便利らしいぞ。
この程度の認識の私が勉強した事を備忘的にまとめていくぞ!
Delegateとは
知識ゼロの私でもなんとなく理解できそうな言い方をすると、Delegateとは関数を入れられる変数です。
宣言の方法はメソッドと似ていて
public delegate void Delegate();
こんな感じです。
ちなみに上の例では戻り値の無いvoid型ですが、Delegeteの型は返り値と同じ型にする必要があります。
- void型のDelegateに代入できるメソッドはvoid型のみ
- int型 のDelegateに代入できるメソッドは int型のみ
Delegateの使い所
基本的な使い方としては非同期処理と言って「○秒後にこのメソッドを実行してね」みたいな感じで使うようです。(今回は説明しません)
そして、色々調べるうちに私が気になったのがこちらの動画。
みんな大好きUnityの安原さんの動画:https://www.youtube.com/watch?v=HwD7npYb9_k
Switch文の引数によって呼び出す関数を分けようと思ってゴチャゴチャっとなってしまった物も、Delegateを使うとメソッドを配列に入れておくだけで、こう言う感じで呼び出せるようになる訳ですよ。
YOUTUBE の UnityJapanチャンネル:「プッシュとプル – プロなら当然!プログラミング 技能解説 #3」
言い回しが少し違うかもしれませんが、Delegateを使うとこんなスッキリ書く事ができるらしい!
ただ、この動画では詳しい内容には触れていません。
そこで、独学ペラペラのペーパープログラマーの私が、私なりにコードを書いて実装してみました!
Switch文っぽくデリゲートにメソッドを入れてみた
最終的な関係図はこんな感じです。
Delegate側クラスのコンストラクタで配列にメソッドを代入しています。
こんなんでパンチとか波動拳とかできるか実験します。
まずはDelegateを実装したClass(スクリプト)の作成
これが呼び出される側のスクリプト。
つまりDelegateを実装しているクラスだぞ。
ちなみに何となく、MonoBehaviourは継承していないぞ。
そして、どのオブジェクトにもアタッチしていないぞ。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestDelegateFunc
{
public delegate void Del_Func();
public Del_Func[] del_Func;
public TestDelegateFunc() // コンストラクタでメソッドを配列に代入する
{
del_Func = new Del_Func[] {Punch, Kick, Hadouken, };
}
void Punch() { Debug.Log(" パンチ "); }
void Kick() { Debug.Log(" キック "); }
void Hadouken() { Debug.Log(" 波動拳 "); }
- Delegate型の配列を宣言
- コンストラクタでこのクラスが作成された時点でメソッドを配列に代入する
- 代入するメソッドは3つとも全然違う処理がされる事を想定。
呼び出す側のスクリプトを作成
こっちが呼び出す側のスRunクリプト
ちなみにMonoBehaviourを継承しているいつものクラスにして、こんな感じでにRunObj(空のオブジェクト)にアタッチしたぞ!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Run : MonoBehaviour
{
void Start()
{
TestDelegateFunc testDelegateFunc = new TestDelegateFunc();
int n = 0;
testDelegateFunc.del_Func[n]();
}
}
引数(int n )が0だった場合、パンチの処理が実行されました。
引数を2にした場合も「波動拳」の処理が実行されました。
成功です!!引数によって全然違う関数を呼び出す事に成功しました!!
Unityの安原さんが動画で言っていた事は、これで正しいかは不明ですがそれなりに動きました。
今回の記事が、「全然ピントが合ってないよ」ってぜひ場合は教えてください。
コメント