Вы добавляете 1 до maxRotation
в каждый кадр. Вам нужно добавить Time.deltaTime
, иначе ваше maxRotation
будет доступно в разное время в зависимости от вашей частоты кадров. Простое изменение этого должно привести к тому, что ваш GameObject остановится под тем же углом, независимо от того, как он поворачивается.
Это быстрый и простой способ сделать это. Другой - сделать некоторые математические вычисления. нахождение arctan (с использованием Mathf.Atan2
) разности transform.position
и стартом transform.position
камеры, а затем вычитание из текущего тока камеры transform.position
минус позиция rotateAround
даст вам текущий угол (пример ниже). Затем вы можете использовать это значение для проверки продолжения вращения. См. this answer для получения дополнительной информации о работе Atan2
.
Обратите внимание, что 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, и оно будет остановлено в одной и той же точке с обеих сторон.
100 * Time.deltaTime не равно 1, это неправильное предположение. Infact, вы никогда не сможете сказать, что Time.deltaTime будет следующим фреймом, но его примерно 1/60, поэтому 0,016667. – yes
@MikeSmith вы никогда не должны рассчитывать на постоянство константы Time.deltaTime. Это просто время, прошедшее между текущим и последним кадрами. Это делает его полезным для регулирования расчетов с нерегулярной частотой кадров. –
@yes Mm, извините, но я этого не сделал. Я думал, что это частота кадров, которая может варьироваться. Я использовал 100, потому что на моих оригинальных 50, движение камеры было слишком медленным. Если вы не комментируете кого-то другого. –