Unity
0

”””FPSのカメラみたいにZ軸のローテーションが入らないヤツ”””

概要

カメラを回転させると「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()に渡してやるのがいいと思います。