UnityでFPS視点のPlayerを作る方法

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

Unityで、FPS視点のCameraを作成する方法

FPSゲームが盛り上がっていますね。
今回は、FPS視点のCameraを作る方法について解説します。

▼簡単に流れ
( 1 ):Playerの子階層に、新しくGameObject cameraFollowを作成
( 2 ):Main camera に New Scriptを追加
( 3 ):GameObject cameraFollow に、Main Camera position, rotationを紐づける

( 1 ):Playerの子階層に、新しくGameObject cameraFollowを作成

Hierarchy でPlayerの子階層にgameobjectを追加

cameraFollow の positionにMain cameraのpositionをもってきます。
好きな位置でいいです。
※注意したいのは、ここのpositionはPlayerに対しての相対的なpositionになること。

( 2 ):Main camera に New Scriptを追加

Hierarchyの中の、MainCameraを選択した状態で、
Add Component → New Script

( 3 ): GameObject cameraFollow に、Main Camera position, rotationを紐づける

(2)で作成したMain Cameraのscriptにコードを書きます。

void Update() {     

\\ cameraFollow はPlayerの子階層に作成したgameobject
transform.position = GameObject.Find(" cameraFollow ").transform.position; 
   
transform.rotation = GameObject.Find(" cameraFollow  ").transform.rotation; 

}