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

时间:2016-05-07 06:26:22

标签: c# unity3d rotation euler-angles

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

 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;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

每帧maxRotation加1。您需要添加Time.deltaTime,否则将根据您的帧速率在不同时间到达maxRotation。只是改变它应该使你的GameObject停止在相同的角度,无论它们转向何种方式。

这是快速而简单的方法。另一个是做一些数学。找到rotateAround transform.position和相机的开始transform.position的差值的arctan(使用Mathf.Atan2),然后从相机的当前transform.position中减去该值减去rotateAround位置会给出当前角度(例如下面的例子)。然后,您可以使用此值来检查是否应继续旋转。有关Atan2如何运作的详细信息,请参阅this answer

请注意Mathf.Atan2返回传递给它的向量与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);

甚至比这更好,让团结为你做所有这些!使用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时会“翻转”,因此您可以将最大角度设置为180以下的任何值,并且它将停在两侧的同一点。

答案 1 :(得分:-1)

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