Как я понял, вы хотите иметь два слоя вращения - во-первых, ваш персонаж смотрит в направлении движения. Затем вы можете добавить вращение с помощью мыши. Это правильно?
Если да, то первое, что я могу порекомендовать, - это разделить вашего персонажа на два объекта. Родительское преобразование будет следовать за вашим движением. Затем его дочерний элемент изменит свое локальное вращение в соответствии с вводом мыши.
Для вращения по курсу, IMHO, лучший способ - работать с векторами, а не с кватернионами:
transform.forward = movementVector;
Если вам нужно более плавное следование, вы можете сделать следующее:
float rotationSpeed = 0.5f;
transform.forward = Vector3.RotateTowards(transform.forward, movementVector, rotationSpeed * Time.deltaTime, 0);
или
float rotationSpeed = 1f;
transform.forward = Vector3.Lerp(transform.forward, movementVector, rotationSpeed * Time.deltaTime);
Затем вы можете применить вращение к дочернему объекту, как и вы (только изменение - применить как местное вращение).
Если этот тип оснастки вам не подходит, вам нужно объединить два вращения. Для этого опять же разберемся с вектором. После применения вращения следования за движением, как описано выше, добавьте что-то вроде этого:
float Xrot = Input.GetAxisRaw("Mouse X") * speedRotation;
transform.forward += transform.right * Xrot * Time.deltaTime;
Обратите внимание на две вещи:
- В этом случае
speedRotation
, вероятно, должен быть намного меньше. Вы даже можете умножить его на 0,1f. transform.right
и transform.forward
могут быть разными для вашего персонажа, возможно, вам нужно использовать transform.up
или -transform.forward
. Смотрите на ваших локальных осях преобразования.