Unityで1つのゲームオブジェクトに複数のコライダーを追加し、それぞれの衝突を個別に検出する方法を学ぶ(3Dサンプル)

2024年10月2日

Unityでは、1つのゲームオブジェクトに複数のコライダーを配置することができますが、通常ではどのコライダーが衝突したのかを個別に検出することができません。この資料では、ゲームオブジェクトの子オブジェクトにコライダーをアタッチし、衝突を個別に検出する方法を解説します。

実行結果

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

シーン構成

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

Player側の設定

ゲームオブジェクト作成

  • Cubeオブジェクトを作成して、基本的な直方体を作成します。
  • EventListenerSampleスクリプトをCubeオブジェクトにアタッチします。

EventListenerSampleスクリプト

using UnityEngine;

public class EventListenerSample : MonoBehaviour
{
    // 前方向の衝突検出イベントを処理するメソッド
    public void FrontEventHandler(Collider collider)
    {
        Debug.Log("前方で衝突が検出されました: " + collider.name);
    }

    // 後方向の衝突検出イベントを処理するメソッド
    public void RearEventHandler(Collider collider)
    {
        Debug.Log("後方で衝突が検出されました: " + collider.name);
    }
}

EventListenerSampleクラスは、MonoBehaviourを継承し、前後方向の衝突検出をログに出力するためのメソッドを持ちます。各メソッドは、検出されたコライダーの名前を表示します。

前方の検出用トリガー

  • Cubeオブジェクトの子オブジェクトとして空のゲームオブジェクトを作成し、名前を「FrontTrigger」に設定します。
  • SphereColliderをアタッチし、IsTriggerにチェックを入れます。
  • TriggerCheckerスクリプトをアタッチします。

TriggerCheckerスクリプト

using UnityEngine;
using UnityEngine.Events;

public class TriggerChecker : MonoBehaviour
{
    // Collider型の引数を持つUnityEventを定義
    public UnityEvent<Collider> onColliderEnter;

    // コライダーが他のオブジェクトと接触した際に呼ばれるメソッド
    private void OnTriggerEnter(Collider other)
    {
        // UnityEventがnullでない場合、イベントを発生させる
        onColliderEnter?.Invoke(other);
    }
}

TriggerCheckerは、コライダーが他のオブジェクトと接触したときにonColliderEnterイベントを発生させます。これは、UnityEventとして外部からイベントハンドラを登録することができ、侵入したコライダーの情報を渡します。

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

イベントハンドラの登録

  • インスペクターで、TriggerCheckerスクリプトにCubeオブジェクトをドラッグし、EventListenerSampleスクリプトのFrontEventHandlerメソッドを登録します。
  • DynamicColliderを選択することで、コライダーに応じて適切なハンドラを設定できます。

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

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

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

後方の検出用トリガー

前方のトリガーと同様の手順で、後方のトリガーを設定します。

  • Cubeオブジェクトの子オブジェクトとして空のゲームオブジェクトを作成し、名前を「RearTrigger」に設定します。
  • SphereColliderをアタッチし、IsTriggerにチェックを入れます。
  • TriggerCheckerスクリプトをアタッチします。

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

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

Enemy側の設定

  • 任意の形状のオブジェクトを作成し、RigidbodyとColliderコンポーネントをアタッチします。
  • シーンビューで動かすために、isKinematicにチェックを入れます。

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

Physicsデバッガを使用すると、Unityの物理エンジンに関連するコライダーやリジッドボディなどの物理オブジェクトを視覚的に確認できるようになります。これにより、ゲーム内の物理システムが期待どおりに動作しているかをチェックすることができます。

Physicsデバッガを使ったコライダーの確認手順

デバッガの起動:

  • Unityエディタのメニューから、Window > Analysis > Physics Debugger を選択します。これで「Physics Debugger」ウィンドウが開きます。

コライダーの表示:

  • 「Physics Debugger」ウィンドウ内で、表示させたいオブジェクトにチェックを入れることで、シーン内のコライダーが視覚的に表示されます。各コライダーは、その形状(ボックス、スフィア、カプセルなど)に応じて線で描画され、他のオブジェクトとの当たり判定領域を確認することができます。

コライダーの種類:

  • コライダーは主に3つの形状で構成されています:
    • Box Collider: 直方体の当たり判定領域。
    • Sphere Collider: 球体の当たり判定領域。
    • Capsule Collider: カプセル状の当たり判定領域。

オプションのカスタマイズ:

  • 「Physics Debugger」では、物理データの表示オプションをカスタマイズできます。例えば、コライダーのワイヤフレームだけでなく、接触点や力のベクトルなどのデータも表示可能です。これにより、物理的な動作の詳細なデバッグができます。

視覚的な確認:

  • ゲームの実行中に物理デバッグを行うことで、リアルタイムでコライダーがどのように機能しているかを確認できます。特にOnTriggerEnterなどのイベントが発生するかどうかや、物理演算による衝突の挙動が正しいかをチェックする際に役立ちます。

どんなときに使うか?

  • コライダーの形状が意図したとおりに設定されているか、正確にオブジェクトに適用されているかを確認する。
  • 複雑な物理挙動を視覚的に理解し、デバッグする。
  • 衝突判定が発生しない場合の原因(コライダーの設定ミスやサイズのズレなど)を特定する。

Physicsデバッガを使用することで、コライダーの問題や物理シミュレーションのエラーを効率的に見つけることができ、開発プロセスがスムーズになります。

Unity,イベントバトル

Posted by hidepon