新規プロジェクトから始める UnityEvent(引数付き)活用チュートリアル

このチュートリアルでは、以下の手順で作業を進めます。

  1. 新規プロジェクトの作成
  2. カスタムUnityEventクラスの定義
  3. 子オブジェクト用のイベントスクリプト作成
  4. シーンにオブジェクトを配置し、スクリプトをアタッチ
  5. Inspector上でイベントの割り当てと動作確認

1. 新規プロジェクトの作成

  1. Unity Hubを起動
    • Unity Hubを開き、「New Project」をクリックします。
  1. テンプレートの選択
    • 「3D」テンプレートなど、お好みのテンプレートを選択します。
  1. プロジェクト名の入力
    • プロジェクト名(例:UnityEventTutorial)を入力し、保存場所を指定します。
  1. プロジェクトの作成
    • 「プロジェクトの作成」ボタンを押して、新規プロジェクトを作成します。

2. カスタムUnityEventクラスの定義

UnityEventで引数付きのイベントを使用するため、まずはカスタムUnityEventクラスを定義します。

  1. Scriptsフォルダの作成
    • Projectウィンドウ内で右クリックし、Create > Folder を選択して「Scripts」フォルダを作成します。
  1. 新しいC#スクリプトの作成(最新バージョンの場合は「MonoBehaviour Script」または「C# Script」)
    • Scriptsフォルダ内で右クリックし、ポップアップメニューから Create > C# Script(または MonoBehaviour Script)を選択します。
    • スクリプト名を CustomUnityEvents とします。
  1. CustomUnityEvents.csの編集
    • 作成したファイルをダブルクリックして、Visual Studio(またはお好みのコードエディタ)で開き、以下のコードを入力または貼り付けます。
using UnityEngine;
using UnityEngine.Events;

[System.Serializable]
public class ColliderEvent : UnityEvent<Collider> { }

[System.Serializable]
public class CollisionEvent : UnityEvent<Collision> { }
  1. 保存してUnityに戻る
    • スクリプトを保存すると、Unityエディタが自動的にコンパイルされます。

3. 子オブジェクト用のイベントスクリプト作成

次に、子オブジェクトで発生するTriggerおよびCollisionイベントを受け取り、カスタムUnityEventを利用するスクリプトを作成します。

  1. 新規スクリプトの作成
    • Scriptsフォルダ内で右クリックし、Create > C# Script(または MonoBehaviour Script)を選択します。
    • スクリプト名を ChildEventTrigger_WithArgs とします。
  1. ChildEventTrigger_WithArgs.csの編集
    • 以下のコードを貼り付けます。
   using UnityEngine;
   using UnityEngine.Events;

   public class ChildEventTrigger_WithArgs : MonoBehaviour
   {
       [Header("UnityEvent設定(引数あり)")]
       // Triggerイベント用(引数:Collider)
       public ColliderEvent OnChildTrigger;
       // Collisionイベント用(引数:Collision)
       public CollisionEvent OnChildCollision;

       void OnTriggerEnter(Collider other)
       {
           Debug.Log($"{gameObject.name} で Trigger 発生:{other.gameObject.name}");
           OnChildTrigger?.Invoke(other);
       }

       void OnCollisionEnter(Collision collision)
       {
           Debug.Log($"{gameObject.name} で Collision 発生:{collision.gameObject.name}");
           OnChildCollision?.Invoke(collision);
       }
   }
  1. 保存してUnityに戻る
    • スクリプトを保存し、Unityエディタが正常にコンパイルするのを確認します。

4. シーンにオブジェクトを配置し、スクリプトをアタッチ

  1. 子オブジェクトの作成
    • Hierarchyウィンドウで、右クリック > 3D Object > Cube または Sphere を選択し、オブジェクトを追加します。
    • 作成したオブジェクトの名前を「Child1」などに変更します。
    • オブジェクトのInspectorで、Colliderコンポーネントが付いていることを確認し、必要に応じて isTrigger プロパティを設定します。
  1. スクリプトのアタッチ
    • 「Child1」オブジェクトに ChildEventTrigger_WithArgs スクリプトをドラッグ&ドロップしてアタッチします。
  1. 親オブジェクトの配置
    • イベント管理用に、空のGameObject(例:EventManager)を作成します。
  1. 親オブジェクトと子オブジェクトを階層化します
    • EventManagerにClild1をドラッグ&ドロップします

