你能在 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 度以下的任何值,它会在两侧的同一点停止。
这并没有实现我真正想要的。它基本上只是围绕一个空的旋转,直到它达到最大值。当我使用这段代码时,它运行良好。 "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 度以下的任何值,它会在两侧的同一点停止。