【Unity】イベントのサンプル

2023年4月1日

Unityでは、イベントを使用して、オブジェクトやコンポーネント間で通信を行うことができます。

サンプル

以下は、C#言語を使用してUnityのイベントを使用する簡単な例です。
まず、イベントを送信するクラスを作成します。

using UnityEngine;
using UnityEngine.Events;

public class MyEventSender : MonoBehaviour
{
    public UnityEvent myEvent;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // イベントを発生させる
            myEvent.Invoke();
        }
    }
}

上記のコードでは、MyEventSenderクラスを作成し、UnityEventを使用してmyEventというイベントを定義しています。Updateメソッドで、スペースキーが押されたときにmyEventを発生させます。

次に、イベントを受信するクラスを作成します。

using UnityEngine;

public class MyEventListener1 : MonoBehaviour
{
    private void Start()
    {
        // イベントを受信するために、MyEventSenderオブジェクトのmyEventにイベントリスナーを登録する
        // 旧: FindObjectOfType<MyEventSender>().myEvent.AddListener(OnMyEvent);
        FindAnyObjectByType<MyEventSender>().myEvent.AddListener(OnMyEvent);
    }

    private void OnMyEvent()
    {
        Debug.Log("イベントを受信しました!");
    }
}

上記のコードでは、MyEventListenerクラスを作成し、StartメソッドでMyEventSenderオブジェクトのmyEventOnMyEventメソッドを登録しています。OnMyEventメソッドは、myEventが発生したときに呼び出され、ログを出力します。

これで、MyEventSenderオブジェクトがスペースキーを押すと、MyEventListenerオブジェクトがmyEventを受信し、ログを出力するようになります。

その他のイベント登録方法

GameObject.FindとGatComponentメソッドで取得後、登録

using UnityEngine;

public class MyEventListener2 : MonoBehaviour
{
    private void Start()
    {
        // イベントを受信するために、MyEventSenderオブジェクトのmyEventにイベントリスナーを登録する
        GameObject.Find("EventSender").GetComponent<MyEventSender>().myEvent.AddListener(OnMyEvent);
    }

    private void OnMyEvent()
    {
        Debug.Log("2: イベントを受信しました!");
    }
}

アウトレット接続で取得後、登録

MyEventSenderスクリプトの次のフィールドにAddListenerメソッドで登録します
具体的な方法としては、MyEventSenderスクリプトを取得後に代入します

public UnityEvent myEvent;
using UnityEngine;

public class MyEventListener3 : MonoBehaviour
{
    public MyEventSender myEventSender;

    private void Start()
    {
        // イベントを受信するために、MyEventSenderオブジェクトのmyEventにイベントリスナーを登録する
        myEventSender.myEvent.AddListener(OnMyEvent);
    }

    private void OnMyEvent()
    {
        Debug.Log("3: イベントを受信しました!");
    }
}

MyEventSenderのインスペクターで登録

コードでの登録ではなく、Unityの仕様としてインスペクターにListenerをアタッチする方法もあります

using UnityEngine;

public class MyEventListener4 : MonoBehaviour
{
    public void OnMyEvent()
    {
        Debug.Log("4: イベントを受信しました!");
    }
}

実行結果

最初のサンプルは、スクリプト名をMyEventListener1としています

4: イベントを受信しました!
3: イベントを受信しました!
2: イベントを受信しました!
1: イベントを受信しました!

Unity,イベントバトル

Posted by hidepon