这是我的问题。我有一个Vector3数组(大小> 10,000)。我的对象应该在最短的时间内遍历每个点。例如,在下面的代码中,对象每帧从一个点移动到另一点。但是,当点的数组很大时,要花费超过2分钟的时间才能遍历每个点。
public class PlayerMovement : MonoBehaviour{
Vector3[] points = new Vector3[10000];
int i = 0;
private void Update()
{
transform.position = points[i];
i++;
}
}
有更快的方法吗?如果有人可以建议我更快地执行此操作,我将不胜感激。
答案 0 :(得分:1)
定义速度,将当前帧乘以Time.deltaTime
即可算出当前帧的行进速度;
使用Vector3.MoveTowards
移至下一个点。重复该操作,直到用完该帧的距离或用完点。
您将需要能够在每帧中保留多条迹线,因此请将将迹线添加到void LeaveTrace(Vector3 position)
方法中的过程,以便我们在必要时可以调用它。
您可以设置目标索引来确定如何遍历点数组,但是如果在遍历过程中更改遍历的方向,请确保更新源索引。
一起:
public class PlayerMovement : MonoBehaviour{
Vector3[] points = new Vector3[10000];
public float speed = 1f;
private int curSourceIndex = 0;
private int goalIndex = 0; // no goal
private void Update()
{
if (goalIndex != curSourceIndex)
{
MoveBus();
}
}
private void MoveBus()
{
int step = goalIndex > curSourceIndex ? 1 : -1;
float distLeft = speed * Time.deltaTime;
while (distLeft > 0 && curSourceIndex != goalIndex)
{
Vector3 curTarget = points[curSourceIndex + step];
Vector3 curPos = transform.position;
Vector3 newPos = Vector3.MoveTowards(curPos, curTarget, distLeft);
distLeft -= (newPos-curPos).magnitude;
if (newPos == curTarget)
{
// Leave trace at each point reached
LeaveTrace(newPos)
curSourceIndex += step;
}
transform.position = newPos;
}
}
public void SetGoalIndex(int index)
{
if (index < 0 || index >= points.length) return; // or throw/log etc here
// Do any appropriate modification to curSourceIndex
if (points[curSourceIndex] != curPos)
{
// If we were going up but we're going down (or back to where we were),
// increase source index
if (goalIndex > curSourceIndex && index <= curSourceIndex)
{
curSourceIndex +=1;
}
// if vice versa, decrease source index
else if (goalIndex < curSourceIndex && index >= curSourceIndex)
{
curSourceIndex -=1;
}
}
goalIndex = index;
}
void LeaveTrace(Vector3 pos)
{
// leave a trace at the pos location
}
}