这并不是我想要的。它基本上只是围绕一个空转,直到达到最大值。当我使用此代码时,它移动正常。 "最大"角度根据您决定先移动的方式而变化。有没有办法围绕角度设置最大旋转?
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;
}
}
}
答案 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)作为最大和最小范围,然后在旋转中指定该角度。