⚡
【Unity】Action,FuncとDelegateまとめ
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