Unity3D:遍历大量点的最快方法

时间:2019-07-16 01:10:59

标签: c# unity3d

这是我的问题。我有一个Vector3数组(大小> 10,000)。我的对象应该在最短的时间内遍历每个点。例如,在下面的代码中,对象每帧从一个点移动到另一点。但是,当点的数组很大时,要花费超过2分钟的时间才能遍历每个点。

public class PlayerMovement : MonoBehaviour{

        Vector3[] points = new Vector3[10000];
        int i = 0;
        private void Update()
        {
                transform.position = points[i];
                 i++;
        }
}

有更快的方法吗?如果有人可以建议我更快地执行此操作,我将不胜感激。

1 个答案:

答案 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
    }
}