OnTriggerEnter2DとOnCollisionEnter2Dの違い

OnTriggerEnter2DとOnCollisionEnter2Dの違いが分からん!

更に言うと、OnCollisionExit2DとOnTriggerExit2Dの違い、OnCollisionStay2DとOnTriggerStay2Dの違いも分からん!

っとなったので調べました。2Dについて書いていますが、基本3Dも一緒だと思います。

1.引数が違う

OnCollisionEnter2DとOnTriggerEnter2Dですが、よくよく見ると引数が違います。

void OnTriggerEnter2D( Collider2D other) { ... }
void OnCollisionEnter2D ( Collision2D other ) { ... }

1つ目の違いはここです。

綴りが似ているので最初気が付きませんでした。しかし、CollisionとColliderってどう違うんでしょう?

CollisionとColliderの違い

Collisionは衝突が発生した時の情報を受け渡しするためのクラスのようです。衝突時の衝突点や相対速度、衝撃の強さなどの情報が保持されています。

Unity - Scripting API: Collision


Colliderは、衝突判定をさせるためのコンポーネントでGameObjectにアタッチして使うクラスです。

Unity - Scripting API: Collider

2.使用する場面が違う。

実は使い分けは簡単で、ColliderのisTriggerがオンの時は、OnTrigger〜系のコールバック、オフの時はOnCollision〜系のコールバックを使えばOKです。

ちなみに同時に両方呼ばれることは無いみたいです。どちらかしか呼ばれません。

しかし、ColliderのisTriggerフラグって何なんでしょう?

トリガーってなに?

ColliderはisTriggerというフラグを持っています。これを有効にすると Rigidbody の衝突判定を行わなくなります。

分かりやすい例を挙げます。

f:id:wkpn:20161003120454p:plain

図で、青い四角も赤い四角も、どちらもBoxCollider2Dがついています。さらに青い方には、Rigidbody2Dもついているので、ゲームをスタートすると重力によって落下し始めます。

f:id:wkpn:20161003120504p:plain

isTriggerがオフのときには、下図のように赤い四角の上に青い四角が乗っかります。

f:id:wkpn:20161003120511p:plain

isTriggerをオンにすると、下図のように赤い四角に乗らずにスルーしまて落下し続けます。(OnTrigger系のCallbackは発生します。)

ちなみに、赤い四角、青い四角、どちらか一方だけでもisTriggerを有効にすれば、すり抜けるようになりTrigger系のコールバックが呼ばれるようになります。

まとめ

  1. 衝突して反射するような物理挙動をするオブジェクトに仕込むときはOnCollision〜系のコールバックを使う
  2. isTriggerフラグを立てて、触れたかどうかだけ判断したいようなオブジェクトに仕込むときはOnTrigger〜系のコールバックを使う
  3. それぞれ引数に入ってくる型が違うので注意