【Unity】当たり判定が反応しない原因
概要
Unityで衝突時の処理を書く場合はOnCollisionEnterなどのイベント関数を使用しますが、関数を書いても処理が呼ばれないことがあります。
今回はその原因について紹介します。
2D用と3D用は別の判定
接触判定用のイベント関数は、2D用と3D用で別々に用意されているので、アタッチしてあるCollider系コンポーネントが2Dなのに3D用の関数を書いている場合や、Collider系コンポーネントが3Dなのに2Dの関数を書いている場合は反応しません。
●3D用のイベント関数
void OnCollisionEnter(Collision collision)
void OnCollisionExit(Collision collision)
void OnCollisionStay(Collision collision)
●2D用のイベント関数
void OnCollisionEnter2D(Collision2D collision)
void OnCollisionExit2D(Collision2D collision)
void OnCollisionStay2D(Collision2D collision)
RigidBodyが付いていない
接触判定を行うには接触する2つのオブジェクトのうち、どちらか、あるいは両方にRigidBody(2Dの場合:RidigBody2D)を付ける必要があります。
isTriggerの設定
Collider系コンポーネントのisTriggerにチェックが入っていると、OnCollision系のイベントは反応しなくなります。
isTriggerを使用して衝突判定をしたい場合は、OnTrigger系のイベント関数を使います。
●3D用のイベント関数
void OnTriggerEnter(Collider collision)
void OnTriggerExit(Collider collision)
void OnTriggerStay(Collider collision)
●2D用のイベント関数
void OnTriggerEnter2D(Collider2D collision)
void OnTriggerExit2D( Collider2D collision)
void OnTriggerStay2D(Collider2D collision)
イベント関数を書いたスクリプトがアタッチされていない
衝突判定のイベント関数は、衝突したオブジェクトにアタッチされていなければ呼び出されません。
まとめ
Unityは衝突判定のメンドクサイ部分を内部でやってくれてとても助かるのですが、触り始めたばかりの人には、前提条件があったり、オプション一つ変えるだけで当たらなくなったりして分かりにくいかも、と思って記事にしました。
参考になれば幸いです。