[Unity]衝突判定メソッド(OnCollisionXXX)にはRigidbodyが必要

2021年2月20日

Unityのオブジェクトで衝突判定を行うとき Collider を付けたのに思ったようにぶつからないという場合は大体 Rigidbody のコンポーネントがアタッチされていないことが原因です。

衝突を判定するメソッド OnCollisionXXX(OnCollisionEnter/OnCollisionStay/OnCollisionExit) を呼び出すには、衝突に関わるオブジェクトのひとつに必ず Rigidbody をつけましょう。衝突によって移動させたくないオブジェクトには Rigidbody を付けないのが普通ですので、つけるのは動きのある方が良いでしょう。

逆に Rigidbody のみでも物体の形状が定まらないため衝突が起こりません。コライダーを付けた上で Rigidbody も付けます。

衝突を起こすためのコンポーネントの関係表

ある2つのオブジェクトがぶつかる場合を考えてみます。

公式マニュアルにはわかりやすい衝突関係一覧表がありますので OnCollisionXXX に関わる部分を確認してみます。

コライダー - Unity マニュアル

以下の表において 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 のみのオブジェクト同士では決して起こりません。詳細は上記公式マニュアルを御覧ください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です