Unityで一人称視点のカメラを作る方法|Input Systemでマウス操作

unity

はじめに

前回の記事では、UnityのInput Systemを使って、WASDキーでプレイヤーを前後左右に移動させる方法を紹介しました。

今回は、マウス操作で視点を動かせる一人称視点のカメラを作成します。

マウスを左右に動かすとプレイヤーが左右を向き、上下に動かすとカメラが上下を向くように設定していきます。

一人称視点のカメラは、FPSのようなゲームを作る際に基本となる機能です。

また、前回紹介したWASDキーによる移動と組み合わせることで、「キーボードで移動し、マウスで周囲を見回す」基本的なプレイヤー操作を実装できます。

WASDキーによるプレイヤーの移動方法については、以下の記事で詳しく解説しています。
あわせて参考にしてみてください。

UnityでWASDキーを使って移動させる方法|Input Systemで操作を実装
UnityのInput Systemを使って、WASDキーでプレイヤーを前後左右に移動させる方法を解説します。Input ActionsやPlayer Inputの設定からスクリプトまで紹介します。

一人称視点の仕組み

一人称視点では、プレイヤーとカメラを次のような構成にします。

Player
└─ Main Camera

カメラをPlayerの子オブジェクトにすることで、プレイヤーが移動するとカメラも一緒に移動します。

視点の回転については、次のように役割を分けます。

  • 左右方向:Playerを回転
  • 上下方向:Cameraを回転

このように分けることで、プレイヤーが左右を向きながら、カメラだけを上下に動かせるようになります。


カメラをPlayerの子にする

まず、一人称視点で使用するカメラをシーンに追加します。

Hierarchy上で右クリックし、Cameraを選択します。

追加したCameraをPlayerの子オブジェクトにするため、CameraをPlayerの上にドラッグ&ドロップします。

Player
└─ Main Camera

必要であれば、Cameraの名前をMain Cameraなどに変更しておきます。

次に、Main Cameraを選択し、InspectorのTransformから位置を調整します。

一人称視点では、プレイヤーの頭のあたりにCameraを配置します。Playerの高さに合わせて、PositionのYを調整してください。

実際の位置は、使用しているプレイヤーのモデルやゲームの構成に合わせて調整します。

CameraをPlayerの子オブジェクトにすることで、Playerが移動するとCameraも一緒に移動するようになります。


Input SystemにLookを追加する

次に、マウス操作を受け取るためのInput Actionを追加します。

前回の記事で使用したInput Actionsを開き、LookというActionを作成します。

設定は以下のようにします。

  • Action Type:Value
  • Control Type:Vector2

BindingのPathには、

Delta[Mouse]

を設定します。

Mouse Deltaは、マウスをどの方向にどれだけ動かしたかを取得するための入力です。

これによって、マウスの左右・上下の移動量をVector2として取得できます。


PlayerControllerに視点操作を追加する

前回作成したPlayerControllerに、マウス操作による視点移動の処理を追加します。

まず、Cameraを操作するための変数と、カメラの上下方向の回転角度を管理する変数を追加します。

[SerializeField] private Camera playerCamera;
[SerializeField] private float lookSpeed = 0.1f;

private float cameraPitch = 0f;

次に、Input Systemからマウスの移動量を受け取るため、OnLook()を追加します。

public void OnLook(InputValue value)
{
    Vector2 lookInput = value.Get<Vector2>();

    float mouseX = lookInput.x * lookSpeed;
    float mouseY = lookInput.y * lookSpeed;

    // プレイヤーを左右に回転
    transform.Rotate(Vector3.up * mouseX);

    // カメラを上下に回転
    cameraPitch -= mouseY;
    cameraPitch = Mathf.Clamp(cameraPitch, -90f, 90f);

    playerCamera.transform.localRotation =
        Quaternion.Euler(cameraPitch, 0f, 0f);
}

このOnLook()では、マウスの移動量を取得し、左右の動きはPlayer、上下の動きはCameraにそれぞれ適用しています。

Playerを左右に回転させる

まず、マウスの左右方向の移動量を取得します。

float mouseX = lookInput.x * lookSpeed;

