Action
EventHandler
Delegate
UnityEvent
Func
について
Action
:
戻り値がなく、引数がない、もしくは1つ以上の引数を取ることができるデリゲートです。
EventHandler
:
標準的なC#のイベントシステムで、通常、イベント発生元 (sender
) とイベントデータ (EventArgs
) を渡します。
Delegate
:
カスタムのデリゲートを定義でき、任意の引数と戻り値を設定可能です。
UnityEvent
:
Unityの特有のイベントシステムで、インスペクターから設定可能なイベントです。デフォルトでは戻り値がなく、引数はオプションです。
Func
:
戻り値を持つデリゲートで、1つ以上の引数を取ることができます。
各デリゲートやイベントで、引数を取る場合の例です。
using System;
public Action<string, int> onAction;
void Start()
{
onAction += (message, number) => Debug.Log($"{message} - {number}");
onAction?.Invoke("Message", 42);
}
Action<T1, T2>
のように複数の引数を取ることが可能です。public event EventHandler<CustomEventArgs> onEvent;
public class CustomEventArgs : EventArgs { public string Message; public int Number; }
void Start()
{
onEvent += (sender, e) => Debug.Log($"{e.Message} - {e.Number}");
onEvent?.Invoke(this, new CustomEventArgs { Message = "Event message", Number = 42 });
}
EventArgs
をカスタムして複数のデータを渡せます。public delegate void CustomDelegate(string message, int number);
public CustomDelegate onCustomEvent;
void Start()
{
onCustomEvent += (message, number) => Debug.Log($"{message} - {number}");
onCustomEvent?.Invoke("Delegate message", 42);
}
using UnityEngine.Events;
public UnityEvent<string, int> onUnityEvent;
void Start()
{
onUnityEvent.AddListener((message, number) => Debug.Log($"{message} - {number}"));
onUnityEvent?.Invoke("UnityEvent message", 42);
}
UnityEvent<T1, T2>
のように複数の引数を設定できます。インスペクターから引数を設定することも可能です。public Func<string, int, string> onFunc;
void Start()
{
onFunc += (message, number) => $"{message} - {number}";
string result = onFunc?.Invoke("Func message", 42);
Debug.Log(result);
}
Func<T1, T2, TResult>
のように複数の引数を取ることができ、最後の型は戻り値です。Action
、EventHandler
、UnityEvent
は戻り値を持ちませんが、Func
やカスタムDelegate
を使うことで戻り値を持たせることが可能です。
public Func<string, int, string> onFunc;
void Start()
{
onFunc += (message, number) => $"{message} - {number}";
string result = onFunc?.Invoke("Func message", 42);
Debug.Log(result); // 出力: Func message - 42
}
Func
は戻り値を持つデリゲートで、最後の型パラメータが戻り値の型になります。public delegate int CustomDelegate(string message, int number);
public CustomDelegate onCustomEvent;
void Start()
{
onCustomEvent += (message, number) => message.Length + number;
int result = onCustomEvent?.Invoke("Hello", 5);
Debug.Log(result); // 出力: 10
}
特徴 | Action | EventHandler | Delegate | UnityEvent | Func |
---|---|---|---|---|---|
戻り値 | なし | なし | 任意 | なし | あり |
引数 | 最大16個 | EventArgs を使って渡す |
任意 | UnityEvent<T> 形式で設定 |
最大16個 |
インスペクター対応 | なし | なし | なし | あり | なし |
使いどころ | シンプルなイベント処理 | C#の標準的なイベント | カスタム処理や複雑なパターン | Unityエディターでイベント設定したい場合 | 戻り値が必要な場合 |
EventArgs
) を伝えたい場合に使用します。Action
、EventHandler
、Delegate
、UnityEvent
、Func
を使ったサンプルコード
using UnityEngine;
using System;
public class ActionExample : MonoBehaviour
{
// 引数付きのAction (stringとintを受け取る)
public Action<string, int> onAction;
void Start()
{
// Actionにメソッドを登録
onAction += PrintMessage;
// Actionを実行
onAction?.Invoke("Hello from Action", 42);
}
void PrintMessage(string message, int number)
{
Debug.Log($"{message} - {number}");
}
}
Action<string, int>
を使い、string
とint
を引数に取るイベントを作成しています。using UnityEngine;
using System;
public class EventHandlerExample : MonoBehaviour
{
// カスタムEventArgsクラス
public class CustomEventArgs : EventArgs
{
public string Message { get; set; }
public int Number { get; set; }
}
// EventHandler (CustomEventArgsを使う)
public event EventHandler<CustomEventArgs> onEvent;
void Start()
{
// EventHandlerにメソッドを登録
onEvent += OnEventTriggered;
// イベントを発生させる
onEvent?.Invoke(this, new CustomEventArgs { Message = "Hello from EventHandler", Number = 42 });
}
void OnEventTriggered(object sender, CustomEventArgs e)
{
Debug.Log($"{e.Message} - {e.Number}");
}
}
EventHandler
を使い、カスタムEventArgs
を渡してデータをやり取りしています。using UnityEngine;
public class DelegateExample : MonoBehaviour
{
// カスタムデリゲート (stringとintを受け取り、intを返す)
public delegate int CustomDelegate(string message, int number);
// カスタムデリゲートの変数
public CustomDelegate onCustomEvent;
void Start()
{
// デリゲートにメソッドを登録
onCustomEvent += CalculateStringLengthAndAddNumber;
// デリゲートを実行し、結果を取得
int result = onCustomEvent?.Invoke("Hello from Delegate", 42) ?? 0;
Debug.Log($"Result: {result}");
}
// stringの長さとnumberを足して返す
int CalculateStringLengthAndAddNumber(string message, int number)
{
return message.Length + number;
}
}
string
とint
を受け取り、処理結果としてint
を返しています。using UnityEngine;
using UnityEngine.Events;
public class UnityEventExample : MonoBehaviour
{
// 引数付きのUnityEvent (stringとintを受け取る)
public UnityEvent<string, int> onUnityEvent;
void Start()
{
// UnityEventにリスナーを登録
onUnityEvent.AddListener(PrintMessage);
// UnityEventを実行
onUnityEvent?.Invoke("Hello from UnityEvent", 42);
}
void PrintMessage(string message, int number)
{
Debug.Log($"{message} - {number}");
}
}
UnityEvent<string, int>
を使い、引数を渡してイベントを処理しています。インスペクターからもリスナーを設定できます。using UnityEngine;
using System;
public class FuncExample : MonoBehaviour
{
// 戻り値付きのFuncデリゲート (stringとintを受け取り、stringを返す)
public Func<string, int, string> onFunc;
void Start()
{
// Funcにメソッドを登録
onFunc += FormatMessage;
// Funcを実行し、戻り値を取得
string result = onFunc?.Invoke("Hello from Func", 42);
Debug.Log(result);
}
// stringとintを受け取り、整形されたメッセージを返す
string FormatMessage(string message, int number)
{
return $"{message} - {number}";
}
}
Func<string, int, string>
を使い、引数を受け取って整形し、戻り値を返しています。種類 | 用途 | Unityインスペクターで設定可能 | 戻り値 | 引数 |
---|---|---|---|---|
Action | シンプルなイベント処理に最適。戻り値は不要。 | なし | なし | 最大16個 |
EventHandler | 標準的なイベントシステム。イベント発生元やデータの管理が必要な場合。 | なし | なし | EventArgs で管理 |
Delegate | 自由な引数・戻り値を設定可能なカスタムイベント。 | なし | あり | 任意 |
UnityEvent | Unityエディターでイベントを設定したい場合。UIなどのイベント管理に最適。 | あり | なし | 最大4つまで |
Func | 戻り値が必要な場合に使用。結果を返す処理に向いている。 | なし | あり | 最大16個 |
実際の開発では、スクリプトが別ファイルに分かれることが多いです。特に、以下のようなケースではファイルを分けることが推奨されます。
Invoker
)、または受け取る側(Listener
)が異なる場合は、それぞれ別のスクリプトに分けます。これにより、クラスごとの責任を明確にし、コードの保守性を高めることができます。using System;
public class CustomEventArgs : EventArgs
{
public string Message { get; set; }
public int Number { get; set; }
}
EventArgs
の定義は別ファイルに分け、複数のスクリプトから利用できるようにします。using UnityEngine;
public class EventInvoker : MonoBehaviour
{
// イベントの宣言
public event EventHandler<CustomEventArgs> onEvent;
void Start()
{
// イベントを発生させる
TriggerEvent();
}
void TriggerEvent()
{
if (onEvent != null)
{
onEvent.Invoke(this, new CustomEventArgs { Message = "Hello from Invoker", Number = 99 });
}
}
}
using UnityEngine;
public class EventListener : MonoBehaviour
{
public EventInvoker invoker;
void OnEnable()
{
if (invoker != null)
{
// イベントのリスナーを登録
invoker.onEvent += OnEventTriggered;
}
}
void OnDisable()
{
if (invoker != null)
{
// イベントのリスナーを解除
invoker.onEvent -= OnEventTriggered;
}
}
void OnEventTriggered(object sender, CustomEventArgs e)
{
Debug.Log($"Received event: {e.Message} - {e.Number}");
}
}