UnityEvent を使ったイベント登録入門チュートリアル – EventDispatcher と EventReceiver の連携(int 型引数付き)

この資料では、初めは単なるメソッド定義から始め、シーン開始時に呼び出す方法、そして最終的に UnityEvent を利用して異なる GameObject にアタッチされたスクリプトのメソッドへ int 型の引数をコードで渡す手順を解説します。
主に以下の 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. int 型引数を渡すためのコード更新

ここから、int 型の引数を渡す方法に変更します。
まずは、イベントの型を UnityEvent<int> に変更し、メソッドも int 型の引数を受け取るように更新します。
また、Start() 内でイベント発行時に数値を渡します(例として 100 を渡します)。

using UnityEngine;
using UnityEngine.Events;

public class EventDispatcher : MonoBehaviour
{
    // インスペクター上でメソッドを登録可能にする UnityEvent(int 型引数付き)
    public UnityEvent<int> greetingEvent;

    void Start()
    {
        // シーン開始時に、登録された全てのメソッドへ int 型引数 100 を渡して発行する
        greetingEvent.Invoke(100);
    }

    // インスペクターから呼び出し可能な public メソッド(int 型引数付き)
    public void DisplayGreetingWithInt(int value)
    {
        Debug.Log("EventSender より: " + value + " のメッセージ こんにちは、世界!");
    }
}

ポイント

  • イベントの型を UnityEvent<int> に変更することで、int 型の引数を渡せるようになります。
  • Start()greetingEvent.Invoke(100); とすることで、数値 100 を引数として渡します。
  • メソッドも DisplayGreetingWithInt(int value) として定義し、受け取った数値をデバッグ表示します。

実行結果


5. 別の GameObject のスクリプトのメソッドも実行する(int 型引数付き)

次に、別の GameObject にアタッチされた EventReceiver.cs も、int 型の引数を受け取るように更新します。

EventReceiver.cs の作成

以下のコードで EventReceiver.cs を作成します。
このスクリプトは、DisplayGreetingWithInt() というメソッドを持ち、渡された数値を利用して別のメッセージをコンソールに出力します。

using UnityEngine;

public class EventReceiver : MonoBehaviour
{
    // int 型引数を受け取るメソッド
    public void DisplayGreetingWithInt(int value)
    {
        Debug.Log("EventListener よりご挨拶: " + value + " のメッセージ こんにちは、世界!");
    }
}

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

UnityEvent への登録手順(int 型引数付き)

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

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

  • EventSenderDisplayGreetingWithInt(int)
  • EventListenerDisplayGreetingWithInt(int)
    の両方が発行され、コンソールにそれぞれのメッセージが表示されます。(ここでは 100 が引数として渡されます)

実行結果


6. まとめ

  1. 単なるメソッド定義(引数なし)
    • まずは DisplayGreeting() というメソッドを定義するだけの状態。
  2. Start() から呼び出す(引数なし)
    • シーン開始時に直接 DisplayGreeting() を実行してメッセージを出力する方法を学習。
  3. UnityEvent によるインスペクター登録(引数なし)
    • コード変更なしで、インスペクターから任意のメソッドを登録し、発行可能にする方法を学習。
  4. int 型引数を渡すためのコード更新
    • イベントの型を UnityEvent<int> に変更し、Invoke(100) などで数値を渡す方法を習得。
  5. 他の GameObject のスクリプトのメソッドも実行(int 型引数付き)
    • EventSenderEventListener の双方で、int 型引数付きのメソッド(DisplayGreetingWithInt)を登録することで、シーン再生時に引数付きで処理を連携させることができます。

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

Unity,イベント

Posted by hidepon