【Unity】回転する角度を制限する方法

Unity

スポンサーリンク

左右キー入力でGameObjectを回転させるさせる際に、回転できる角度を制限する方法です。

完成動作

作り方

1.シーンに各オブジェクトを配置

1-1.以下のようにBase(赤いCylinder)とNozzle(青いCylinder)を設置する。Baseが親、Nozzleが子のオブジェクトとなるようにする。
※回転角度が制限されていることがわかりやすいようにNozzleを目印とした。NozzleはZ軸方向が先端となるようにする。
流れとしてはBaseに回転制限をするスクリプトをアタッチする。

2.回転角度を制限するスクリプトを作成

2-1.RotateLimit.csという名前のスクリプトを作成して、以下のコードを記載する。
  重要な点は25~29行目の角度を0~360から-180~180に補正するところです。
  そうしないと、32行目のif文の角度制限のロジックがうまくいかない。

using UnityEngine;

public class RotateLimit : MonoBehaviour
{
    [SerializeField]
    [Tooltip("最小角度(-180~180")]
    private float MinAngle;

    [SerializeField]
    [Tooltip("最大角度(-180~180")]
    private float MaxAngle;

    [SerializeField]
    [Tooltip("回転するスピード")]
    private float rotationSpeed = 1;

    // Update is called once per frame
    void Update()
    {
        // 左右キーの入力を取得
        float horizontal = Input.GetAxis("Horizontal");
        // 現在のGameObjectのY軸方向の角度を取得
        float currentYAngle = transform.eulerAngles.y;
        // 現在の角度が180より大きい場合
		if (currentYAngle > 180)
        {
            // デフォルトでは角度は0~360なので-180~180となるように補正
            currentYAngle = currentYAngle - 360;
        }
        // (現在の角度が最小角度以上かつキー入力が0未満(左キー押下)) または (現在の角度が最大角度以下かつキー入力が0より大きい(右キー押下))の時
        if ((currentYAngle >= MinAngle && horizontal < 0) || (currentYAngle <= MaxAngle && horizontal > 0))
        {
            // Y軸を基準に回転させる
            transform.Rotate(new Vector3(0, horizontal * rotationSpeed, 0));
        }
    }
}

3.スクリプトをアタッチ

3-1.RotateLimitスクリプトを回転角度を制限させたいGameObject(今回はBaseオブジェクト)にアタッチ

4.RotateLimitスクリプトのプロパティの設定

4-1.RotateLimitスクリプトの"Min Angle"と"Max Angle"プロパティに任意の値を設定(今回は以下の図のようにした。)
※"Rotation Speed"を大きくすると回転するスピードが速くなる。

完成

これでゲームをスタートして左右キーを押すと、Baseが回転するが、4-1で設定した角度までしか回転しない。

Unity

Posted by ton