UnityEvent を使ったイベント登録入門チュートリアル – EventDispatcher と EventReceiver の連携

この資料では、初めは単なるメソッド定義から始め、シーン開始時に呼び出す方法、そして最終的に UnityEvent を利用して、異なる GameObject にアタッチされたスクリプトのメソッドも実行する手順を解説します。
主に以下の 2 つのスクリプトと、それぞれをアタッチする 2 つの GameObject を使用します。

  • EventDispatcher.cs
    (イベント発行側のスクリプト。インスペクター経由でメソッドを登録)
    → アタッチする GameObject の名称:EventSender
  • EventReceiver.cs
    (イベント受信側のスクリプト。イベント発行時に処理を受け取る)
    → アタッチする GameObject の名称:EventListener

1. 初めに:単なるメソッドの定義

まずは、DisplayGreeting() というメソッドを定義しただけの状態です。この段階ではメソッドは存在するものの、どこからも呼び出されないため実行(発行)されません。

using UnityEngine;

public class EventDispatcher : MonoBehaviour
{
    // 「こんにちは、世界!」を表示するメソッド(定義のみ)
    void DisplayGreeting()
    {
        Debug.Log("こんにちは、世界!");
    }
}

ポイント
この状態では、単にメソッドが存在するだけで、実行(発行)されることはありません。


2. Start() からのメソッド呼び出し

次に、Start() メソッド内で DisplayGreeting() を呼び出すようにコードを変更します。これにより、シーン開始時にメソッドが自動的に実行され、コンソールに「こんにちは、世界!」が出力されます。

using UnityEngine;

public class EventDispatcher : MonoBehaviour
{
    void Start()
    {
        // シーン開始時に DisplayGreeting() を呼び出す
        DisplayGreeting();
    }

    void DisplayGreeting()
    {
        Debug.Log("こんにちは、世界!");
    }
}

ポイント

  • Start() は MonoBehaviour の初期化メソッドです。
  • シーン開始と同時に DisplayGreeting() が実行され、コンソールにメッセージが表示されます。

3. UnityEvent を使ってインスペクターから呼び出す

次に、UnityEvent を利用して、インスペクター上からメソッドを登録・実行できるように変更します。
以下のコードでは、greetingEvent にインスペクターから登録されたメソッドが、Start() 時に発行されます。

using UnityEngine;
using UnityEngine.Events;

public class EventDispatcher : MonoBehaviour
{
    // インスペクター上でメソッドを登録可能にする UnityEvent
    public UnityEvent greetingEvent;

    void Start()
    {
        // インスペクターで登録された全てのメソッドを発行する
        greetingEvent.Invoke();
    }

    // インスペクターから呼び出し可能な public メソッド
    public void DisplayGreeting()
    {
        Debug.Log("こんにちは、世界!");
    }
}

ポイント

  • public UnityEvent greetingEvent; により、インスペクター上でイベントにメソッドを追加できるようになります。
  • EventSender のインスペクターから +ボタン をクリックし、自分自身(EventDispatcher)を登録、ドロップダウンから DisplayGreeting() を選択します。

4. 別の GameObject のスクリプトのメソッドも実行する

次に、別の GameObject にアタッチされた EventReceiver.cs のメソッドも実行できるようにします。

EventReceiver.cs の作成

以下のコードで EventReceiver.cs を作成します。
このスクリプトは、DisplayGreeting() というメソッドを持ち、別のメッセージをコンソールに出力します。

using UnityEngine;

public class EventReceiver : MonoBehaviour
{
    public void DisplayGreeting()
    {
        Debug.Log("EventReceiver よりご挨拶: こんにちは、世界!");
    }
}

ポイント
このスクリプトは、例えばシーン上に EventListener という名前の GameObject にアタッチしてください。

UnityEvent への登録手順

  1. EventDispatcher.cs をアタッチした GameObject(EventSender)を選択します。
  2. インスペクター内の greetingEvent フィールドを展開します。
  3. すでに自分自身の DisplayGreeting() が登録されている場合、+ボタン をクリックして新たなスロットを追加します。
  4. 新たなスロットに、EventReceiver.cs をアタッチしている GameObject(EventListener)をドラッグ&ドロップします。
  5. ドロップダウンから EventReceiver -> DisplayGreeting を選択します。

実行時
シーン再生時に、greetingEvent.Invoke() によって登録されている

  • EventSenderDisplayGreeting()
  • EventListenerDisplayGreeting()
    の両方が発行され、コンソールにそれぞれのメッセージが表示されます。

5. まとめ

  1. 単なるメソッド定義
    • まずは DisplayGreeting() というメソッドを定義するだけの状態。
  2. Start() から呼び出す
    • シーン開始時に直接 DisplayGreeting() を実行してメッセージを出力する方法を学習。
  3. UnityEvent によるインスペクター登録
    • コード変更なしで、インスペクターから任意のメソッド(ここでは EventSenderDisplayGreeting())を登録し、発行可能にする方法。
  4. 他の GameObject のスクリプトのメソッドも実行
    • UnityEvent に複数のメソッド(EventSenderEventListener のそれぞれの DisplayGreeting())を登録することで、異なる GameObject 間で連携した処理が実現できます。

この手順を通して、UnityEvent の基本的な使い方と柔軟なイベント管理手法を理解し、実際のプロジェクトに応用できるようになります。

Unity,イベント

Posted by hidepon