2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】FPSカメラの作り方について

Last updated at Posted at 2024-03-04

概要

FPSカメラの作り方について様々な方の方法を参考にした結果、自分的に最もいい方法2つを書きます。

方法1 CinemachineVirtualCameraの機能

FPSカメラを実装するうえで最も簡単な方法だと思います。大体のゲームではこの方法で良いでしょう。

  1. CinemachineVirtualCameraをPlayerの子供にアタッチする
    image.png

  2. 画像のようにプロパティを変更
     ・Follow
       Playerオブジェクト
     ・Body
       Transposer
       Follow Offset、Dampingを全て0
     ・Aim
       POV
       SpeedをMaxSpeedからInputValueGainに変更
    image.png
    MaxSpeedだと視点移動に加速減速が入る。好みかもしれないが。
    これだけで簡単にFPSカメラが作れる。

ChangeSens.cs
[SerializeField] private CinemachineVirtualCamera _virtualCamera;
private CinemachinePOV _cinemachinePov;

private void Awake()
{
    _cinemachinePov = _virtualCamera.GetCinemachineComponent<CinemachinePOV>();
    // InputValueGainでもm_MaxSpeedに代入
    float wishSens = 2;
    _cinemachinePov.m_VerticalAxis.m_MaxSpeed = wishSens;
    _cinemachinePov.m_HorizontalAxis.m_MaxSpeed = wishSens;
}

センシをScriptから変えたいときはVirtualCameraからCinemachinePOVGetCinemachineComponentする。

方法2 Script制御

Cinemachineだと表現できないことがあればScriptで制御する必要がある。
自分はモデルを視点移動と同期させることとリコイルの表現がしたくてこの方法をとった。
リコイルについては別記事

POVController.cs
using UnityEngine;

public class POVController : MonoBehaviour
{
    [SerializeField] private Transform _head;
    [SerializeField] private Transform _body;
    [SerializeField] private float _sensX = 5f;
    [SerializeField] private float _sensY = 5f;
    private float _yRotation, _xRotation;

    private void Update()
    {
        Look();
    }

    private void Look()
    {
        Vector2 mouseInput = new Vector2(Input.GetAxis("Mouse X") * _sensX,
            Input.GetAxis("Mouse Y") * _sensY);

        _xRotation -= mouseInput.y;
        _yRotation += mouseInput.x;
        _yRotation %= 360; // 絶対値が大きくなりすぎないように

        // 上下の視点移動量をClamp
        _xRotation = Mathf.Clamp(_xRotation, -90, 90);

        // 頭、体の向きの適用
        _head.transform.localRotation = Quaternion.Euler(_xRotation, 0, 0);
        _body.transform.localRotation = Quaternion.Euler(0, _yRotation, 0);
    }
}

マウスのインプット量だけ今の回転を増減させて反映しているだけ。
Bodyオブジェクトの子供にHeadを持っている。VirtualCameraはBodyをTransposer、AimをSameAsFollowTargetにしている。メインカメラを子供に持ってもいいが、VirtualCameraのほうが融通が利く。
image.png
FPSゲームのモデルは他視点だとX軸の回転は頭が上下し、Y軸の回転は体が左右に回転するのでXYで別のオブジェクトを回転させている。
Scriptで制御したほうがほかの機能に応用しやすい。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?