5. Inspector上でのイベント割り当てと動作確認

  1. Inspectorの確認
    • 「Child1」オブジェクトを選択すると、ChildEventTrigger_WithArgs スクリプトの項目が表示されます。
    • 「On Child Trigger」と「On Child Collision」のリストがあり、ここに呼び出すメソッドを割り当てます。
  1. イベントの割り当て
    • 例として、親オブジェクトにイベントハンドリング用のスクリプトを作成し、該当メソッド(引数としてColliderまたはCollisionを受け取る)を実装します。
  • Inspector上で、その親オブジェクトのスクリプトのメソッドをドラッグ&ドロップで「On Child Trigger」や「On Child Collision」に登録します。
  • 【キャプチャ⑭】Inspectorでイベントメソッドがドラッグ&ドロップされ、割り当てられている状態のスクリーンショットを挿入

以下は、親オブジェクト側にイベントハンドリング用のスクリプトを作成し、子オブジェクトから送られてくるCollider(Triggerイベント)やCollision(Collisionイベント)の引数を受け取るメソッドを実装するサンプルコードです。


using UnityEngine;

public class ParentEventHandler : MonoBehaviour
{
    // Triggerイベント時に呼び出されるメソッド(Colliderを引数として受け取る)
    public void HandleChildTrigger(Collider other)
    {
        Debug.Log($"[親] 子オブジェクトのTriggerイベント受信。対象オブジェクト:{other.gameObject.name}");
        // ここに、Triggerイベントに対する処理を実装します
    }

    // Collisionイベント時に呼び出されるメソッド(Collisionを引数として受け取る)
    public void HandleChildCollision(Collision collision)
    {
        Debug.Log($"[親] 子オブジェクトのCollisionイベント受信。衝突相手:{collision.gameObject.name}");
        // ここに、Collisionイベントに対する処理を実装します
    }
}

イベント割り当て手順

  1. スクリプトのアタッチ
    作成した「EventManager」オブジェクトに上記の ParentEventHandler スクリプトをドラッグ&ドロップでアタッチします。
  2. Inspectorでのイベント割り当て
    • 子オブジェクト(例:ChildEventTrigger_WithArgs をアタッチしたオブジェクト)のInspectorを開きます。
    • 「On Child Trigger」のリストに、親オブジェクト「EventManager」をドラッグ&ドロップし、ドロップダウンから ParentEventHandler.HandleChildTrigger を選択します。
  • 同様に、「On Child Collision」のリストに親オブジェクト「EventManager」を割り当て、 ParentEventHandler.HandleChildCollision を選択します。

これにより、子オブジェクトでTriggerやCollisionイベントが発生すると、親オブジェクトの対応するメソッドが呼び出され、イベント引数が渡されるようになります。

  1. 動作確認
    • シーンを再生し、Child1オブジェクトに対してTriggerまたはCollisionが発生するように操作します。
    • Consoleウィンドウにログが表示され、登録したイベントメソッドが正しく呼び出されることを確認します。

このチュートリアルでは、Rigidbodyの詳細な解説は含まれていません。ただし、実際の動作環境では、Collisionイベント(OnCollisionEnterなど)を正しく検出するためには、少なくとも一方のオブジェクトにRigidbodyコンポーネントが必要です。

追加情報

  • Collisionイベントの場合
    オブジェクト同士の衝突イベントを検知するには、どちらか一方、もしくは両方にRigidbodyが付いている必要があります。
  • Triggerイベントの場合
    通常、TriggerイベントはRigidbodyがなくても検知できますが、物理演算が関係する場合はRigidbodyの追加を検討してください。

もしRigidbodyの設定について詳しく知りたい場合、追加のチュートリアルやリファレンスを参照すると良いでしょう。


6. まとめ

  • カスタムUnityEventクラスの定義
    [System.Serializable] 属性を利用して、ColliderやCollision型の引数を受け取るイベントクラスを作成することで、Inspector上での設定が可能になります。
  • 子オブジェクト用のスクリプト
    子オブジェクトで発生するイベント時に、カスタムUnityEventをInvokeし、引数付きの情報を渡す実装を行います。
  • Inspectorでの柔軟な設定
    UnityEventの利点を活かし、プログラマー以外のメンバーでも直感的にイベント処理を設定できる環境を構築できます。

このチュートリアルに沿って作業することで、新規プロジェクトの作成から、カスタムUnityEventを利用した引数付きイベント処理の実装まで、一通りの流れをスムーズに学習・実践できます。

Unity,イベント

Posted by hidepon