Edited at

【Unity】”FPSみたいなカメラの実装”


概要

カメラを回転させると「X軸 Y軸 Z軸 の回転になってしまい大変…」という事があると思います。

なので”””FPSとかでよくあるあのカメラがほしい”””という気持ちを書きました。


手順

1.Unityの[Hierarchy]で右クリックをして[Create Empty]を押す

2.GameObjectで新規オブジェクトができるので、Transformを0,0,0にリセットして[CameraRig]など分かりやす名前にリネームする。

3.CameraMover.csを[CameraRig]にアタッチする。

4.[CameraRig]の子にゲーム画面のレンダリングに使うカメラを配置する。


CameraMover.cs

using System.Collections;

using System.Collections.Generic;
using UnityEngine;

public class CameraMover : MonoBehaviour
{
//cameraのtransform
private Transform _camTransform;

//マウス操作の始点
private Vector3 _startMousePos;

//カメラ回転の始点情報
private Vector3 _presentCamRotation;

void Start ()
{
_camTransform = this.gameObject.transform;
}

void Update ()
{
//カメラの回転 マウス
CameraRotationMouseControl();
}

//カメラの回転 マウス
private void CameraRotationMouseControl()
{
if (Input.GetMouseButtonDown(0))
{
_startMousePos = Input.mousePosition;
_presentCamRotation.x = _camTransform.transform.eulerAngles.x;
_presentCamRotation.y = _camTransform.transform.eulerAngles.y;
}

if (Input.GetMouseButton(0))
{
//(移動開始座標 - マウスの現在座標) / 解像度 で正規化
float x = (_startMousePos.x - Input.mousePosition.x) / Screen.width;
float y = (_startMousePos.y - Input.mousePosition.y) / Screen.height;

//回転開始角度 + マウスの変化量 * 90
float eulerX = _presentCamRotation.x + y * 90.0f;
float eulerY = _presentCamRotation.y + x * 90.0f;

_camTransform.rotation = Quaternion.Euler(eulerX, eulerY, 0);
}
}

}



解説

マウスの入力を正規化してる部分については、Cameraのスクリプトに似たような関数があると思いますが特定のCameraを参照してなくても使えるようにするために書きました。

※カメラのクラスを使うなら ScreenToViewportPoint あたり?

マウスの入力に関する部分は適宜書き換えてよいかと思います。

 _camTransform.rotation = Quaternion.Euler(eulerX, eulerY, 0);

Z回転の傾きが入ってこない理由ですが、現在の状態を保存しながらZ回転を含まない値を使って毎フレーム現在のカメラの状態を決めてるからです。

おそらく純粋にクォータニオンを扱って回転させると「現在の状態を保存する(2つの回転を合成する)」という部分で厳しいと思うので、分かりやすく「現在の状態とマウスの操作量を合計した値」をQuaternion.Euler()に渡してやる形にしました。

float eulerX = _presentCamRotation.x + y * 90.0f;

ゲームで使う事を考えてないので、正規化されたマウスの変化量に「90の定数」を掛けてますが、ここを変数にすればマウス感度の変更機能などをつけれると思います。