[Unity]FPSなどでの移動方向の取得方法

FPSでカメラやキャラクターの移動方向をtransform.fowardで取得して加算する方法が良く紹介されています。
例えばこんな感じ。
camはカメラのGameObjcetです。

x = Input.GetAxisRaw("Horizontal") * speed;
z = Input.GetAxisRaw("Vertical") * speed;
Vector3 comFoward = cam.transform.forward;
Vector3 pos = comFoward * z + cam.transform.right * x ;
transform.position += pos;

一応これでも動くのですが、上下方向、つまりY軸方向の成分も入っています。
通常FPSではX-Z軸での移動になりますのでこれはちょっと都合が悪い。
なので

comFoward.y = 0;

というコードを入れて、Y軸方向の成分をキャンセルします。
これで上下方向の移動に関しては問題ないんですが、上下方向の視線の角度によって、X-Z成分の移動量が変わってしまいます。つまり、真上や真下を向いたら移動できなくなってしまいます。

どの角度を向いても移動量は一定になってないと操作としてはおかしいので、これを解決します。

Vector3を正規化

回答としては、角度はそのままに、距離を1にして再計算しなおす必要があります。
X-Z成分の角度を求めて三角関数で位置を再計算してもいいのですが、そんなことしなくてもすでに用意されていました。

Vector3.normalized もしくは、Vector3.Normalize()を使えばOKです。
具体的にはこのようにしました。

x = Input.GetAxisRaw("Horizontal") * speed;
z = Input.GetAxisRaw("Vertical") * speed;
Vector3 comFoward = new Vector3(cam.transform.forward.x,0,cam.transform.forward.z).normalized;
Vector3 pos = comFoward * z + cam.transform.right * x ;
transform.position += pos;

ノーマライズを使うと、正規化されたベクトル=距離が1の座標に再計算してくれます。

タイトルとURLをコピーしました