i-school - Cinemachine FreeLook Camera の Y軸の制限方法

設計


 TPS ゲームの制作に Cinemachine を利用することで、いくつかの方法で TPS 用のカメラが制御できます。

 そのうち、Cinemachine FreeLook Cameraは、キャラクターの進行方向に対してカメラが自動的に移動し、
キャラクターの周りを360度自由に動かせるカメラ(Orbital Transposer)です。

 ただし、Y軸の回転が制限なく行われるため、カメラが意図しない位置に移動する可能性があります

 これを解消するためには、スクリプトでY軸の回転を制御する必要があります。


LimitYRotation スクリプトを作成する


 下記のサンプルコードを提示します。
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;

public class LimitYRotation : MonoBehaviour
{
    [SerializeField]
    private CinemachineFreeLook freeLookCam;
    
    [SerializeField]
    private float minYAngle = -45f; // 最小Y角度

    [SerializeField]
    private float maxYAngle = 45f; // 最大Y角度


    private void Update()
    {
        LimitFreeLookYAxis();
    }

    /// <summary>
    /// Y 軸方向の回転制御
    /// </summary>
    private void LimitFreeLookYAxis()
    {
        // Y軸の角度を取得
        float currentYAngle = freeLookCam.m_YAxis.Value * 180f;

        // Y軸の角度が制限を超えていたら修正
        if (currentYAngle < minYAngle)
        {
            freeLookCam.m_YAxis.Value = minYAngle / 180f;
        }
        else if (currentYAngle > maxYAngle)
        {
            freeLookCam.m_YAxis.Value = maxYAngle / 180f;
        }
    }
}


利用方法


 このスクリプトを新規のGameObjectにアタッチして利用します。
あるいは、Cinemachine のゲームオブジェクトでも問題ありません。

 freeLookCam 変数に Cinemachine FreeLook Cameraを割り当ててください。
また、minYAngleとmaxYAngleは制限したいY軸の角度を指定します。

 このスクリプトは、毎フレームの更新でFreeLook CameraのY軸の角度をチェックし、設定された最小値や最大値を超えていたらその角度を修正します。

 角度は度数法ではなく、Unity内部で使用される[0, 1]の範囲で管理されています。
そのため、角度を度数法からこの範囲に変換する必要があります(180で除算または乗算しているのはそのためです)。



 以上になります。