1つのゲームオブジェクトに複数のコライダーがアタッチされている場合の当たり判定

2つ以上のコライダーがアタッチされている場合、複数の当たりイベントが発生します
その様子と、1つのイベントとして処理する方法を見ていきます

問題のシーン

Playerゲームオブジェクトには、2つのコライダー(BoxCollider2DとCircleCollider2D)がアタッチされています
また、Rigidbody2Dもアタッチされています
Enemyゲームオブジェクトには、1つのコライダー(BoxCollider2D)がアタッチされています
コライダーのIsTriggerプロパティにチェックが入っています

1つのゲームオブジェクトに2つのコライダーがアタッチされているシーン

Playerのスクリプト

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D collision)
    {
        Debug.Log("敵と当たった");
    }
}

テスト(デバッグ)

Unityで部分的なテストをする場合、必ずしも移動用のコードを必要としません
今回は、実行後にSceneウィンドウで、移動アイコンを選択し、X軸矢印(赤色)をマウスで摘んで(ドラッグして)移動させることができます。Enemyを近づけて接触を試すことができます。

テストの様子

結果

Consoleウィンドウで結果の表示を見てみると、2回当たり判定がなされていることがわかります

敵と当たった
敵と当たった

試しにコライダーを1つにしてみると

では、CircleColliderを無効(チェックボックスを外す)にして再度試してみると

テストの様子

結果

はい、1回だけになりましたね

敵と当たった

では、2つのコライダーをアタッチした状態で1回の接触判定にするにはどうすればいいでしょうか?
「コライダーを1つにする」という選択はなしということで。2つにするのは意味があるでしょう。

1回だけ当たり判定がなされるように対応

ここでは、一つの解決策を提示します。これしかないわけではありませんが、参考にしていただければと思います。

接触用のコライダーを別のゲームオブジェクトにアタッチする

別といっても、自身の子ゲームオブジェクトにします
名前をHitColliderとして、そのゲームオブジェクトにBoxCollider2Dを移動します

親オブジェクトからBoxCollider2Dを移動します

子オブジェクトは次のようになります

子オブジェクトにアタッチするスクリプト

イベントを使っています
トリガーイベント発生時に、OnHitに登録されたメソッドが実行される設定になります

using UnityEngine;
using UnityEngine.Events;

public class ColCheck : MonoBehaviour
{
    public UnityEvent OnHit;

    void OnTriggerEnter2D(Collider2D collision)
    {
        OnHit.Invoke();
    }
}

親オブジェクトにアタッチするスクリプト

あらかじめ、実行されるメソッドを用意しておきます

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public void TriggerCheck()
    {
        Debug.Log("敵と当たった");
    }
}

イベントの登録

子オブジェクトのインスペクターを確認してみましょう
スクリプトにイベントが登録できるような場所が現れましたよね
イ当たり判定(OnTrigger)が発生したときに実行されるメソッドを登録しておきます

Player(PlayerContoller)のところには、Playerゲームオブジェクトをドラッグ&ドロップします
PlayerController .TriggerCheckは(キャプチャではすでに選択済みです)PlayerControllerを選択後、TriggerCheckメソッドを選択しています

実行結果

敵と当たった

Unity

Posted by hidepon