Не могу написать код для нормального вращения камеры мышкой. Сначала я написал по принципу Эйлера. То есть, двигаем мышь, берём разницу между текущей и предыдущей позицией, добавляем эту разницу к текущим углам разворота, возвращаем мышь на предыдущую позицию. Но это не работает. Точнее, работает, но камера вращается как пьяная. Не зависимо от того, залочен курсор или нет.
Потом я начал искать чужой код и обнаружил, что везде используется тот самый принцип Эйлера, который использовал я. Вариации кода разные, но принцип везде один - углы Эйлера и mouse delta
.
Вот например:
public float mouseSensitivity = 100f;
private float xRotation = 0f;
private float yRotation = 0f;
...
float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
xRotation -= mouseY;
yRotation += mouseX;
transform.localRotation = Quaternion.Euler(xRotation, yRotation, 0f);
Этот код работает так же, как и мой. Пьяная камера не зависимо от того, залочен курсор или нет.
А вот этот:
const float camSens = 0.25f;
lastMouse = Input.mousePosition - lastMouse;
lastMouse = new Vector3(-lastMouse.y * camSens, lastMouse.x * camSens, 0);
lastMouse = new Vector3(transform.eulerAngles.x + lastMouse.x, transform.eulerAngles.y + lastMouse.y, 0);
transform.eulerAngles = lastMouse;
lastMouse = Input.mousePosition;
Работает нормально, но только если курсор не залочен. Если курсор залочить, то камера просто дёргается на месте и не разворачивается. А если просто скрыть курсор (без залочивания), то скрыт он будет только в пределах окна Unity. Разворачивая камеру и стреляя в объект, окно Unity тупо потеряет фокус, так как мышка выйдет за его пределы. То есть, смысла в скрытии курсора нет абсолютно никакого. Зачем тогда существует такая возможность - не ясно.
Других вариантов кода не нашел Либо они какие-то совсем замудрёные. Вплоть до импорта функций из WinAPI
Я раньше много видосиков про Unity смотрел, но не помню, чтобы у кого-то была такая фигня