これまでは同じ場所から的を狙っていました。第3回ではPlayerを作り、WASDで歩けるFPS風の操作へ発展させます。
Playerの土台を作ろう
カメラだけを動かすのではなく、当たり判定を持つPlayerと一緒に動かします。まずは空のPlayerを作り、Main Cameraを子にします。
PlayerにはCharacter Controllerを追加します。今回はPositionを(15, 1, 0)、Radiusを0.5、Heightを2にしています。
これからPlayerを動かすと、子になったMain Cameraも一緒に動きます。射撃やUIのスクリプトはMain Cameraに残したまま使います。
ヒントを見る|画面の位置が変わったとき
Main CameraのLocal Positionが(0, 0, 0)になっているか確認しよう。PlayerのRotationは(0, 0, 0)にします。
Playerの子にMain Cameraを入れ、以前の射撃ゲームがそのまま動くことを確認しよう。
WASDで歩こう
PlayerMove.csを作り、Playerへ付けます。まずはWで前、Aで左へ動くところまでコードを書きます。
1|移動に使う部品を準備する
public float moveSpeed = 4f;
CharacterController controller;
Transform cameraTransform;
void Start()
{
controller = GetComponent<CharacterController>();
cameraTransform = Camera.main.transform;
}
controllerにはPlayerのCharacter Controller、cameraTransformにはMain Cameraの向きを入れます。
2|WとAが押されているか調べる
float horizontal = 0f;
float vertical = 0f;
if (Keyboard.current.aKey.isPressed)
{
horizontal -= 1f;
}
if (Keyboard.current.wKey.isPressed)
{
vertical += 1f;
}
horizontalは左右、verticalは前後を表します。Aは左なので左右の数字を減らし、Wは前なので前後の数字を増やします。
3|カメラから前と右を調べる
Vector3 forward = cameraTransform.forward;
Vector3 right = cameraTransform.right;
forward.y = 0f;
right.y = 0f;
forward.Normalize();
right.Normalize();
マウスで向きを変えたあとも、見ている方向へ進むための処理です。Yを0にすると、上を見ながらWを押しても空へ進みません。
4|方向を合わせてPlayerを動かす
Vector3 move =
forward * vertical + right * horizontal;
move = Vector3.ClampMagnitude(move, 1f);
controller.Move(
move * moveSpeed * Time.deltaTime);
方向 × 速さ × 前のフレームから進んだ時間をCharacter Controllerへ渡します。ClampMagnitudeは、2つのキーを同時に押したときだけ速くなることを防ぎます。
ここまでのPlayerMove.csを確認する
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMove : MonoBehaviour
{
public float moveSpeed = 4f;
CharacterController controller;
Transform cameraTransform;
void Start()
{
controller = GetComponent<CharacterController>();
cameraTransform = Camera.main.transform;
}
void Update()
{
if (Keyboard.current == null)
{
return;
}
float horizontal = 0f;
float vertical = 0f;
if (Keyboard.current.aKey.isPressed)
{
horizontal -= 1f;
}
if (Keyboard.current.wKey.isPressed)
{
vertical += 1f;
}
Vector3 forward = cameraTransform.forward;
Vector3 right = cameraTransform.right;
forward.y = 0f;
right.y = 0f;
forward.Normalize();
right.Normalize();
Vector3 move =
forward * vertical + right * horizontal;
move = Vector3.ClampMagnitude(move, 1f);
controller.Move(
move * moveSpeed * Time.deltaTime);
}
}
WとAのコードを読み、Sで後ろ、Dで右へ進む条件を追加しよう。完成コードは先に見ず、どの数字を増やすか、減らすかを考えてみよう。
ヒントを見る|SとDの考え方
SはWの反対、DはAの反対です。同じ変数を使い、数字の変え方を反対にできないか考えよう。
「キーから数字を作る」「カメラから方向を調べる」「方向と速さを使って動かす」の3つに分けると、長いコードも読みやすくなります。
歩きやすさを調整しよう
- Move Speedを変え、狙いやすい速さを探そう。
- WとAだけ、WASD全部の場合を比べよう。
- マウスで向きを変えたあと、Wの進行方向を確かめよう。
- 壁を通り抜けないか試そう。
次回は、赤い的からPlayerへ向かって弾を発射する敵の攻撃処理を作ります。


コメント