Как рассчитать скорость GameObject в Unity? - PullRequest
0 голосов
/ 07 марта 2019

Я пробовал что-то вроде

float speed = (currentPosition - previousPosition).magnitude / Time.deltaTime

в Update().

Но я получаю очень плохие результаты, потому что currentPosition и previousPosition слишком близки. После вычитания слишком много ошибок округления. Значения скорости слишком сильно колеблются.

А также я не хочу выполнять усреднение по нескольким кадрам, поскольку это приводит к задержкам и лишь немного улучшает результат.

Есть ли лучший способ рассчитать скорость объекта?

1 Ответ

1 голос
/ 07 марта 2019

Вы можете использовать сопрограмму, которая вычисляет скорость медленнее, чем каждый кадр:

void OnEnabled() {
    StartCoroutine(SpeedReckoner());
}

public float Speed;
public float UpdateDelay;

private IEnumerator SpeedReckoner() {

    YieldInstruction timedWait = new WaitForSeconds(UpdateDelay);
    Vector3 lastPosition = transform.position;
    float lastTimestamp = Time.time;

    while (enabled) {
        yield return timedWait;

        var deltaPosition = (transform.position - lastPosition).magnitude;
        var deltaTime = Time.time - lastTimestamp;

        if (Mathf.Approximately(deltaPosition, 0f)) // Clean up "near-zero" displacement
            deltaPosition = 0f;

        Speed = deltaPosition / deltaTime;


        lastPosition = transform.position;
        lastTimestamp = Time.time;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...