今回は、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ができます。