Ускоряйте плавание, а не замедляйте с Mathf.SmoothDamp - Unity 3D - PullRequest
1 голос
/ 26 июня 2019

Я использую Mathf.SmoothDamp, чтобы замедлить скорость, и мне это удалось! Но я не знаю, как ускорить значение этого поплавка, теперь я только хочу медленно разогнаться в начале и перейти к максимальному ограничению скорости, в качестве реального эффекта ускорения, автомобилей и прочего! У кого-нибудь есть идеи?

Код, используемый Mathf.SmoothDamp:

float speed, velocity;

void Update(){
      //Used successfully to slow down
      speed = Mathf.SmoothDamp(speed , 20f, ref velocity, 5f);
}

1 Ответ

1 голос
/ 26 июня 2019

Мы можем упростить функцию кварта и инвертировать, зажимая входы от 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...