はじめに
いくつかサイトに記載している呼ばれなかったときの対処法を試してみたのですが、確認すべきポイントが他にも見つかったので記事にしてまとめます。
これはOnTriggerEnter2Dのメソッドにかかわらず、OnTrigger2D系メソッド(OnTriggerEnter2D(), OnTriggerStay2D(), OnTriggerExit2D())すべてに当てはまります。
確認すべきポイント
- GameObjectにCollider 2Dがアタッチされてるか
- 接触するGameObjectのどちらかにRigidbody2Dのコンポーネントがアタッチされてるか
- 接触するGameObject両方のLayerがLayer Collision Matrixに適切なチェックが入っているか
- Edit -> Project Settings -> Physics2D -> Layer Collision Matrixから確認
- OnTrigger2Dメソッドを含むGameObjectの2DColliderにisTriggerのチェックが入っているかどうか
- Rigidbody2DのSimulatedにチェックが入っているか
私はこの「Rigidbody2DのSimulatedにチェックが入っているか」が入っておらず、OnTrigger2D系のメソッドが呼ばれませんでした。
上4つの項目に関しては、いくつかの記事で書かれていたのですが、5つ目に関しては、ほとんどの記事で書かれておらず、引っかかってしまいました。
それぞれのポイントの詳細
GameObjectにCollider 2Dがアタッチされてるか
Collider 2DとはBox Collider 2DやCapsule Collider 2Dなどのことを指しています。
Colliderのコンポーネントはいくつか存在していますが、OnTrigger2D系メソッドの呼び出しに対応しているのはCollider 2Dのコンポーネントしか対応していないので注意してください。
Collider 2Dの詳細は以下のURLを参考にしてください。
接触するGameObjectのどちらかにRigidbody2Dのコンポーネントがアタッチされてるか
タイトルの通り、OnTrigger2D系のメソッドを呼び出したいのであれば、接触するGameObjectのどちらかにRigidbody2Dのコンポーネントがアタッチされてるかを確認してください。
これも、OnTrigger2D系のメソッドを呼び出したい場合は、Rigidbody2Dコンポーネントを使用してください。
Rigidbodyコンポーネントだと呼ばれないので気を付けてください。
接触するGameObject両方のLayerがLayer Collision Matrixに適切なチェックが入っているか
接触するGameObjectのLayerそれぞれが何か確認してください。
もし、確認したLayerそれぞれがLayer Collision Matrixでのそれぞれに対応していない場合は、GameObjectのLayerを変更するか、それぞれのLayerと交差している部分にチェックを入れてください。
Layer Collision Matrixは
Edit -> Project Settings -> Physics2D -> Layer Collision Matrix
から確認できます。
例えば、Layer Collision Matrixが以下のようになっていた場合、GameObjectのLayerがDefaultとUIの接触判定は行われません。
OnTrigger2D系メソッドを含むGameObjectの2DColliderにisTriggerのチェックが入っているかどうか
以下の画像のようにOnTrigger系メソッドを呼び出すGameObjectの2DColliderにisTriggerのチェックが入っているか確認してください。
Rigidbody2DのSimulatedにチェックが入っているか
アタッチしているRigidbody2DのコンポーネントのSimulatedにチェックが入っているかどうか確認してください。
このチェックが入っていないとOnTrigger2D系のメソッドは呼ばれません。
[Rigidbody2Dのスクリプトリファレンス] (https://docs.unity3d.com/ja/2019.4/Manual/class-Rigidbody2D.html)にも書いているのですが、
Simulated を有効に (ボックスをチェック) すると、ランタイムに、Rigidbody 2D とそれにアタッチされたすべての Collider 2D と Joint 2D を物理的シミュレーションと相互作用させます。無効にすると、これらのコンポーネントはシミュレーションと相互作用しません。
また、こちらでは、Simulationのチェックを入れた場合と外した場合の発生内容が詳しく書かれています。
これらから、このチェックを外すと物理シミュレーションがされないのでそもそも接触という事象が起きません。
なので、OnTrigger2D系のメソッドが呼ばれなくなります。
このチェックを外すと物理シミュレーションが無効になるのでその場で固定されるので、RigidbodyのUse Gravityと同じ効果かと勘違いしてしまう可能性があります。しかし、このSimulatedは物理シミュレーション自体がされないので重力のオンオフと同じ意味ではなさそうです。
もし、重力シミュレーションをオフにしたように表現したい場合は、Rigidbody2DのBody TypeをKinematicに変更するか、Freeze Positionにチェックを入れることで固定することが可能なので、そのような方法で固定してください。
[Rigidbody2Dのスクリプトリファレンス] (https://docs.unity3d.com/ja/2019.4/Manual/class-Rigidbody2D.html)