はじめに
こんにちは たこといいます。
LifeisTech!TokaiAdventCalenderの12/18用に書きます。
今回はUnityをやっていて、疑問に思っていたけど理由までははっきり分からなかったことを、こういう機会がないとやらないので、自分で調べてみようと思いました。
そのテーマが、RigidbodyのConstraintsとtransform.position、AddForceについてです。
きっかけは下のGIFのように、ボールを矢印キーで動かし、落ちたらスタート地点に戻るという際に、矢印キーを離しているのに勝手に転がってしまうのはなんでなんだろうと思ったからです。
これの解決策自体はRigidbodyのConstraintsのFreeze Rotation xとFreeze Rotation zにチェックを入れることで解決するのですが、理由はいまいち分からりませんでした。
そこで今回は、Sphereを以下のような条件(A~F)で場合分けをして調べました。
#実験
・床とSphereを用意
・Sphereを矢印キーで前後左右に動かすスクリプトを用意
・Sphereに、Rigidbodyをつける
・Sphereは最初(0,3,0)の位置にあり再生すると床まで落下し静止
Sphereの動かし方 | Physic Material | |
---|---|---|
A | transform.position | なし |
B | transform.position | あり 動摩擦力・静止摩擦力1 |
C | transform.position | あり 動摩擦力・静止摩擦力0 |
D | AddForce | なし |
E | AddForce | あり 動摩擦力・静止摩擦力1 |
F | AddForce | あり 動摩擦力・静止摩擦力0 |
そして、各A~Fの条件の下で、RigidbodyのConstraintsの選択を下の表の32パターンにし、Sphereの動きを調べました。(Position yにチェックを入れると始めに落下しないため除外)
Constraints | の | チェック | を | 入れた | 項目 | |
---|---|---|---|---|---|---|
何もなし | Pos x | Pos z | Pos x,z | Rot x | Rot y | Rot z |
Rot x,y | Rot x,z | Rot y,z | Rot x,y,z | Pos x Rot x | Pos x Rot y | Pos x Rot z |
Pos x Rot x,y | Pos x Rot x,z | Pos x Rot y,z | Pos x Rot x,y,z | Pos z Rot x | Pos z Rot y | Pos z Rot z |
Pos z Rot x,y | Pos z Rot x,z | Pos z Rot y,z | Pos z Rot x,y,z | Pos x,z Rot x | Pos x,z Rot y | Pos x,z Rot z |
Pos x,z Rot x,y | Pos x,z Rot x,z | Pos x,z Rot y,z | Pos x,z Rot x,y,z |
#結果
ボールを矢印キーでしっかりコントロールでき、落下後もスタート地点で静止させるのに必要な条件はこのようになりました。
・条件A~C(Sphereをtransform.positionで動かす場合)では、少なくともFreeze Rotation x とFreeze Rotation zの二つのチェックを入れる
・条件D,E(SphereをAddForceで動かす場合)の下でうまくいく条件は存在しない
・条件F(SphereをAddForceで動かす場合)の下で少なくともFreeze Rotation x と Freeze Rotaion zの二つにチェックを入れる必要
#他に分かったこと
・条件D~Fで、Freeze Positionにチェックを入れると矢印キーを押しても動かないが、条件A~Cで、Freeze Position にチェックを入れると矢印キーを押したら動く
・条件D,EでFreeze Rotation x と Freeze Rotation zの二つにチェックを入れて再生すると、すごくゆっくり動く
・条件A~Cでは、Physic Materialの有無で結果は変わらなかった
・条件A~Cでは、1のようにぬるっと落ちない場合と、始めのうちはスタート地点に戻った後も原点で停止する
しかし、2のように落ちるとスタート地点に戻った後も勝手に転がる
###1 ぬるっと落ちない
#考えたこと
Sphereでは、軸が回転することによる力がボールにかかっているため、その力により勝手に動き出すのではないかということを考えました。
・条件A~Cでは、positionを直接動かすので、落ち方によってはあまりSphereが回転せず落下するのでスタート地点に戻った後も静止する
・条件D~Fでは、力をSphereに加えることで動かすため、左右キーを押すとPositionが左右に動くだけでなく、z軸を回転軸とし回転する力も加わるため左右キーを離しても回転し、力はかかり続ける
そのため、RotationxとRotationzにチェックを入れることで、Sphereは回転せず動きます。つまり、回転による力がかからなくなり、矢印キーを離しても動くことはなくなります。
また今回の実験では、SphereをCubeに変えて同じことをしました。
CubeはSphereほど、勝手に転がる現象は見られませんでしたが、条件D~Fの際に、すごくゆっくり動くかまったく動かない状況になり、なぜすべての項目でスムーズに動かなかったのかは新しく疑問に思いました。これはまた考えてみようと思います。
#感想
調べる項目が多くて大変だったけど、少しもやもやしていた所がすっきりしたのでやって良かったと思いました。
ゲームのことを考えると、ボールが矢印キーを離した後も勝手に転がってしまうから落ちないようにコントロールすること自体は面白いと思います。でも、落下してスタート地点に戻ってきてもう一度やろうとしたら、すごいスピードで転がってしまっていては自分でボールを操作できないので、そうしたい場合はリロードしたりすればいいのかなと思いました。
ありがとうございました。