【Unity】Action,FuncとDelegateまとめ

2025/01/03に公開

Actionは、Unity開発でも頻繁に使われる便利な機能で、イベント処理やコールバックの実装を簡潔にしてくれる強力なツールです。この記事では、Actionの基本的な仕組みやDelegateとの違いを解説しています。

ActionとDelegateについて

Action

ActionはC#の基本的な機能の一つで、「定義された標準のデリゲート」です。独自にDelegateを定義する必要がなく、コードが簡潔になるメリットがあります。

Action<string> myAction = (message) => {
    Debug.Log(message);
};

myAction("Hello, Action!"); // "Hello, Action!"と表示

Func

Actionは引数の指定のみが可能で、戻り値を持ちません。戻り値を持つ場合には、Funcを使用します。

Func<int, int, int> addFunc = (a, b) => a + b;
int result = addFunc(5, 10);
Debug.Log(result); // 15と表示

Delegate

Delegateは、メソッドの参照を格納するための型として定義できます。
メソッドの型を独自に定義しなければいけません。柔軟性は高いですが、宣言や使用が少し冗長になる場合があります。

delegate int AddDelegate(int a, int b);

AddDelegate add = (a, b) => a + b;
int result = add(5, 10);
Debug.Log(result); // 15と表示

UnityでのActionの活用例

ボタンイベントの活用

UIのボタンで複数の動作を分離したい場合に、Actionを導入することで、コードをシンプルにすることができます。

using UnityEngine;
using UnityEngine.UI;

public class ButtonActionSample : MonoBehaviour
{
    public Button myButton;

    public void Start()
    {
        SetupButton(() => Debug.Log("ボタンが押されました"));
    }

    private void SetupButton(Action onClickAction)
    {
        myButton.onClick.AddListener(() => onClickAction.Invoke());
    }
}

動的な処理の汎用化

Actionは不定時に処理を行うための方法としても活用できます。たとえば、イベントに対する動的なリスナーを追加したい場合に使用します。

using UnityEngine;

public class DynamicEventHandler : MonoBehaviour
{
    private Action onUpdateAction;

    public void Start()
    {
        SetUpdateAction(() => Debug.Log("最新の動作が設定されました"));
    }

    public void Update()
    {
        onUpdateAction?.Invoke();
    }

    public void SetUpdateAction(Action newAction)
    {
        onUpdateAction = newAction;
    }
}

まとめ

使用シーンの違い

Delegateは、より複雑なカスタム動作が必要な場合や、特定の用途に合わせた命名を行いたい場合に適しています。一方、ActionやFuncは、標準的な処理を簡潔に記述したい場合に便利です。

特徴 Delegate Action/Func
宣言の必要性 必要 不要
引数と戻り値 自由 Actionは引数のみ、Funcは戻り値あり
シンプルさ やや複雑 簡潔

Discussion