Unity 6.3 LTS|3D的当てゲームを作ろう③ プレイヤーを動かそう

Unity

これまでは同じ場所から的を狙っていました。第3回ではPlayerを作り、WASDで歩けるFPS風の操作へ発展させます。

STEP 1

Playerの土台を作ろう

カメラだけを動かすのではなく、当たり判定を持つPlayerと一緒に動かします。まずは空のPlayerを作り、Main Cameraを子にします。

HierarchyでPlayerの子にMain Cameraが入っている状態
HierarchyではPlayerを開くと、その中にMain Cameraがあります。

PlayerにはCharacter Controllerを追加します。今回はPositionを(15, 1, 0)、Radiusを0.5、Heightを2にしています。

PlayerのTransformとCharacter Controllerを設定したInspectorとSceneビュー
緑色のカプセルがPlayerの当たり判定です。下端が床に合っているかSceneビューで確認します。
POINT|親と子

これからPlayerを動かすと、子になったMain Cameraも一緒に動きます。射撃やUIのスクリプトはMain Cameraに残したまま使います。

Playerを作ったあとも照準、SCORE、TIME、射撃が動いているGameビュー
Playerを作ったあとも、照準、射撃、スコア、タイマーが動くことを確認できました。
ヒントを見る|画面の位置が変わったとき

Main CameraのLocal Positionが(0, 0, 0)になっているか確認しよう。PlayerのRotationは(0, 0, 0)にします。

MISSION

Playerの子にMain Cameraを入れ、以前の射撃ゲームがそのまま動くことを確認しよう。

STEP 2

WASDで歩こう

PlayerMove.csを作り、Playerへ付けます。まずはWで前、Aで左へ動くところまでコードを書きます。

PlayerにPlayer Moveが付き、Move Speedが4になったInspector
Player MoveはMain CameraではなくPlayerに付けます。Move Speedは4で試しました。

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);
    }
}
MISSION|SとDを自分で作ろう

WとAのコードを読み、Sで後ろ、Dで右へ進む条件を追加しよう。完成コードは先に見ず、どの数字を増やすか、減らすかを考えてみよう。

ヒントを見る|SとDの考え方

SはWの反対、DはAの反対です。同じ変数を使い、数字の変え方を反対にできないか考えよう。

WASDとマウス操作で射撃場の中を移動し、的を撃つGameビュー
SとDも追加すると、向きを変えながら射撃場を自由に歩けました。壁に向かって進むと手前で止まります。
POINT|コードを言葉にしよう

「キーから数字を作る」「カメラから方向を調べる」「方向と速さを使って動かす」の3つに分けると、長いコードも読みやすくなります。

CHALLENGE

歩きやすさを調整しよう

  • Move Speedを変え、狙いやすい速さを探そう。
  • WとAだけ、WASD全部の場合を比べよう。
  • マウスで向きを変えたあと、Wの進行方向を確かめよう。
  • 壁を通り抜けないか試そう。
次回予告

次回は、赤い的からPlayerへ向かって弾を発射する敵の攻撃処理を作ります。

コメント

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