1. ホーム
  2. c#

[解決済み] Unityで垂直回転をクランプする

2022-01-31 13:43:55

質問

FPSのプロジェクトを始めました。カプセルをプレイヤーとして、空のGOをヘッドとして、カメラはヘッドの子オブジェクトとして持っています。

垂直軸で、Y回転を-70(最小)、70(最大)にクランプしています。意外と値がクランプされない。

    [SerializeField]
    private Transform playerHead;

    float inputHorizontal;
    float inputVertical; 

    float sensitivity = 50;

    float yMin = -70;
    float yMax = 70;

    Vector2 direction; // movement direction

Transform playerTransform;

void Start()
{
playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
}

    private void Update()
    {
        inputHorizontal = Input.GetAxisRaw("Mouse X");
        inputVertical = -Input.GetAxisRaw("Mouse Y"); // Inverted Input!

        direction = new Vector2(
                inputHorizontal * sensitivity * Time.deltaTime,
                Mathf.Clamp(inputVertical * sensitivity * Time.deltaTime, yMin, yMax)); // The horizontal movement and the clamped vertical movement

        playerTransform.Rotate(0, direction.x, 0);
        playerHead.Rotate(direction.y, 0, 0);
    }

direction.y

を挟んでしまうのですが、それでも頭を360度回転させることができるのです。

解決方法は?

デルタ回転をクランプしているのであって、実際の回転をクランプしているのではありません。 別の言い方をすれば direction は最終的な回転ではなく、回転の変化です。あなたが効果的に行っていることは、1フレームあたり70度の回転に制限していることです。

の実際の回転を制限したいのでしょう。 playerHead 例えば、updateの最後に以下の行を追加します。

Vector3 playerHeadEulerAngles = playerHead.rotation.eulerAngles;
playerHeadEulerAngles.y = Mathf.Clamp(playerHeadEulerAngles.y, yMin, yMax);
playerHead.rotation = Quaternion.Euler(playerHeadEulerAngles);

また、どうせ各コンポーネントを別々に使用するのであれば、方向ベクトルを作成する理由もないでしょう。