У меня проблема, я делаю сценарий плавного движения камеры и не могу понять, как правильно зафиксировать вращение камеры.
На самом деле, камера является дочерним объектом объекта игрока.
Когда нажимается WASD, проигрыватель поворачивается, но камера не выполняет это вращение из-за сценария.
var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
mouseDelta = Vector2.Scale(mouseDelta, CursorSensitivity); //new Vector2(CursorSensitivity.x * smoothing.x, CursorSensitivity.y * smoothing.y));
if (m_doSmooth)
{
_smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x);
_smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y);
// Find the absolute mouse movement value from point zero.
_mouseAbsolute += _smoothMouse;
}
else
_mouseAbsolute += mouseDelta;
if (clampInDegrees.x > 0)
_mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x, clampInDegrees.x);
if (clampInDegrees.y > 0)
_mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y, clampInDegrees.y);
Camera.transform.rotation = Quaternion.AngleAxis(-_mouseAbsolute.x, Vector3.up) //transform.InverseTransformDirection(Vector3.up))
* Quaternion.AngleAxis(_mouseAbsolute.y, Vector3.right);
Что ж, проблема проста, фиксированные значения поворота являются глобальными,потому что мы устанавливаем Camera.transform.rotation
вместо Camera.transform.localRotation
.
И это происходит: Ссылка на видео
Скрипт ограничивает значения в соответствии с ротацией игрока.
Таким образом, если у нас есть вращение (eulerAngle) на плеере по оси X на 90 градусов, а значение зажима составляет от 90 до -90, то зафиксированное вращение будет 0, 180 вместо -90, 90.
Но если я изменю с rotation
на localRotation
, это произойдет: Ссылка на видео
Я также попробовал следующее:
Vector3 euler = Camera.transform.eulerAngles;
if (clampInDegrees.x > 0)
euler.x = ClampAngle(euler.x, -clampInDegrees.x, clampInDegrees.x);
if (clampInDegrees.x > 0)
euler.y = ClampAngle(euler.y, -clampInDegrees.y, clampInDegrees.y);
Camera.transform.eulerAngles = euler;
Послеустановка localRotation
... Но это только делает странные вещи.Как, например, при достижении минимального значения зажима при вращении зажим возвращает максимальное значение зажима.