Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

カメラを回転させると「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の定数」を掛けてますが、ここを変数にすればマウス感度の変更機能などをつけれると思います。

Nekomasu
初心者
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした