Unityのオブジェクトで衝突判定を行うとき Collider を付けたのに思ったようにぶつからないという場合は大体 Rigidbody のコンポーネントがアタッチされていないことが原因です。
衝突を判定するメソッド OnCollisionXXX(OnCollisionEnter/OnCollisionStay/OnCollisionExit) を呼び出すには、衝突に関わるオブジェクトのひとつに必ず Rigidbody をつけましょう。衝突によって移動させたくないオブジェクトには Rigidbody を付けないのが普通ですので、つけるのは動きのある方が良いでしょう。
逆に Rigidbody のみでも物体の形状が定まらないため衝突が起こりません。コライダーを付けた上で Rigidbody も付けます。
衝突を起こすためのコンポーネントの関係表
ある2つのオブジェクトがぶつかる場合を考えてみます。
公式マニュアルにはわかりやすい衝突関係一覧表がありますので OnCollisionXXX に関わる部分を確認してみます。
以下の表において Collider は”Box Collider”や”Mesh Collider”のコンポーネントを指します。C+Rigidbody は Collider + Rigidbody を意味します。Rigidbody(IsKinematic)は IsKinematic にチェックを入れた場合です。
Collider | C+Rigidbody | C+Rigidbody(IsKinematic) | |
---|---|---|---|
Collider | HIT | ||
C+Rigidbody | HIT | HIT | HIT |
C+Rigidbody(IsKinematic) | HIT |
つまり Rigidbody をつけると OnCollisionXXX が呼び出されますが Collider のみの場合は衝突が起こりません。
Rigidbody のプロパティ IsKinematic を有効にした場合も Collider のみのオブジェクトとはヒットしなくなり、同じように IsKinematic を有効にした Rigidbody にも衝突しなくなります。
ちなみに、すり抜け可能な OnTriggerXXX 系の衝突判定も Collider のみのオブジェクト同士では決して起こりません。詳細は上記公式マニュアルを御覧ください。