今回は、FPS視点のPlayerの動きを制御していきます。 どういことかと言うと、 ・回転操作 ・直進操作 を別々に制御するということです。
以前、CameraをPlayer視点に紐付ける方法を紹介しました。 これだけでは、FPS的な動きを制御することは出来ず、Playerの動きも制御して上げる必要があります。
PCで制御することを前提に、コードを紹介します。 矢印Keyを読み取る、x・ z 変数を用意します。 最終的にやりたいのは、 ・xのとき(矢印キーでいう左右)は、Playerの向きをコントロール ・zのとき(矢印キーでいう上下)は、Playerの前進・後退をコントロール するということです。
x = Input.GetAxisRaw("Horizontal");
z = Input.GetAxisRaw("Vertical");
(1):矢印キーの左右に対して、Playerの向きをコントロールする。
float x = Input.GetAxis("Horizontal");
transform.Rotate(0,x,0, Space.World);
以前、UnityのRotateについて記事を書いたのでご確認ください。 y軸を回転させることで、x軸・z軸との面に対して回転します。
(2): 矢印キーの上下に対して、Playerの向きを前進と後退を制御する
float z = Input.GetAxis("Vertical");
矢印キーの上下インプットを取得します。重要なことは、 矢印キーの上下に対してPlayerが向いている方向に対して前進・後退をする必要があります。 sin cos を用いて、velocityを制御していくことで実現させます。 幾つかのステップに分けて説明していきます。
(a):Playerの向いている角度をsin,cosのΘの変化に対応するように調整 (b): オイラー角度 → ラジアンへ変更 (c): velocityへx軸、z軸方向へ代入
(a):Playerの向いている角度をsin,cosのΘの変化に対応するように調整
float angleY = ((360 - transform.eulerAngles.y) + 90) % 360;
transform.eulerAngles.y でPlayerが向いているオイラー角度を出力します。 ここで確認したいことは、Playerが向いている角度と、角度の変化です。 sin cos を利用していきます。 高校の数学で学んだ、あれです。 右向きにx軸・上向きにy軸・反時計回りにΘが増加していく、あれです。 Unity上でのPlayerの向いている角度を transform.eulerAngles.y で確認すると 時計回りに角度が増加していきます。 なので、ここを修正すると360 - transform.eulerAngles.y
//① z軸の方角が角度が0になっており、x軸に対して角度を0に変えたいので(360 - transform.eulerAngles.y) + 90)
//② ただ、これだと、90~450度の範囲内になるので((360 - transform.eulerAngles.y) + 90) % 360
//③
(b): オイラー角度 → ラジアンへ変更
float radian = angleY * Mathf.Deg2Rad;
(c): velocityへx軸、z軸方向へ代入
float sin = Mathf.Sin(radian);
float cos = Mathf.Cos(radian);
rb.velocity = new Vector3(cos, 0, sin);
これで、向いてる角度に前進、後退をするPlayerができます。