概要
FPSカメラの作り方について様々な方の方法を参考にした結果、自分的に最もいい方法2つを書きます。
方法1 CinemachineVirtualCameraの機能
FPSカメラを実装するうえで最も簡単な方法だと思います。大体のゲームではこの方法で良いでしょう。
-
画像のようにプロパティを変更
・Follow
Playerオブジェクト
・Body
Transposer
Follow Offset、Dampingを全て0
・Aim
POV
SpeedをMaxSpeedからInputValueGainに変更
MaxSpeedだと視点移動に加速減速が入る。好みかもしれないが。
これだけで簡単にFPSカメラが作れる。
[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からCinemachinePOVをGetCinemachineComponentする。
方法2 Script制御
Cinemachineだと表現できないことがあればScriptで制御する必要がある。
自分はモデルを視点移動と同期させることとリコイルの表現がしたくてこの方法をとった。
リコイルについては別記事。
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のほうが融通が利く。
FPSゲームのモデルは他視点だとX軸の回転は頭が上下し、Y軸の回転は体が左右に回転するのでXYで別のオブジェクトを回転させている。
Scriptで制御したほうがほかの機能に応用しやすい。