6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OnTriggerEnter2Dが呼ばれないときの対処法

Last updated at Posted at 2021-06-08

はじめに

いくつかサイトに記載している呼ばれなかったときの対処法を試してみたのですが、確認すべきポイントが他にも見つかったので記事にしてまとめます。
これは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を参考にしてください。

Collider 2D - Unity マニュアル

接触するGameObjectのどちらかにRigidbody2Dのコンポーネントがアタッチされてるか

タイトルの通り、OnTrigger2D系のメソッドを呼び出したいのであれば、接触するGameObjectのどちらかにRigidbody2Dのコンポーネントがアタッチされてるかを確認してください。
これも、OnTrigger2D系のメソッドを呼び出したい場合は、Rigidbody2Dコンポーネントを使用してください。
Rigidbodyコンポーネントだと呼ばれないので気を付けてください。

Rigidbody 2D - Unity マニュアル

接触する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
image.png

例えば、Layer Collision Matrixが以下のようになっていた場合、GameObjectのLayerがDefaultとUIの接触判定は行われません。
image.png

レイヤーベースの衝突検出 - Unity マニュアル

OnTrigger2D系メソッドを含むGameObjectの2DColliderにisTriggerのチェックが入っているかどうか

以下の画像のようにOnTrigger系メソッドを呼び出すGameObjectの2DColliderにisTriggerのチェックが入っているか確認してください。
image.png

Rigidbody2DのSimulatedにチェックが入っているか

アタッチしているRigidbody2DのコンポーネントのSimulatedにチェックが入っているかどうか確認してください。
image.png
このチェックが入っていないと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)

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?