はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity 以前作ったFPSカメラに縦方向の制限を付けた

あいさつ

どうも、はかせです。

以前UnityでFPSっぽいカメラを作ってみました。
hakase0274.hatenablog.com

概ねの動きは上記の記事で問題ないと思うのですが、
一部問題と言うか一般的なFPSゲームのカメラの動きと
異なる部分がありました。

今回はその修正の話です。

異なる点

私が作ったものはマウスの動きに追従して
カメラの上下左右の回転を行うものでした。

動き自体はこれでいいんですが、
よくあるFPSゲームの動きと違う点が一つ。

それは
縦方向の動きに制限がないこと

ようは首が縦方向に360度回転しちゃうってことですね。
ゲームによっては問題ないかもなんで
問題ではなく異なる点と表現しましたが、
普通に人間がプレイヤーなら大問題ですね。

角度制限を付ける

360度回っちゃうのはまずいので直します。

と言ってもそこまで難しいことをするわけではなく
素直に現在の回転角度もってきて、
制限外に出る場合反映しないようにするだけです。

ではコード

using UnityEngine;

public class MouseCamera : MonoBehaviour
{
    [Header("首の横の動きをさせるオブジェクト")]
    public Transform YAxis;
    [Header("首の縦の動きをさせるオブジェクト")]
    public Transform XAxis;

    [Header("首の横の動きの感度")]
    public float XSpeed = 1.0f;
    [Header("首の縦の動きの感度")]
    public float YSpeed = 1.0f;

    [Header("首の縦の動きの限界角度")]
    public float LimitXAxizAngle = 30;

    //首の縦の動きを反映させるためのvector3
    private Vector3 mXAxiz;
    private void Start()
    {
        //カーソルをロックする
        Cursor.lockState = CursorLockMode.Locked;
        //カーソルを見えなくする
        Cursor.visible = false;

        //初期角度を取得して置く
        mXAxiz = XAxis.localEulerAngles;
    }

    // Update is called once per frame
    void Update()
    {
        //首の横の動きを計算
        float X_Rotation = Input.GetAxis("Mouse X") * XSpeed * Time.deltaTime;
        //反映
        YAxis.transform.Rotate(0, -X_Rotation, 0);

        //首の縦の動きを計算
        float Y_Rotation = Input.GetAxis("Mouse Y") * YSpeed * Time.deltaTime;
        var x = mXAxiz.x + Y_Rotation;
        //角度検証
        if (x >= -LimitXAxizAngle && x <= LimitXAxizAngle)
        {
            //問題無ければ反映
            mXAxiz.x = x;
            XAxis.localEulerAngles = mXAxiz;
        }
    }
}

一応親子関係とか初期回転が掛かってるとか考えて
Startで角度とってきてます。

後はUpdateで角度を計算し
角度制限を設けて反映するようにしました。

制限と言ったらMathf.Clampが真っ先に思いつきますが、
角度が内部的に負の値と正の値を行ったり来たりして
Clampでやるのがめんどくさいなと思ったので
素直にif文でやってます。
(いい方法あったら教えてください)

実行結果

www.youtube.com
上下の移動が途中で止まってるのが確認できるかと思います。

あと横方向には360度行けます。
(横方向は本体が回転すればいいからね)

あとがき

今回は以前作ったFPSカメラの修正でした。

FPSゲームって実は全くやらないんで
カメラの動きに気付かなかったんですよね。

ただたまに友人のFPSプレイとか見たりしてて
その時に
「そういやあんま上とか下とかに行き切らないような」
と思い今回の修正を行いました。

今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