Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
15
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@Nekomasu

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

15
Help us understand the problem. What is going on with this article?
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
15
Help us understand the problem. What is going on with this article?