インスペクター単体だと単一のメソッドに限定されるが、 複数のリスナーが同じイベントを受け取れる
2-1. EventHandlerを用いてイベント実行
using System;
using UnityEngine;
public class EventExample : MonoBehaviour
{
public event EventHandler MyEvent;
void Start()
{
MyEvent += OnMyEvent;
MyEvent?.Invoke(this, EventArgs.Empty); // イベントを発火
}
private void OnMyEvent(object sender, EventArgs e)
{
Debug.Log("Event triggered!");
}
}
2-2. EventHandlerを用いてイベント実行(引数使用)
(サンプルの方では、シングルトンパターンで用意したInstanceを利用している)
ファイル構成
MyEventArgs.cs(カスタムイベント引数クラス)Publisher.cs(イベント発火側のクラス)Subscriber.cs(イベント受信側のクラス)
1. MyEventArgs.cs (カスタムイベント引数クラス)
using System;
// カスタムイベントの引数として使用するクラス
public class MyEventArgs : EventArgs
{
public string Message { get; }
public int Value { get; }
public MyEventArgs(string message, int value)
{
Message = message;
Value = value;
}
}
説明
MyEventArgsクラスは、イベントに渡すデータ(メッセージと数値)を含んでいます。EventArgsを継承することで、EventHandlerのイベント引数として使用できます。
2. Publisher.cs (イベント発火側のクラス)
using System;
using UnityEngine;
public class Publisher : MonoBehaviour
{
// EventHandlerを使用したイベント定義
public event EventHandler<MyEventArgs> MyEvent;
// イベントを発火するメソッド
public void TriggerEvent(string message, int value)
{
// イベントが登録されていればInvokeで発火
MyEvent?.Invoke(this, new MyEventArgs(message, value));
}
}
説明
Publisherクラスは、イベントを発火させる側です。UnityのMonoBehaviourを継承し、イベントを保持しています。TriggerEventメソッドを呼び出すことで、イベントを発火し、登録されているメソッドに通知します。
3. Subscriber.cs (イベント受信側のクラス)
using UnityEngine;
public class Subscriber : MonoBehaviour
{
[SerializeField] private Publisher publisher;
private void OnEnable()
{
// Publisherのイベントにメソッドを登録
if (publisher != null)
{
publisher.MyEvent += OnEventReceived;
}
}
private void OnDisable()
{
// イベントの登録を解除
if (publisher != null)
{
publisher.MyEvent -= OnEventReceived;
}
}
// イベントが発火されたときに呼び出されるメソッド
private void OnEventReceived(object sender, MyEventArgs e)
{
// イベントの引数を利用してメッセージを表示
Debug.Log($"イベントを受信しました: メッセージ = {e.Message}, 値 = {e.Value}");
}
}
説明
Subscriberクラスはイベントを受信する側で、OnEnableでイベントを登録し、OnDisableで登録解除します。OnEventReceivedメ ソッドが、イベント発火時に呼び出され、引数として渡されたデータを使用します。
Unityのシーン設定
- シーンに
PublisherとSubscriberのオブジェクトを作成してアタッチ。 Subscriberのインスペクターで、Publisherオブジェクトをpublisherフィールドにドラッグ&ドロップします。PublisherのTriggerEventメソッドを適切なタイミングで呼び出すように設定します(ボタンやタイマー、コライダーなど)。
使用例
using UnityEngine;
public class TriggerEventExample : MonoBehaviour
{
[SerializeField] private Publisher publisher; // Publisherの参照
void Update()
{
// スペースキーが押されたらイベントを発火
if (Input.GetKeyDown(KeyCode.Space))
{
// 引数としてメッセージと数値を渡す
publisher.TriggerEvent("スペースキーが押されました", 42);
}
}
}