Unity3D хранит вращения в довольно абстрактном математическом представлении под названием quaternion . Преобразование из и в углы Эйлера (что вы видите в редакторе Unity) включает в себя каскад тригонометрических функций и, таким образом, склонен к ошибкам округления, особенно для простого типа с плавающей точкой.
Чтобы обойти эту проблему в вашем случае, я рекомендую сохранить исходный объект Quaternion перед началом вращения и установить его в конце процесса. Какой-то псевдокод:
public class RotationController : MonoBehaviour {
Quaternion rotationAtStart;
int numOfRotations = 0;
void rotate () {
numOfRotations++;
if (numOfRotations == 1) {
rotationAtStart = transform.rotation;
} else if (numOfRotations < 9) {
transform.Rotate (new Vector3 (0,40.0f,0));
} else if (numOfRotations == 9) {
transform.rotation = rotationAtStart;
}
}
void Update () {
if (numOfRotations < 9) {
rotate ();
}
}
}
Особая ситуация в 360 ° делает этот подход устойчивым. Менее чем на 360 ° вы должны жить с небольшими ошибками округления. Для этого случая я бы рекомендовал рассчитать целевой кватернион Quaternion.RotateTowards
и установить его на последнем шаге, аналогичном случаю 360.
Еще одна полезная вещь для вас - Анимации . Вы можете определить анимацию как плавную или дискретную и просто вызвать GameObject.animation.Play("MyRotation")
, если нажата «i». Используйте AnimationEvent в конце, чтобы получить информацию о завершении анимации.
И, наконец, Mathf содержит функцию Приблизительно , которая занимается проблемой неточности с плавающей запятой.