【Unity】1つのゲームオブジェクトと複数のコライダーを配置してそれぞれで検出できるようにする

2023年4月3日

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

実行結果

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

シーン構成

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メソッドが宣言されています。これらのメソッドは、それぞれ前方向と後方向の衝突検出イベントを受け取るためのもので、衝突したオブジェクトの名前をログに出力します。

前方の検出用トリガー

空のゲームオブジェクトを作成し、TriggerCheckerスクリプトをアタッチします
イベントの登録をビジュアルで設定します
OffのところはRuntimeOnlyにプルダウンメニューから変更しておきます

TriggerCheckerスクリプト

// UnityEngineとUnityEngine.Events名前空間をusing
using UnityEngine;
using UnityEngine.Events;

// TriggerCheckerクラスを定義し、MonoBehaviourを継承
public class TriggerChecker : MonoBehaviour
{

    // onColliderEnterというpublicなUnityEventを定義
    // このUnityEventは引数にColliderを持つ
    public UnityEvent<Collider> onColliderEnter;

    // OnTriggerEnterメソッドを定義している
    // このメソッドは引数としてColliderを持ち、privateである
    private void OnTriggerEnter(Collider other)
    {
        // onColliderEnterに格納されたUnityEventを呼び出し、引数にotherを渡している
        onColliderEnter.Invoke(other);
    }
}

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

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

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

後方の検出用トリガー

空のゲームオブジェクトを作成し、TriggerCheckerスクリプトをアタッチします
イベントの登録をビジュアルで設定します
OffのところはRuntimeOnlyにプルダウンメニューから変更しておきます

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

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

Enemy側

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

Unity,イベントバトル

Posted by hidepon