Я использую SmoothDamp в сопрограмме для постепенного изменения размера коллайдера персонажа, когда персонаж воспроизводит анимацию приседания:
void OnRifleIdleToCrouchStart(){
float idleToCrouchVelocity = -0.01f;
IEnumerator idleToCrouchColl = smoothHeightChange(idleToCrouchVelocity, 1.45f, 1.2f, 0.38f); //smoothTime is .38 since speed for idle to crouch is 2
StartCoroutine(idleToCrouchColl);
}
IEnumerator smoothHeightChange(float idleToCrouchVelocity, float targetHeight, float targetCenterY, float smoothTime){
Debug.Log("smoothHeightChange START " + Time.time);
while(Math.Round(controller.height, 2) > targetHeight)
{
float idleToCrouchVelocityCenter = idleToCrouchVelocity * -1f;
float newHeight = Mathf.SmoothDamp(controller.height, targetHeight, ref idleToCrouchVelocity, smoothTime);
float newCenterY = Mathf.SmoothDamp(controller.center.y, targetCenterY, ref idleToCrouchVelocityCenter, smoothTime);
controller.height = newHeight;
controller.center = new Vector3(controller.center.x, newCenterY, controller.center.z);
yield return new WaitForEndOfFrame();
}
Debug.Log("smoothHeightChange FINISH " + Time.time);
}
Я ожидал, что присед займет длительность smoothTime (0,38 секунды ) но сравнение времени начала и окончания показывает, что на самом деле это занимает около 2 секунд. Я подозреваю, что это потому, что я жду конца каждого кадра в сопрограмме, и SmoothDamp предполагает, что это делается каждый кадр. Поэтому мое значение smoothDamp должно быть меньше 0,38 пропорционально времени, оставшемуся в каждом кадре в течение анимации. Но я не уверен, какое значение мне следует изменить с помощью smoothDamp, так как временные рамки кадра, вероятно, различаются в каждом кадре в течение анимации (~ 40 кадров). Как мне выполнить рефакторинг сопрограммы, для завершения которой требуется длина smoothDamp?
Спасибо!