Мы можем упростить функцию кварта и инвертировать, зажимая входы от 0 до 1 (что также ограничивает выходы):
public float EaseInQuart(float t) {
return Mathf.Pow(Mathf.Clamp01(t),4f);
}
public float InverseEaseInQuart(float x) {
return Mathf.Pow(Mathf.Clamp01(x),0.25f);
}
Теперь мы можем взять текущую скорость, разделить ее на максимальную скорость, чтобы получить наш x
член.
Преобразуйте это, используя наш метод InverseEaseInQuart
, чтобы получить линейный t-член, который мы можем изменить на deltaTime
, масштабированный до некоторого значения acceleration
.
Затем мы используем преобразование обратно в x, используя EaseInQuart
, и затем умножаем это на максимальную скорость, чтобы получить нашу новую текущую скорость.
В целом это можно записать так:
public float maxSpeed = 25f;
public float speed = 0f;
public float acceleration = 0.1f; // (0 to maxSpeed in 10 seconds)
public float EaseInQuart(float t) {
return Mathf.Pow(Mathf.Clamp01(t),4f);
}
public float InverseEaseInQuart(float x) {
return Mathf.Pow(Mathf.Clamp01(x),0.25f);
}
void Update(){
float x = speed / maxSpeed;
float t = InverseEaseInQuart(x);
t += Time.deltaTime * acceleration;
x = EaseInQuart(t);
speed = x * maxSpeed;
}