衝突(Collisionや Trigger)検出に OnCollisionEnter, OnCollisionExit, OnCollisionStay, OnTriggerEnter, OnTriggerExit, OnTriggerStay 関数は欠かせないわけですが、これらを使うにもいろいろ制約があります。
開発中に引っかかりやすいものを挙げてみました。
関数名、引数名のタイプミス
まず真っ先にタイプミスを疑うのは基本ですね。努力は自分を裏切らなくても手元は平気で裏切ります。
関数名がOnEnterCollision になってませんか? 正しくは OnCollisionEnter デス。
引数の型は合ってますか? OnCollisionEnterの引数は Collision型、OnTriggerEnterの引数はCollider型です。
コーンピザ(Collider)を頼んだのに「明太子ピザ(Collision)おまちのお客様!」って呼ばれても誰だって反応できないでしょう。
void OnCollisionEnter(Collision c) { } void OnTriggerEnter(Collider t) { }
いつのバージョンからか、引数が間違っているとエラーが表示されるようになりました。
これでピザの種類間違ってるのにわざと気づかないふりして後で怒鳴り込んで2枚目のピザを無料でゲットするヤカラが減るよ!(違う)
Rigidbodyはアタッチされているか
知っててもやりがちですが、どちらかのオブジェクトにRigidbodyがアタッチされていなければ、衝突は検出できません。
どちらにアタッチするかは吟味しましょう。たとえば壁にボールをぶつけるという状況で、壁のほうにRigidbodyをつけるのは得策と言えるでしょうか? 否である。Rigidbodyは動く物体につけるのがほとんどの状況で正しいです。
Colliderの Is Trigger チェックボックスの状態
どちらか一方のオブジェクトにチェックがついていれば、呼ばれるのは OnTrigger 〜関数です。
なお、Is Trigger チェックがついていて、かつRigidbodyがアタッチされていないオブジェクトを動かしてぶつけても、衝突検出できません。
isKinematicなRigidbody同士をアニメーションでぶつけようとしていないか
Kinematicなコライダは物理挙動の計算が行われません。
どちらか一方なら衝突できますが、両方だとぶつかれません。
キネマティックな心、すれちがう二人。
結ばれる時は来るのでしょうか。
2Dなのに3D用の関数を使おうとしていないか
Collider2Dコンポーネントを使用している場合、呼ばれるのはOnCollisionEnter2D もしくは OnTriggerEnter2D 関数です。
次元が同じかどうか確認しましょう。
...気持ちはわかりますが確認しましょう。
-
-
-
- -
-
-
以上のことに気をつければ、だいたいうまくいくと思います!
よい衝突ライフを。