いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : 衝突検出のOnCollisionEnter, OnTriggerEnter が呼ばれない、反応しない(Collision Detection)

衝突(Collisionや Trigger)検出に OnCollisionEnter, OnCollisionExit, OnCollisionStay, OnTriggerEnter, OnTriggerExit, OnTriggerStay 関数は欠かせないわけですが、これらを使うにもいろいろ制約があります。
開発中に引っかかりやすいものを挙げてみました。

関数名、引数名のタイプミス

まず真っ先にタイプミスを疑うのは基本ですね。努力は自分を裏切らなくても手元は平気で裏切ります。

関数名がOnEnterCollision になってませんか? 正しくは OnCollisionEnter デス。
引数の型は合ってますか? OnCollisionEnterの引数は Collision型、OnTriggerEnterの引数はCollider型です。

コーンピザ(Collider)を頼んだのに「明太子ピザ(Collision)おまちのお客様!」って呼ばれても誰だって反応できないでしょう。

void OnCollisionEnter(Collision c) {
}

void OnTriggerEnter(Collider t) {
}

いつのバージョンからか、引数が間違っているとエラーが表示されるようになりました。

f:id:sugar_affordance:20191226080611p:plain

これでピザの種類間違ってるのにわざと気づかないふりして後で怒鳴り込んで2枚目のピザを無料でゲットするヤカラが減るよ!(違う)

Rigidbodyはアタッチされているか

知っててもやりがちですが、どちらかのオブジェクトにRigidbodyがアタッチされていなければ、衝突は検出できません。
どちらにアタッチするかは吟味しましょう。たとえば壁にボールをぶつけるという状況で、壁のほうにRigidbodyをつけるのは得策と言えるでしょうか? 否である。Rigidbodyは動く物体につけるのがほとんどの状況で正しいです。

Colliderの Is Trigger チェックボックスの状態

どちらか一方のオブジェクトにチェックがついていれば、呼ばれるのは OnTrigger 〜関数です。
なお、Is Trigger チェックがついていて、かつRigidbodyがアタッチされていないオブジェクトを動かしてぶつけても、衝突検出できません。


isKinematicなRigidbody同士をアニメーションでぶつけようとしていないか

f:id:sugar_affordance:20180717195438p:plain

Kinematicなコライダは物理挙動の計算が行われません。
どちらか一方なら衝突できますが、両方だとぶつかれません。

キネマティックな心、すれちがう二人。
結ばれる時は来るのでしょうか。

2Dなのに3D用の関数を使おうとしていないか

Collider2Dコンポーネントを使用している場合、呼ばれるのはOnCollisionEnter2D もしくは OnTriggerEnter2D 関数です。
次元が同じかどうか確認しましょう。

...気持ちはわかりますが確認しましょう。

        • -

以上のことに気をつければ、だいたいうまくいくと思います!
よい衝突ライフを。


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。