0

我正在模拟汽车在给定四列数据的情况下通过道路网络行驶,time以及一辆具有 id 的汽车当时所在的位置这是一个示例:idxzidx,0,zt

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 秒内到达下一个位置。

4

1 回答 1

2

您需要使用moveToX在 x 秒内将对象移动到某个位置的功能。它简化了整个事情。您现在所要做的就是遍历列表中的每个位置,并且moveToX函数并提供对象必须存在的时间(1 秒)。

moveToX函数通过使用Time.deltaTime递增计数器变量来工作,直到它达到指定的目标时间。通过将该t计数器除以得到的目标时间01值来计算,因为这是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());
}
于 2018-06-05T19:55:26.297 回答