CharacterControllerのMoveの1とSimpleMoveの1

nityでのオブジェクトの 移動 方法は三種類あって、必要なコンポーネントも予め用意されている。

  • CharacterController の SimpleMove() を叩く
  • CharacterController の Move() を叩く
  • Rigidbody の velocity の値を変更する

SimpleMoveとMove、velocityもVector3型のパラメータを必要とする。

なので controller.Move( this.transform.forward * this.speed )のように記述することがある。この時の引数として渡す値の Vector3 の magnitude の値の単位は何なのか、ということが気になって夜も眠れないので確認してみた。

確認するために適用した各GameObjectの構成は以下の通り。

Ad

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;
    }

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です