■カメラを基準とする理由
次の画像のようにカメラの映像がワールド空間と一致する場合、void Move(){
float h = Input.GetAxisRaw ("Horizontal");
float v = Input.GetAxisRaw ("Vertical");
Vector3 movement = new Vector3(h, 0f, v);
movement = movement.normalized * speed * Time.deltaTime;
playerRigidbody.MovePosition (transform.position + movement);
}
のようにして動かすことができる。
しかし、カメラの映像がワールド空間と一致しない場合はこの手段は使えない。例えば、次の図のようにキャラクターを右側面から映した場合を考える。このとき前述のスクリプトで上入力をした場合、キャラクターはワールド空間の上方向に移動するが、カメラから見ると右方向に移動しているように見える。
よって、Input.GetAxis ("Vertical")によるプレイヤーの移動方向はカメラのforward軸、Input.GetAxis ("Horizontal")によるプレイヤーの移動方向はカメラのright軸にする必要がある。要はプレイヤー移動はワールド空間ではなく、カメラのローカル空間で考える必要がある。また、Rigidbody.MovePosition等のGameObjectを移動させるための関数はワールド空間で計算するため、ローカル空間とワールド空間の変換が必要となる。
なお、カメラに仰角俯角をつけているとその方向を進行方向とみなしてしまうため、XZ平面を移動させたい場合はy成分を除去しておく必要がある。最終的なスクリプトは下記。
0 件のコメント:
コメントを投稿