Что происходит, когда Lerping с помощью Time.deltaTime? - PullRequest
0 голосов
/ 15 февраля 2019

Я только недавно познакомился с Time.deltaTime и стал рыскать и был немного застрял в течение последних нескольких дней.

Поэтому, когда я подключаю Time.deltaTime для последних float, а затем умножаючто происходит с помощью другой переменной с плавающей точкой speed?Что Time.deltaTime делает с speed каждым кадром, дающим конечный результат?

Спасибо !!

public class CameraMovement : MonoBehaviour
{
    public GameObject followTarget;
    public float moveSpeed;

    void Update()
    {
        if (followTarget != null)
        {
            transform.position = Vector3.Lerp(transform.position, followTarget.transform.position, moveSpeed * Time.deltaTime); 
        } 
    }
}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Использование Time.deltaTime * scalar в Lerp прекрасно, но это не «ожидаемый» способ его использования.

LERP означает «Linear intERPolation».С помощью этого математического инструмента вы можете интерполировать значение между двумя другими, используя линейную функцию (y = ax + b) и коэффициент t между 0 и 1.

Предположим, что выпытаясь получить позицию (C) между двумя другими (A и B) (как ваша проблема), у вас есть следующий рисунок:

alt text

1 °) Еслиисходная и конечная позиции не меняются, если параметр t изменяется от 0 до 1, кривая движения будет совершенно прямой: скорость будет одинаковой во времени.

transform.position = Vector2.Lerp(InitialPosition, DestinationPosition, t ); // t from 0 to 1

2 °) Однако, если t (почти) не изменяется во времени (с Time.deltaTime), но при изменении положения A, движение будет замедляться со временем, потому что вы каждый раз берете фиксированный процент от оставшегося расстояния.Так как расстояние со временем уменьшается, вы также путешествуете на меньшее расстояние

transform.position = Vector2.Lerp(transform.position, DestinationPosition, 0.017 ); // 0.017, approx of Time.deltaTime at 60FPS

alt text

0 голосов
/ 15 февраля 2019

Vector3.Lerp ожидает коэффициент между 0 и 1 и интерполирует две позиции так, чтобы

  • 0 означало transform.position
  • 1 будет означать followTarget.transform.position

любое другое значение между этими значениями, интерполяция между ними означает что-то вроде

transform.position + (followTarget.transform.position - transform.position) * factor;

Time.deltaTime = time past since last frame rendered, поэтому, скорее всего, значение близко к 0.017 (для 60FPS).Вы можете самостоятельно рассчитать, какое значение это дает в среднем для moveSpeed * 0.017.


Похоже, что вы на самом деле ищете Vector3.MoveTowards

void Update()
{
    if (followTarget != null)
    {
        transform.position = Vector3.MoveTowards(transform.position, followTarget.transform.position, moveSpeed * Time.deltaTime); 
    }   
}
...