nityでのオブジェクトの 移動
方法は三種類あって、必要なコンポーネントも予め用意されている。
- CharacterController の SimpleMove() を叩く
- CharacterController の Move() を叩く
- Rigidbody の velocity の値を変更する
SimpleMoveとMove、velocityもVector3型のパラメータを必要とする。
なので controller.Move( this.transform.forward * this.speed )
のように記述することがある。この時の引数として渡す値の Vector3 の magnitude の値の単位は何なのか、ということが気になって夜も眠れないので確認してみた。
確認するために適用した各GameObjectの構成は以下の通り。
SimpleMove(緑) - CharacterController - TestSimpleMove characterController.SimpleMove() に Vector3.forward * 1f を渡す。
Move(青) - CharacterController - TestMove characterController.Move() に Vector3.forward * 1f を渡す。
Velocity (赤) - Rigidbody - TestSimpleMove rigidbody.velocity に Vector3.forward * 1f を与える。
Normal(黄色) - Rigidbody rigidbodyはつけているものの、何もしない
結果はこの通り。
Unity's Moves + from s2kw on Vimeo.
SimpleMoveとMoveの違い
SimpleMoveは重力方向への移動が優先され、接地している時のみ与えたパラメータ分の移動値が適用される。
一方、Moveは重力の影響を受けない。Rigidbodyをアタッチしても変わらないし、一緒に使うべきじゃないとも述べられている。
Velocityの場合は指定の方向への速度を与えている。そのため、移動に対する抵抗が起こった場合は回転エネルギーに変化する。
で、1はなんの1なのか
SimpleMove の 1 は velocity の1は両方とも速度。なので単位は メートル/秒 (SI単位)だ。
Move の場合はきっちり1m分の移動をする。つまり 1フレームで移動するメートル
の移動量。
velocity で移動させている赤箱の落下速度が遅い
落下速度が一定なのは、 velocity
のうち、自由落下分のベクトルが毎フレーム0にされているからそのフレームにおける自由落下量だけが0に加算されているため。
Normalはrigidbodyをつけただけで移動に関するスクリプティングはしていない。
そのためMassが1でも落下が自然であり、SimpleMoveの落下の仕方と変わらない。
用途
SimpleMove
は重力方向に移動値がもっていかれ、接地時に移動をするのでジャンプアクション系のゲーム向き。Move
は重力方向無視で、引数がそのまま移動量になるのでシューティングゲーム向き。といったところ。velocity
で重力を含めて移動を表現したい場合は重力方向のvectorを維持するようにしてあげれば再現できる。
void Update () { this.rigidbody.velocity = new Vector3(0f,this.rigidbody.velocity.y,0f) + Vector3.forward * this.speed; }