
C#(Unity)関数オブジェクト再入門
コード書いとる?
C#(Unity)で関数オブジェクトを使おうとするとデリゲートとかの話が出てきてよくわからん!と思ったので自分向けのメモ書き。ここはnote
関数オブジェクトとは
変数に関数を代入できる仕組みです。普段C++を使っているので間違ってたらすいません。
int a = 0; // 値を代入
void Func() {}
Action b = Func; // 関数を代入
b.Invoke(); // 関数呼び出し
デリゲートとかの説明はすっ飛ばします。混乱するので!
これの何が便利かっていうと、変数に入っている関数を取っ替え引っ替えできるということに尽きます。
void AAAA() {}
void BBBB() {}
Action f = AAAA;
f.Invoke(); // AAAAが呼ばれる
f = BBBB;
f.Invoke(); // BBBBが呼ばれる
引数がある場合はこうします
void AAAA(int a) {}
Action<int> f = AAAA;
f.Invoke(1); // AAAA(1)
ラムダ式が使えるのもめちゃ便利。関数定義書くのめんどいので!
Action f = () => { /* すごい処理 */ };
f.Invoke();
f = () => { /* もっとすごい処理 */ };
f.Invoke();
悩みがちな事
で!Unityを使ってると関数オブジェクトの選択肢がたくさんあるので困るんです。どれ使えばいいんだ?
Action // C#純正
Func // C#純正
UnityAction // Unity謹製
UnityEvent // Unity謹製
Action
戻り値のない関数が対象
void Func(int a) {}
Action<int> f = Func;
f.Invoke(1); // Func(1)
Func
戻り値のある関数が対象
bool Func() { return true; }
Func<bool> f = Func;
var result = f.Invoke(); // result = Func();
UnityAction
戻り値のない関数が対象(Actionと同等)
UnityEvent
戻り値のない関数が対象(Actionと同等)
・UnityEditorのインスペクタで編集可能
とりあえずこれだけ押さえておけば概ね問題ないと思います! C#初心者なので!
スッキリ!