はじめに
こんにちは、バッテラです。
Rigidbodyと非Rigiddbodyだとすり抜けないんだけど、Rigidbody同士だとすり抜けまくったので、 どう解決したかというお話です。
環境
- MacOS Monterey (12.1)
- Unity (2021.2.9f1)
FixedTimeStepを変更する
結論からです。
この値をもっと小さい値にしてあげて実行するとすり抜けが防止できます。
デフォルトだと 0.02 になっています。
自分の場合ですと 0.002 (デフォルトの1/10の値)で全くすり抜けなくなりました。
減らせば減らすほど物理演算をする回数が増加するため負荷はかかります。
動作速度とトレードオフってことですね。
以下では解決はしなかったこと
CollisionDetectionを「Continuous Dynamic」 にする
双方にContinuous Dynamic にしても余裕ですり抜けしました。 (どちらもUnity標準のコライダー)
余談
この現象が起きるケースは、Rigidbodyを持つオブジェクトの移動が早すぎるときに頻出します。
おそらく物理演算する間隔が広かったため次フレームにて衝突対象に一切触れることなく通過してしまい、ワープしたことになっているんでしょう。 そういったときにCollision Detectionが働くのかと思っていましたが、うまく機能せずなんですよねー。
本題とは別の話ですが、 RigidbodyのコライダーとMeshのコライダー(非Rigidbodyね)でもすり抜けることががよくあります。 本来 Collision Detection で連続検知ですり抜け防止しているんだけど、 Collision Detection はUnity標準のコライダーでしか機能しないということが公式ドキュメントに記載ありました。
なのでMeshと高速で動くRigidbodyですり抜けるのは結構起きちゃいます。
FixedTimeStep を変える、もしくはMeshのコリジョンをUnity標準のコリジョンの組み合わせで作るか(大変そう)ですね。
おわりに
一難去ってまた一難の日々。。つらたん。
それでは、また。
読者登録・Twitterのフォローをしていただけると、ハッピーになります。