Лерп не всегда гладко для движения автомобиля - PullRequest
0 голосов
/ 05 июня 2018

Я моделирую автомобили, проезжающие через дорожную сеть, с учетом четырех столбцов данных time, id, x и z, где автомобиль с идентификатором id находится в x,0,z во время t Вот пример:

t   id  x   z
957,1,-1.50,250.07
958,1,-1.50,232.39
959,1,-4.50,209.72
960,1,-4.50,193.05
961,1,-4.50,176.39
962,1,-4.50,159.72
963,1,-4.50,143.05
...

В настоящее время я могу порождать автомобили и обновлять их позиции по мере истечения времени и в соответствии с данными.Я застрял на том, как более реалистично симулировать движение автомобиля, вместо того, чтобы машина просто выскочила из точки в точку.

Я использую Vector.Lerp, но он скачет без последовательного, плавного движения:

car.transform.position = 
    Vector3.Lerp(car.transform.position, nextPosition, Time.deltaTime);

Каждую секунду я проверяю данные выше, чтобы найти координаты автомобиля в текущую секунду,Эти координаты передаются как nextPosition в вышеуказанную функцию Lerp.Это означает, что автомобиль «Лерпинг» от точки к точке каждую секунду.

Как мне сделать движение более плавным?Обновление позиции происходит каждую секунду, и, следовательно, автомобиль должен достичь следующей позиции за 1 секунду.

1 Ответ

0 голосов
/ 05 июня 2018

Вам необходимо использовать функцию moveToX, которая перемещает объект на позицию в течение x секунд.Это упрощает все это.Все, что вам нужно сделать сейчас, это перебрать каждую позицию в списке, функцию moveToX и указать время (1 сек), в течение которого объект должен быть там.

Эта функция moveToX работает с использованием Time.deltaTime для увеличения переменной счетчика до достижения заданного времени.t рассчитывается путем деления этого счетчика с целевым временем, в результате чего получаются значения 0 и 1, поскольку именно этого ожидает t в Vector3.Lerp.Все это должно быть сделано в функции сопрограммы, потому что сопрограмма упрощает ожидание в функции.

public GameObject car;
public List<Vector3> pos;
bool isMoving = false;

IEnumerator MoveCar()
{
    //Loop over each postion
    for (int i = 0; i < pos.Count; i++)
    {   
        //Get next position
        Vector3 nextPosition = pos[i];
        //Move to new position within 1 second
        yield return StartCoroutine(moveToX(car.transform, nextPosition, 1.0f));
    }
}

, затем вы можете начать движение, вызвав функцию сопрограммы:

void Start()
{
    StartCoroutine(MoveCar());
}
...