Вам необходимо зафиксировать вращение, чтобы не допустить выброса за один кадр вращения.Вот один из способов сделать это.
Установить поворот цели:
Quaternion goalRotation = Quaternion.Euler(0f,0f,0f); // or Quaternion.identity
Найти, насколько далеко вращение первого преобразования от градусов:
float angleToGoal = Quaternion.Angle(goalRotation, animators[0].transform.localRotation);
Определите, что меньше: угол, заданный скоростью * delta time или оставшимся углом, чтобы определить, как далеко вы должны повернуть этот кадр. Это важная зажимная часть :
float angleThisFrame = Mathf.Min(angleToGoal, rotationSpeed * Time.deltaTime);
Затем поверните на эту величину.А если вы повернули на angleToGoal
, то установите endRot = true;
.
Это может выглядеть так:
if (distanceFromTarget < 2f)
{
for (int i = 0; i < animators.Length; i++)
{
animators[i].SetFloat("Walking Speed", 0);
}
if (!endRot)
{
Quaternion goalRotation = Quaternion.Euler(0f,0f,0f);
float angleToGoal = Quaternion.Angle(
goalRotation,
animators[0].transform.localRotation);
float angleThisFrame = Mathf.Min(angleToGoal, rotationSpeed * Time.deltaTime);
// use axis of Vector3.down to keep angles positive for ease of use
animators[0].transform.Rotate(Vector3.down, angleThisFrame);
animators[1].transform.Rotate(Vector3.up, angleThisFrame);
// We end if we rotated the remaining amount.
endRot = (angleThisFrame == angleToGoal);
}
}