取得した値を使って、PlayerをY軸方向に回転させます。

transform.Rotate(Vector3.up * mouseX);

これによって、

  • マウスを右に動かす → Playerが右を向く
  • マウスを左に動かす → Playerが左を向く

という動作になります。

Cameraを上下に回転させる

次に、マウスの上下方向の移動量を取得します。

float mouseY = lookInput.y * lookSpeed;

この値を使って、Cameraの上下方向の回転角度をcameraPitchで管理します。

cameraPitch -= mouseY;

cameraPitchの値をそのまま増減させることで、マウスを動かすたびにCameraの上下方向の角度を更新できます。

ただし、このままだとCameraが上下に回転し続けてしまうため、回転範囲を制限します。

cameraPitch = Mathf.Clamp(cameraPitch, -90f, 90f);

これによって、Cameraの上下方向の回転を**-90度から90度まで**に制限できます。

最後に、計算した角度をCameraのローカル回転に適用します。

playerCamera.transform.localRotation =
    Quaternion.Euler(cameraPitch, 0f, 0f);

CameraPlayerの子オブジェクトになっているため、localRotationを使うことで、Playerの向きを基準にCameraだけを上下に回転させることができます。

追加後の完成コード

ここまでの処理を追加すると、PlayerControllerは以下のようになります。

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    public float moveSpeed = 5f;

    [SerializeField] private Camera playerCamera;
    [SerializeField] private float lookSpeed = 0.1f;

    private Vector2 moveInput;
    private float cameraPitch = 0f;


    public void OnMove(InputValue value)
    {
        moveInput = value.Get<Vector2>();
    }

    public void OnLook(InputValue value)
    {
        Vector2 lookInput = value.Get<Vector2>();

        float mouseX = lookInput.x * lookSpeed;
        float mouseY = lookInput.y * lookSpeed;

        // プレイヤーを左右に回転
        transform.Rotate(Vector3.up * mouseX);

        // カメラを上下に回転
        cameraPitch -= mouseY;
        cameraPitch = Mathf.Clamp(cameraPitch, -90f, 90f);

        playerCamera.transform.localRotation =
            Quaternion.Euler(cameraPitch, 0f, 0f);
    }

    void Update()
    {
        Vector3 movement = new Vector3(moveInput.x, 0, moveInput.y);

        transform.Translate(
            movement * moveSpeed * Time.deltaTime
        );
    }
}

前回作成したWASDによる移動処理はそのまま残し、今回追加したOnLook()によってマウスによる視点操作を加えています。


InspectorでCameraを設定する

スクリプトを変更すると、Inspectorに新しくPlayer CameraLook Speedの項目が追加されます。

Player Cameraの項目に、HierarchyにあるMain Cameraをドラッグ&ドロップします。

Look Speedはマウス操作による視点の移動速度を設定する項目です。

これで、スクリプトからMain Cameraを操作できるようになります。


実際に動かしてみる

設定が完了したら、ゲームを再生します。

WASDキーでPlayerを移動しながらマウスを動かしてみましょう。

WASD       → プレイヤーを移動
マウス左右 → 左右を向く
マウス上下 → 上下を見る

これで、基本的な一人称視点の操作が完成です。


マウス感度を調整する

マウスを動かしたときの視点の速さは、lookSpeedで調整できます。

値を大きくすると視点が速く動き、小さくするとゆっくり動きます。

ゲームを実際に操作しながら、自分が操作しやすい数値に調整するとよいでしょう。


まとめ

今回は、UnityのInput Systemを使って一人称視点のカメラを作成しました。

ポイントは、PlayerとCameraで回転する方向を分けることです。

  • Playerを左右に回転させる
  • Cameraを上下に回転させる
  • CameraをPlayerの子オブジェクトにする
  • Input SystemのLookでマウス入力を取得する
  • Cameraの上下方向には回転制限を設定する

WASDによる移動と組み合わせることで、FPSのような基本的なプレイヤー操作を作れるようになります。

今後、ジャンプや重力、地面や壁との判定などを追加していくことで、よりゲームらしいプレイヤー操作へ発展させることができます。