UnityのRigidbodyが崩れたりバラけたりするため上手く積めない
検証環境
Unity:5.6.1f1
Rigidbodyコンポーネント
RigidbodyはUnityで物理演算で物を動かす時などに使います。
ただ、初期設定のままで使うと、上手く積むことができません。
意図したところでピタっと止めたい場合の対処法です。
Cubeを縦に10個、横に4個積んでみました。
左側はキッチリと積めていますが、右側は揺れていて安定しません。
微妙な力がお互いに影響し合っている状態ですね。
Dragの値で調整
設定調整で簡単に動きを止めることはできます。
何をしたかというと、Dragの値を調整しました。
公式のヘルプによるとDragは
力により動く際に、オブジェクトに影響する空気抵抗の大きさ。0 の場合、空気抵抗が 0 で、無限の場合、オブジェクトは動きを止めます。
「 Drag 」値が低いと、オブジェクトが重く見えるようになります。この値が高いと、軽く見えます。「 Drag 」の通常の値は、.001 (金属の塊) と 10 (羽) の間です。
とのことです。
今回は右側のオブジェクトはDrag値:0
左側のオブジェクトはDrag値:20
にしました。
確かにDrag値を増やせば動きにくくなり安定します。
しかし、安定するということは、動かしたいときに動かしにくいということにもなります。
公式のヘルプでも"通常の値は、.001 (金属の塊) と 10 (羽) の間"との記載があります。
Dragの値での動きにくさ
同じ重さの球を同じ速さでぶつけてみます。
Drag:0
Drag:20
このように、キッチリと積むことはできても、思ったような物理演算を実現できなくなる可能性があります。
力を加えても空気抵抗が大きすぎるため、すぐに止まってしまうのです。
水中で物を動かすのに近いですね。
Rigidbodyの物理動作を止める
Rigidbodyは計算量節約のため、動作時(Awake)と停止時(Sleep)の状態を持っています。
停止状態では物理演算が行われないので、初期位置から動くことはありません。
起動時に強制的に停止状態にしておくことで、初期配置でグラグラ動いたり、はじけ飛んだりすることを防げます。
各Cubeに、下記のスクリプトを追加しました。
void Start () { this.GetComponent<Rigidbody>().Sleep(); }
停止状態は、新たにColliderが接触したりWakeUpメソッドなどで解除できます。
先ほどと同じように球をぶつけてみると、Drag:0の時と同様に崩れていきます。