unityでいってみよう!

unityがチョットワカル位の人のブログ

いまさらのPhysicsによる当たり判定のもやもやを解説してみよう!

概要

これまで、普通にUnityを使用してきたが、Collider.isTrrigerやRigidbody.isKinematicっていまいちよく分からんと思っている人向けの解説です。

ColliderとRigidbody

Unityにおいて物理エンジンの対象となるGameObjectはColliderコンポーネントのみの場合とRigidbodyとColliderの両方のコンポーネントを持つ場合の2種類が存在し、さらにCollider.isTrrigerの値、Rigidbody.isKinematicの値で計6種類存在します。

静的コライダー

Colliderのみを持つGameObjectを静的コライダーと呼びます。 静的コライダーは他のオブジェクトに影響を及ぼすことはありますが、自身が影響を受けることはありません。 つまり静的コライダー同士で当たりが発生することはありません。 用途としては絶対に他のオブジェクトから影響を受けない建築物や地面等、圧倒的な質量を持つオブジェクトは静的コライダーとして割り当てらる可能性が高いです。静的コライダーのメリットとしては、物理エンジンの計算に及ぼすコストが比較的軽い点です。

静的トリガーコライダー

Collider.isTrrigerの値がtrueの静的コライダーです。 トリガーコライダーは相手に影響を及ぼすことも、自身が影響を受けることもありません。 他のオブジェクトでぶつかるということはなく、他のオブジェクトは静的トリガーコライダーを貫通します。 つまり範囲のみを示したオブジェクトです。 イメージとしてこの範囲に入ったらイベントが発生する等のマーカー的な用途で使用されるケースが多いと思います。

Rigidbodyコライダー(動的コライダー)

ColliderとRigidbody両方のコンポーネントを持つGameObjectです。 他のオブジェクトに影響を与え、他のオブジェクトから影響を受けます。 基本的に世の中に存在するものは全てRigidbodyコライダーである筈ですが・・・。

キネマティックRigidbodyコライダー

Rigidbody.isKinematicがtrueのRigidbodyコライダーです。 他のコライダーから影響を受けることはありません。(相手には影響を与えます) 静的コライダーと同じ性質を持つため、Game中の静的コライダーからRigidbodyコライダーに用途が変更する場合、Rigidbody.isKinematicで調整する。

Rigidbodyトリガーコライダー

他のオブジェクトに影響を与えることも受けることもありません。

キネマティックRigidbodyトリガー

他のオブジェクトに影響を与えることも受けることもありません。

当たりイベント

Collisionを持つオブジェクト同士が当たった場合OnTrigger系とOnCollision系の何れかのイベントが発生します。

OnCollision系

どちらのオブジェクトもCollider.isTrrigerの値がfalseである場合に発生します。 つまり、オブジェクト同士がぶつかった場合に発生するイベントです。

OnTrigger

オブジェクトのどちらか、もしくは両方のCollider.isTrrigerの値がtrueである場合に発生します。 オブジェクト同士がめり込んでいるもしくは内包された場合に発生するイベントです。

当たり判定マトリックス

静的コライダー Rigidbody コライダー キネマティック Rigidbody コライダー 静的 トリガーコライダー Rigidbody トリガーコライダー キネマティック Rigidbody トリガーコライダー
静的コライダー × OnCollision × × OnTrigger OnTrigger
Rigidbody コライダー OnCollision OnCollision OnCollision OnTrigger OnTrigger OnTrigger
キネマティック Rigidbody コライダー × OnCollision × OnTrigger OnTrigger OnTrigger
静的 トリガーコライダー × OnTrigger OnTrigger × OnTrigger OnTrigger
Rigidbody トリガーコライダー OnTrigger OnTrigger OnTrigger OnTrigger OnTrigger OnTrigger
キネマティック Rigidbody トリガーコライダー OnTrigger OnTrigger OnTrigger OnTrigger OnTrigger OnTrigger

例外

Meshコライダー

  • Meshコライダー同士の当たりは不可であるが、Convex が trueの場合、出来る場合もある?

まとめ

  • 静的(トリガー)コライダー同士では当たり判定は発生しない
  • 何れかのオブジェクトがトリガーコライダーの場合、OnTriggerイベントが発生する
  • どちらもトリガーコライダーではない場合、OnCollision イベントが発生する