質問: ### 前提・実現したいこと OnTriggerEnterに関して、3点質問があります。 1点目: OnTriggerEnterが呼び出されるには、Collider同士だけでなく、どちらか片方にRigidbodyも必要ですか? だいたいのサイトを見ているとそのように書かれているのですが、URLは忘れてしまいましたが、 Collider同士だけでも接触を検知すると書かれたサイトを見かけた気がしたので、 念のため、質問させていただきました。 2点目: こちらのサイトの、 下記内容間違っていませんか? ``` なお、Is Trigger チェックがついていて、 かつRigidbodyがアタッチされていないオブジェクトを動かしてぶつけても、衝突検出できません。 ``` 3点目:試したことに書いてあります。 ### 試したこと 1点目に関して。 検証した所、やはりRigidbodyは必要な感じがしました。 また、こちらのドキュメントに、 OnTriggerEnterが呼ばれる条件が書かれているみたいですが、 英語がわからなく、Google翻訳も正直信用していないので、 確認の為、ご教示お願いします。 2点目に関して。 「~衝突検出できません。」ここでの衝突検知とは、OnTriggerEnterが呼ばれないということを言っていると思うのですが、 ``` A:[Is Trigger]がtrue。 B:[Is Trigger]がtrueでもfalseでもどちらでもよい。Rigidbodyアタッチ。 ``` という状態だったら、Aが「Is Trigger チェックがついていて、かつRigidbodyがアタッチされていないオブジェクト」 だと思うのですが、この2つを接触させても、A側のOnTriggerEnter呼ばれますよね? 3点目: 2点目に関してまとめると、 ``` A:Colliderのみアタッチ。 B:ColliderとRigidbodyをアタッチ。 ``` この2つのゲームオブジェクトを衝突させると、Aのゲームオブジェクトでも衝突は検知しますよね? 上記の条件において、AとBのどちらかか、もしくは両方に[Is Trigger]がtrueに設定されていれば、 AのゲームオブジェクトでもOnTriggerEnterが呼ばれ(当然BでもOnTriggerEnterが呼ばれ)、 AとBの両方で[Is Trigger]がfalseに設定されていれば、 AのゲームオブジェクトでもOnCollisionEnterが呼ばれる(当然BでもOnCollisionEnterが呼ばれる) ということで合っていますよね? ご教示お願いします。
回答: 公式リファレンスは大体合っていますが、時々間違っています(特に日本語版)。 **実際の挙動が仕様です。** 試してみてそのようになっているのなら、そうなのです。 また、使用しているUnityのバージョンと参考資料のバージョンが合っているかも確認してください。 本件が該当するかは分かりませんが、たまに仕様変更が入っていて話が食い違う可能性があります。 ちなみに公式リファレンスの翻訳に関する問い合わせは該当ページの「フィードバック」から送信出来ます。 個人ブログについては合っている保証は何も無いので、間違っているなと思ったら筆者に問い合わせた方がいいです。 せっかくなので Unity2018.2.3f1 環境で検証しました。 0.片方or両方にCollider無し、Rigidbody問わず 1.両方にRigidbody無し、IsTrigger問わず(以下は全て両方のColliderあり) → OnTriggerEnterもOnCollisionEnterも呼ばれない 2.片方or両方にRigidbodyあり、片方or両方のIsTriggerオン → OnTriggerEnterは呼ばれる、OnCollisionEnterは呼ばれない 3.両方にRigidbodyあり、両方のIsTriggerオフ → OnTriggerEnterは呼ばれない、OnCollisionEnterは呼ばれる 4.片方にRigidbodyあり、両方のIsTriggerオフ → **Rigidbodyある方がぶつかった(動いた)場合、**OnTriggerEnterは呼ばれない、OnCollisionEnterは呼ばれる(ただし本来は押すはずが貫通する) → **Rigidbody無い方がぶつかった(動いた)場合、**OnTriggerEnterもOnCollisionEnterも呼ばれない 備考:上記の「呼ばれる」は全て、ぶつかった側・ぶつかられた側の双方で発生しています。 よって質問の「2点目」は「サイトの表記が誤り(または当時のバージョンでは正しかったが、最近のバージョンでは違う)」。 「3点目」は「その通り」になります。