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文でやってます。
(いい方法あったら教えてください)