デリゲートとは?

デリゲート(delegate)とは、メソッドを参照するための型です。

デリゲートを使用すると、メソッドを変数のように扱ったり、柔軟に呼び出すことができます。

また、イベントの仕組みやコールバック処理など、さまざまな場面で活用されます。

デリゲートの宣言

デリゲートとは、特定の引数と戻り値を持つメソッドを参照するための型です。

以下にいくつかの例を挙げてみます。

// 戻り値、引数なし
public delegate void DelegateSample1();

// 戻り値無し、string型引数
public delegate void DelegateSample2(string message);

// int型戻り値、string型引数
public delegate int DelegateSample3(string message);

実際に使用すると以下の様になります。

using UnityEngine;

public delegate void DelegateSample2(string message);

public class Sample : MonoBehaviour
{
    private DelegateSample2 _delegate2;
    
    private void Awake()
    {
		    // デリゲートにメソッドを割り当てる
        _delegate2 = Debug.Log;
    }

    private void Start()
    {
		    // デリゲートからメソッドを呼び出す
        _delegate2("Start!");
    }
}

DelegateSample2という名前で、戻り値がvoidで引数がstringのメソッドを参照できるデリゲート型を宣言しています。

DelegateSample2型の_delegate2変数を用意し、Debug.Logメソッドを代入しています。

その後、_delegate2に引数として文字列を渡して呼び出しています。

_delegate2にはDebug.Logを代入しているので、Debug.Logが呼ばれ、コンソール上にログが出力されています。

デリゲートの特徴

デリゲートは型安全であり、戻り値と引数が一致しているメソッドのみを参照できます。

また、+=演算子を使って、複数のメソッドをデリゲートに追加することもできます。

using UnityEngine;

public delegate void DelegateSample(string message);

public class Sample : MonoBehaviour
{
    private DelegateSample _delegate;
    
    private void Awake()
    {
        _delegate += Debug.Log;
        _delegate += Debug.LogWarning;
    }

    private void Start()
    {
        _delegate("Start!");
    }
}

_delegateに、Debug.LogDebug.LogWarningの2つのメソッドを代入しています。

その後、_delegateを呼び出すと、コンソールに2種類のログが出力されます。

ActionとFunc

C#には、デリゲートの代わりに使えるActionFuncというものが用意されています。

これらを使用すると、いちいちdelegateの宣言をしなくてもよく、便利です。

そのため、こちらを使うことのほうが多いかもしれません。

Action

Actionは戻り値を設定できないため、void型の戻り値を持つメソッド用です。

引数は最大で16個まで、任意の型を指定できます。


private Action _action;
private void Awake()
{
	_action = () =>
	{
		Debug.Log("Start");
	};
}

private void Start()
{
	_action();
}

Func

戻り値が必要な場合は、Funcを使用します。

Funcでは、戻り値と最大15個までの引数を任意の型で指定できます。

Funcで指定した型のうち、最後の型は戻り値の型になります。

private Func<int> _func;

private void Awake()
{
	_func = () => 123;
}

private void Start()
{
	// コンソールに、123と表示される
	Debug.Log(_func());
}

ActionとFuncの違い

Action

特徴Action
戻り値なし(void)
引数任意の型で最大16個

Func

特徴Func
戻り値指定した型
引数任意の型で最大15個(+戻り値)

まとめ

コールバックの処理として、delegateActionFuncの説明をしました。

delegateは特定の型を持つメソッドを参照できる型であり、イベントやコールバックの処理に役立ちます。

Actionは戻り値がvoiddelegate型で、シンプルにメソッドを参照できる便利な型です。

Funcは戻り値のあるメソッドをより柔軟に処理できます。

それぞれの特徴を理解し活用することで、C#のコードをより効率的に設計することができます。

DelegateActionFuncを使いこなせば、

UnityC#プログラミングでのイベント処理やメソッドの柔軟な呼び出しが簡単になります。

ぜひ活用してみてください!

🔗関連ページ