いんでぃーづ

ゲームメインのブレブレブログ。ゲーム,Unity,デザイン,UI/UX

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) {
}

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.


免責事項

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

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

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