Всякий раз, когда вы хотите, чтобы что-то двигалось в течение указанного времени, я бы рекомендовал не делать это в Update
, а вместо этого использовать Coroutine . Он работает как небольшой временный метод Update
и выполняется каждый кадр до следующего yield
. это лучше поддерживать и контролировать, чем метод Update
.
Затем выполните вращение, используя Quaternion.Lerp
или также Quaternion.Slerp
, в зависимости от вашего бита. нужно
private IEnumerator RotateOverTime(Transform transformToRotate, Quaternion targetRotation, float duration)
{
var startRotation = transformToRotate.rotation;
var timePassed = 0f;
while(timePassed < duration)
{
var factor = timePassed / duration;
// optional add ease-in and -out
//factor = Mathf.SmoothStep(0, 1, factor);
transformToRotate.rotation = Quaternion.Lerp(startRotation, targetRotation, factor);
// or
//transformToRotate.rotation = Quaternion.Slerp(startRotation, targetRotation, factor);
// increae by the time passed since last frame
timePassed += time.deltaTime;
// important! This tells Unity to interrupt here, render this frame
// and continue from here in the next frame
yield return null;
}
// to be sure to end with exact values set the target rotation fix when done
transformToRotate.rotation = targetRotation;
}
Теперь, чтобы запустить эту процедуру, вы должны вызвать ее через StartCoroutine
, например,
// simply stop any other running routine so you don't get concurrent ones
StopAllCoroutines();
StartCoroutine(transformToRotate, otherTransform.rotation, 3f);