【Unity】1つのゲームオブジェクトと複数のコライダーをアタッチしてそれぞれで検出できるようにする(3Dサンプル)

2024年3月25日

ゲームオブジェクトには複数のコライダーを配置できますが、その場合、個別にどのコライダーがヒットしたかを検出することができません
しかし、解決策はあります
ゲームオブジェクトの子オブジェクトを作成してそこに各コライダーをアタッチすること、コライダーがアタッチされているゲームオブジェクトにさらに検出用のスクリプトをアタッチすることで実現することができます

実行結果

ダミーで作成したSphere(球)をシーンウィンドウでドラッグして事前に作成したオブジェクに近づけて当たり判定は検出できるかを確認します

シーン構成

1つのゲームオブジェクトに2つの子オブジェクトを追加し、それぞれにコライダーとスクリプトをアタッチします
それぞれのスクリプトはそれぞれのコライダーに対応したイベントを受け取ります

Player側本体

Cubeを1つ作成して、直方体を作ります
EventListenerSampleスクリプトをアタッチします

EventListenerSampleスクリプト

// Unityのライブラリを使用するための宣言
using UnityEngine;

// MonoBehaviourクラスを継承するEventListenerSampleクラスの宣言
public class EventListenerSample : MonoBehaviour
{
    // 前方向の衝突検出イベントを受け取るためのメソッド
    public void FrontEventHandler(Collider collider)
    {
        // 衝突したオブジェクトの名前をログに出力
        Debug.Log("前方の検出 " + collider.name);
    }

    // 後方向の衝突検出イベントを受け取るためのメソッド
    public void RearEventHandler(Collider collider)
    {
        // 衝突したオブジェクトの名前をログに出力
        Debug.Log("後方の検出 " + collider.name);
    }
}

このコードは、Unityにおけるイベントリスナーのサンプルです。EventListenerSampleクラスは、MonoBehaviourクラスを継承しており、FrontEventHandlerメソッドとRearEventHandlerメソッドが宣言されています。これらのメソッドは、それぞれ前方向と後方向の衝突検出イベントを受け取るためのもので、衝突したオブジェクトの名前をログに出力します。

前方の検出用トリガー

Cubeオブジェクトの子オブジェクトを作成します
空のゲームオブジェクトを作成し、名前はFrontTriggerとしておきましょう
SphereColliderとTriggerCheckerスクリプトもアタッチします
IsTriggerにチェックを入れておきます(OnTriggerEnterイベントを検出させるため)

TriggerCheckerスクリプト

注意)キャプチャー画面の一部でProjectビューにTriggerEventCreaterというファイル名のスクリプトがありますが、これはTriggerCheckerの誤りです

using UnityEngine;
using UnityEngine.Events;

public class TriggerChecker : MonoBehaviour
{
    // onColliderEnterというpublicなUnityEventを定義
    // 先頭のoが小文字であることに注意
    // このUnityEventは引数にColliderを持地ます
    public UnityEvent<Collider> onColliderEnter;

    // Unityの内蔵イベント関数のOnTriggerEnterメソッドを定義
    private void OnTriggerEnter(Collider other)
    {
        // onColliderEnterに代入されたUnityEventを呼び出し、引数にotherを渡している
        onColliderEnter.Invoke(other);
    }
}

このコードは、UnityのゲームオブジェクトにアタッチされたTriggerCheckerスクリプトに、Colliderが侵入するとonColliderEnterイベントを発生させる機能を実装しています。onColliderEnterイベントは、外部から設定可能なUnityEventで、引数には侵入したColliderが渡されます。このスクリプトを使用することで、Colliderの侵入に応じた処理を簡単に実装することができます。

呼び出したいイベントハンドラを登録

インスペクター側でイベントハンドラの登録します

Cubeをドラッグして、アタッチされているEventListenerSampeスクリプトのFrontEventHnagerメソッドを登録します
注意として、衝突相手ごとにコライダーを取得するため、DynamicCollider(上から2行目)で選択します

後方の検出用トリガー

前方の検出用トリガーと同じように登録します

Cubeオブジェクトの子オブジェクトを作成します
空のゲームオブジェクトを作成し、名前はRearTriggerとしておきましょう
SphereColliderとTriggerCheckerスクリプトもアタッチします
IsTriggerにチェックを入れておきます(OnTriggerEnterイベントを検出させるため)

呼び出したいイベントハンドラを登録

衝突相手ごとにコライダーを取得するため、DynamicCollider(上から3行目)で選択します

Enemy側

どのような形状でも構いませんが、RigidBodyとColliderコンポーネントはアタッチされている必要があります
また、実験のためシーンビュー上で、移動ツールを使って移動させたいので、isKinematicをチェックしておきます

参考)Physicsデバッガを使った視覚的なコライダーの確認

Unity,イベントバトル

Posted by hidepon