Можете ли вы установить максимальные углы для RotateAround в Unity?
Это не выполняет то, что я хочу на самом деле. Это в основном просто вращается вокруг пустого, пока не достигнет максимума. Когда я использую этот код, он движется нормально. "Максимальный" угол изменяется в зависимости от того, каким образом вы решили двигаться первым. Есть ли способ установить максимальное вращение вокруг угла?
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 ответа
Вы добавляете 1 к maxRotation
каждый кадр. Вам нужно добавить Time.deltaTime
вместо этого ваш maxRotation
будет достигаться в разное время в зависимости от вашей частоты кадров. Простое изменение этого параметра должно привести к тому, что GameObject остановится под тем же углом, независимо от того, в какую сторону они повернуты
Это быстрый и простой способ сделать это. Другой - сделать математику. найти арктан (используя Mathf.Atan2
) разницы rotateAround
transform.position
и запуск камеры transform.position
а затем вычесть это из тока камеры transform.position
минус rotateAround
позиция даст вам текущий угол (пример ниже). Затем вы можете использовать это значение, чтобы проверить, должно ли вращение продолжаться. Смотрите этот ответ для получения дополнительной информации о том, как Atan2
работает.
Обратите внимание, что Mathf.Atan2
возвращает угол (в радианах) между вектором, переданным ему, и осью X (вы, вероятно, этого не хотите). Я думаю, чтобы найти угол между тремя векторами (что, я думаю, вы действительно хотите), вы должны будете взять разницу их соответствующих арктанов (я не проверял это, и это псевдокод для краткости). Вот так:
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, и он остановится в одной и той же точке с обеих сторон.
Почему бы вам не использовать Random.Range(min,max) для максимального и минимального диапазона, а затем назначить этот угол в повороте.