🌐

【Unity】OnCollision2D系で自コライダーの反応検知

2024/12/25に公開

タイトル通りです。Unityでコリジョンやトリガーの判定を検知する時に、自分についているコライダーが複数あった場合、どのコライダーが反応したのか判定する方法についての記事です。

private void OnCollisionEnter2D(Collision2D other) {
        // 処理
    }

普段は検知した相手オブジェクトのコライダーを判定する事が多いと思います(私だけ?)。

private void OnCollisionEnter2D(Collision2D other) {
        if(other.gameObject.CompareTag("Enemy")){
            // ダメージ処理など
        }
    }

ただ、たまに自オブジェクトについている複数のコライダーの中で、どのコライダーが検知したのか知りたい時があります。そういう時は以下のように判定出来ます。

private void OnCollisionEnter2D(Collision2D other) {
        if(other.gameObject.CompareTag("Enemy")){
            // ダメージ処理など
            if(other.otherCollider == headCollider2D){
                // ヘッドショットダメージなど
            }
        }
    }

このように2Dでは便利なプロパティが用意されています。簡単ですね。

...。
......。
.........。

え? 3D? そんな子は知りません。

ドキュメントを見ても使い勝手の良さそうなプロパティは無さそうなので、Unity的にも3Dという計算量が2Dの数倍増える環境において、1つのオブジェクトに複数の検知コライダーを付けるな!というメッセージなのかもしれません。信じるか信じないかはあなた次第です。

それでも、3Dでも1つのオブジェクトに複数の検知コライダーを付けたいんだという方は、ContactPointが実装の鍵になると思います。こんな感じかなぁというコードを書いておきますが、当方は3D環境のゲームを今は作ってないのでデバッグしてませんので、参考程度にどうぞ。

    private void OnCollisionEnter(Collision collision){
        if (collision.gameObject.CompareTag("EnemyAttack")){
            foreach (ContactPoint contact in collision.contacts){
                if (contact.thisCollider == headCollider){
                    // ヘッドショットダメージなど
                    break;
                }
            }
        }
    }

まあ、見るからに計算量が多そうなコードですね。

Discussion