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メソッドを選択しています

実行結果
敵と当たった
ディスカッション
コメント一覧
まだ、コメントがありません