Unityでどうにもうまくオブジェクトが反発しないときの確認事項
Unity初心者としては、ちゃんとやっているはずなのに、どうにも壁にボールとかが跳ね返ったりしないことがある。
そんなときの確認事項。
- Bounce Threshold を確認
- オブジェクトごとのMassを確認
- オブジェクトのvelocityを確認
- Collider の Material を確認
- Rigidbody の Collision Detection を確認
Bounce Threshold を確認
一番簡単なやつ。
Unityでは一定速度以下の衝突を無視するようになっている。
多分、シミュレーションを軽量にしたり、例えば重力でバウンドしているのがいつまで経っても静止しない問題を解決するためとかだと思う。
[Edit] > [Project Settings...] を開いてBounce Threshold
を0.1とかにしてみる。
オブジェクトごとのMassを確認
オブジェクトの位置をコードで固定していたりしても、Massの値によって固定している方のオブジェクトを押せてしまう。
Massを著しく重くしちゃえばひとまず解決する。
オブジェクトのvelocityを確認
オブジェクトをコードで移動させていると、velocityが0になってしまっているので、速く動いているように見えてもシミュレーション上は静止している壁と同じ。
基本はaddForce
で動かすべきだし、どうしてもそうは行かない場合はvelocityの値も無理やりいじる。
Collider の Material を確認
Collider の Material で反発のしやすさを変更できる。公式ドキュメントが素晴らしい。 docs.unity3d.com
Rigidbody の Collision Detection を確認
シミュレーションを軽量にするために、デフォルトだとフレーム毎に重なっているオブジェクトに対してしか衝突判定を行わない。
つまり速い速度で動いているオブジェクトはすり抜けうるということ。
↓の記事がとてもきちんと検証されていて素晴らしく参考になった。