private IEnumerator AnimateSpeedTo(float value, PhysicsAnimationCurve curveFrom, PhysicsAnimationCurve curveTo) { float elapsed = 0.0f; float duration = curveFrom.TimeMultiplier; float startSpeed = gameSpeed; if (Mathf.Sign(value) != Mathf.Sign(gameSpeed) && gameSpeed != 0) { while (elapsed < duration) { if (IsPaused) { yield return(new WaitForEndOfFrame()); continue; } gameSpeed = curveFrom.Evaluate(gameSpeed, duration - elapsed) * startSpeed; elapsed += Time.deltaTime; OnSpeedChangeEvent?.Invoke(); yield return(new WaitForEndOfFrame()); } elapsed = gameSpeed = 0; } duration = curveTo.TimeMultiplier; while (elapsed < duration) { if (IsPaused) { yield return(new WaitForEndOfFrame()); continue; } gameSpeed = curveTo.Evaluate(gameSpeed, elapsed) * value; elapsed += Time.deltaTime; OnSpeedChangeEvent?.Invoke(); yield return(new WaitForEndOfFrame()); } gameSpeed = value; OnSpeedChangeEvent?.Invoke(); }
private void ChangeTime(float toValue, PhysicsAnimationCurve curveFrom, PhysicsAnimationCurve curveTo) { PrepareTimeChange(); timeInRoutine = AnimateSpeedTo(toValue, curveFrom, curveTo); runner.StartCoroutine(timeInRoutine); }