你能在 Unity 中为 RotateAround 设置最大角度吗?

Can you set max angles for RotateAround in Unity?

这并没有实现我真正想要的。它基本上只是围绕一个空的旋转,直到它达到最大值。当我使用这段代码时,它运行良好。 "maximum" 角度根据您决定先移动的方式而变化。有没有办法设置最大旋转角度?

 using UnityEngine;
using System.Collections;

public class CameraMovement : MonoBehaviour {
    Transform rotAround;
    public float maxRotation = 0;
    // Use this for initialization
    void Start () {
        rotAround = GameObject.Find ("CamRotation").GetComponent <Transform> ();
    }

    // Update is called once per frame
    void Update () {
        if (Input.GetKey (KeyCode.D) && maxRotation < 52.0f) {
            transform.RotateAround (rotAround.position, Vector3.down, 100 * Time.deltaTime);
            maxRotation += 1;
        }
        if (Input.GetKey (KeyCode.A) && maxRotation > -52.0f) {
            transform.RotateAround (rotAround.position, Vector3.up, 100 * Time.deltaTime);
            maxRotation -= 1;
        }
    }
}

为什么不使用 Random.Range(min,max) 作为最大和最小范围,然后在旋转中指定该角度。

您在每帧 maxRotation 中加 1。您需要添加 Time.deltaTime ,否则您的 maxRotation 将根据您的帧率在不同时间到达。只要改变这个,你的游戏对象就可以停止在相同的角度,无论它们转向什么方向。

这是最简单快捷的方法。另一个是做一些数学。找到反正切值(使用 Mathf.Atan2) of the difference of the rotateAround transform.position and the camera's start transform.position and then subtracting that from the camera's current transform.position minus the rotateAround position would give you the current angle (example below). You could then use this value to check if rotation should continue. See this answer 获取更多关于 Atan2 如何工作的信息。

请注意,Mathf.Atan2 returns 传递给它的向量与 X 轴之间的角度(以弧度为单位)(您可能不希望这样)。我认为 find the angle between three vectors (我认为你确实想要)你将不得不考虑他们各自的 arctans 的差异(我没有检查过这个并且它是为简洁起见的伪代码)。像这样:

float angle = 
Atan2(cameraStartPos.y - rotatePointPos.y, cameraStartPos.x - rotatePointPos.x) -
Atan2(cameraCurrentPos.y - rotatePointPos.y, cameraStartPos.x - rotatePointPos.x);

更好的是,让 unity 为您做这一切! 使用 Vector3.Angle:

float angle = Vector3.Angle(rotateAround.position - cameraStart.position,  
                            rotateAround.position - cameraEnd.position));

您的最终代码可能类似于:

public class CameraMovement : MonoBehaviour {

    Transform rotAround;
    private Vector3 startPosition;
    public float maxRotation = 0; // set this to the maximum angle in degrees

    void Start () 
    {
        rotAround = GameObject.Find ("CamRotation").GetComponent <Transform> ();
        startPosition = transform.position;
    }


    void Update () 
    {

        float currentAngle = Vector3.Angle(rotAround.position - startPosition,
                                           rotAround.position - transform.position));

        if (Input.GetKey (KeyCode.D) && maxRotation < currentAngle) 
        {
            transform.RotateAround (rotAround.position, Vector3.down, 100 * Time.deltaTime);
        }

        if (Input.GetKey (KeyCode.A) && maxRotation < currentAngle) 
        {
            transform.RotateAround (rotAround.position, Vector3.up, 100 * Time.deltaTime);
        }
    }
}

请注意,从 Vector3.Angle 返回的角度在达到 180 度时会 'flip',因此您可以将最大角度设置为 180 度以下的任何值,它会在两侧的同一点停止。