短編RPG制作(Unity2D)【第66回】勉強:デリゲート(コールバック)


コールバック

UnityEvent

第51回にて、「UnityEvent」を用いたコールバックを実装しました。
思い出しがてら、構文をもう一度書いておきます。

構文

呼び出されるクラス「Manager」(関数を記述するクラス)

class Manager()
{
    private Enemy _enemy // 参照取得

    private void Start()
    {
        _enemy.onChildDestroy.AddListener(Result); // コールバックの設定
    }

    // Invoke時に実行されるメソッド
    private void Result() {
    }
}

呼び出すクラス「Child」

using UnityEngine.Events;

class Child()
{
    // インスタンス(関数の入れ物)生成
    private UnityEvent onChildDestroy = new UnityEvent();

    private void OnDestroy()
    {
        onChildDestroy.Invoke(); // オブジェクト消滅時の処理を呼び出し
    }
}

「Child」側で宣言し、「Manager」(親クラス)で中身を指定することで、依存性を逆転させることができるのがコールバック関数でした。
「UnityEvent」は簡単に実装できますが、引数を取ることができません。今回は、押された番号の通し番号を親クラスに通知したいため、引数を取れる形でコールバックを行う必要があります。

それを実現できるのがデリゲート(らしい)です。

Delegate

delegateは、変数定義の際に用いる型の一種です。(intとかstringと同類)
delegate型は、「関数を入れられる変数」を定義できます。

型名・型の定義

アクセス修飾子 delegate 返り値の型 delegateの型名(引数)

例えば以下のような形で、delegateの型を定義できます。

public delegate void DelegateType(int x)

型を利用したdelegateの定義

定義が完了したら、次はdelegateの型を利用してdelegateを定義します。

アクセス修飾子 delegateの型 delegate

例えば以下のような形です。

public DelegateType del

つまり、宣言には2行必要となります。
delegateの名前を宣言した後は、delに関数を代入します。
代入する関数をMethod、特定のint型変数をyとして、以下に必要な記述の例をまとめました。

public delegate void DelegateType(int x);
public DelegateType del;
del = Method;
del(y);

頭の中が完全に整理できていませんが、

  1. 親クラスで呼び出したい関数を宣言

  2. 子クラスでデリゲート型とデリゲート名を宣言

  3. 親クラスから、子クラスのデリゲート名に呼び出したい関数を登録

  4. 子クラスで必要となった際に関数を呼び出し

UnityEventと同じ感覚で使えるのならこういう感じだと思います。
早速実装してみようと思います。

……あらかた書き終わりはしたのですが、参照を取得する部分でエラーが起きてうまく動かない……

全然解決しないので明日に持ち越します。

この記事が気に入ったらサポートをしてみませんか?