ぱふの自由帳

ぱふの技術ブログ。メインはUnity。最近はUnity1Weekの放送してます。良ければフォローお願いします、、

コライダーが重なったり、突き抜けたりしてしまう。そんな時。

はじめに

「動く物体が壁に設定したコライダーに埋まる!」「動く物体が壁を貫通してしまった・・。」という方に向けた記事です。私が2Dメインであるので、2Dでの対処法を書いていきます。もしかすると、3Dでも同様の方法で改善する場合があるかもしれません(。・ω・。)

対処法

その1

こちらは単純に処理回数を増やして改善する方法です。
Edit -> Project Setting -> Time を選択すると TimeManager が開きますので Fixed Timestep の値を変更します。この記事を書いた現在、0.0001~10の値を選択できます。この値はFixed Updateを実行する間隔ですので、値が小さいほど正しい動きをするようになります。しかし、値と物理演算を行う必要のある物体の数によっては負荷がとても大きくなってしまうことがあります。

その2

こちらは Rigidbody 2D の Collision Detection の機能を使用して改善する方法です。
Rigidbody 2D の項目の中に Collision Detection というものがあります。デフォルトでは Discrete となっているので Continuous に変更してください。

f:id:PafuOfDuck:20170519222415p:plain

Continuous に設定するとぶつかる瞬間を計算で求めて、そこ以上には進まずに重なりやすり抜けを防止してくれます。ですが、こちらも Discrete と比較するとCPUの負荷が大きくなってしまいます。また、厳密には完璧な物理挙動ではないようです。

どちらを選ぶのか

個人的にですが、完璧に近い物理挙動を求める場合には1の方法を、完璧でないが違和感もないような挙動を求める時に2の方法を選択するようにしています。とは言っても、ゲーム内で完璧な物理挙動が必要な場面に出会ったことがないので2の方法だけでやっていますが…。

おわり

このどちらかの方法で埋まったりすり抜けたりする問題は解決できるはずです。3Dにも選択肢は3つありますが同じ機能が実装されているので是非使ってみてください。もしかすると、3Dバージョンも近いうちに書くかもしれません((φ(-ω-)

質問や間違っている箇所、追加情報があれば是非コメントをお願いします!

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています…(`・ω・´) Let’s Unity !