i-school - OnTriggerEnter2DのSleepingModeについて

Rigidbody2DのSleepingMode(未)

 Rigidbody2DにはSleepingModeというプロパティがあります。これはRigidbody(3D)にはない機能です。
デフォルトではStart Awakeという設定になっています。
この設定時では、物理演算が発生しない状況下では物理演算をSleep(一時停止)させることにより、Unityによる物理演算処理の軽減を行っています。

 SleepingModeの詳細は公式のリファレンスを参照してください。
https://docs.unity3d.com/ja/2019.4/Manual/class-Ri...

OnTriggerEnter2Dを使用して、同じ位置に留まっている場合でも衝突判定を取れるようにする(未)

 Aという2DゲームオブジェクトとBという2Dゲームオブジェクトがあるとします。
どちらにもRigidbody2DとBoxCollider2Dがアタッチされていて、BoxCollider2DのIsTriggerはどちらもチェックが入っています。

 AのゲームオブジェクトがOnTriggerEnter2Dを利用してBのゲームオブジェクトの衝突判定を取れることを期待している状況です。
当然ながらBのゲームオブジェクトのBoxCollider2Dの外部よりAがBのBoxCollider2Dに接触した場合には、問題なく接触判定を取ることが出来ます。

 ただし、BのゲームオブジェクトのBoxColliderがFalseの状態で、AのゲームオブジェクトがBのBoxColliderの範囲内に侵入してAの移動を停止しまうと
その後BのゲームオブジェクトのBoxColliderがTrueになっても、AのOnTriggerEnter2Dは衝突判定を感知してくれません。

 そのような場合にはOnTriggerStay2Dを使用すればよいのですが、ずっと衝突判定をしてしまったり、
それを防ぐために重複判定防止のフラグを用意したりといった対策が必要になります。
 
 このような場合には、先ほど説明しました、Rigidbody2DのプロパティであるSleeping Modeを変更します。

 こちらはデフォルトではStart Awakeという状態になっており、物理演算が必要な状況が生まれたとき(AddForceなど)だけ物理演算を行い、
それ以外の状況の際には一時的に物理演算を切っておく、というModeになります。

 先ほどの状態(BのBoxCollider内にAが侵入し、そこでAの移動を停止)は、AのRigidbody2Dの物理演算が移動を終了したと同時に
一時的に切れている(物理演算を行わない状態)になっているため、衝突判定を感知しなくなっているために生じています。

 そこで、AのゲームオブジェクトのRigidbody2DのSleeping ModeをNever Sleepに変更します。



すると先ほどのような状態になっても、BのBoxColliderがオンになった際、停止中のAのゲームオブジェクトはBのBoxColliderを感知して接触判定を行ってくれます。


 公式リファレンスにもありますが、Start Awakeよりは処理が重くなるそうです(未実証)。
多様しなけば問題ないと思いますので、OnTriggerStay2DではなくOnTriggerEnter2Dで移動停止中でも接触判定を取りたい場合の1つの選択肢としてご活用ください。

<参考例>

 Aのゲームオブジェクト;猫  Bのゲームオブジェクト:トゲ

Case 1: OnTriggerEnter2Dにて、AのRigidbody2DのSleepingModeがStartAwakeの場合、BのBoxCollider内でAが停止してしまうと再度BのBoxColliderがオンになっても感知しない。
https://gyazo.com/09ad9629ce6f993ccfa762b951a60598

Case 2: OnTriggerEnter2Dにて、AのRigidbody2DのSleepingModeがStartAwakeの場合、BのBoxCollider内でAが停止していても、再度BのBoxColliderがオンになった際に感知する。
https://gyazo.com/f7be2fb43d391b1702939495f0789724


 なお、3D用のRigidbodyにはSleepingModeの設定はありません。スクリプトから変更する方法はあるようですのでご興味のある方は
下記のリンクをご参照ください。

稲枝の押入れ 様
Rigidbodyをスリープモードにしない方法
http://inaenomaki.hatenablog.com/entry/2017/01/20/...