我正在模拟通过道路网络行驶的汽车,给出了四列数据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秒内到达下一个位置。
答案 0 :(得分:2)
您需要使用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());
}
然后你可以通过调用协同程序函数来启动运动:
{{1}}