Unity高效地找到列表中A和B之间的差异

时间:2019-02-24 21:14:54

标签: c# unity3d waypoint

我正在尝试从大约90点的列表中计算2点之间的数字差异。到目前为止,我拥有的代码:

int positiveCounter = 0;
        int positiveResetCounter = currentWayPointID;
        int negativeCounter = 0;
        int negativeResetCounter = currentWayPointID;
        while ((currentWayPointID + positiveResetCounter) != pos)
        {
            positiveCounter++;
            positiveResetCounter++;
            if(positiveResetCounter > navigationTrack.AllWayPoints.Count)
            {
                positiveResetCounter = 0;
            }
        }
        while((currentWayPointID+negativeResetCounter) != pos)
        {
            negativeCounter++;
            negativeResetCounter--;
            if(negativeResetCounter < 0)
            {
                negativeResetCounter = navigationTrack.AllWayPoints.Count;
            }
        }
        if(positiveCounter <= negativeCounter)
        {
            MoveForward();
        }
        else if(negativeCounter < positiveCounter)
        {
          //  MoveBack();
        }

这可以按预期工作,但是太多了,无法处理更新。我该如何以更少的负担来做到这一点? 为了提供更多背景信息,我列出了航路点列表和每辆车都移动到最接近我的鼠标位置的车辆。 路径是圆形的,因此最后一个航路点首先连接(索引0)。 我试图确定到每个航路点的最短路径,以便前进或后退,上面的代码是我尝试计算要走的路。 我没有在寻找一种使它移动的方法,因为它已经起作用了。

1 个答案:

答案 0 :(得分:1)

我假设pos是您要到达的航路点的目标索引。

您可以直接比较索引,而不用while循环和索引移位:

假设您有类似的航路点列表

[WP0, WP1, WP2, WP3, WP4, ... WPn]

因此可用索引为0n,列表长度为n+1

让我们说currentWayPointID = npos = 2

您想知道的是后退还是后退更快。因此,您想比较哪个差异较小:

后退

n - 2 // simply go steps backwards until reaching 2

或使用虚拟扩展列表前进

(n+1) + 2 - n; // add the length of the list to the target index

或可视化它

                 [WP0,   WP1,   WP2,   WP3,   WP4, ... WPn]

index:              0,     1,     2,     3,     4, ...     n
extended index: n+1+0, n+1+1, n+1+2, n+1+3, n+1+4, ... n+n+1

因此,为了概括起见,您只需要首先检查currentwaypointID是在pos之前还是之后,例如

bool isForwards = true;
if(currentwaypointID >= pos)
{
    if(currentwaypointID  - pos < navigationTrack.AllWayPoints.Count + pos - currentwaypointID)
    {
        isForwards = false;
    }
}
else
{
    if(pos - currentwaypointID > navigationTrack.AllWayPoints.Count + currentwaypointID - pos)
    {
        isForwards = false;
    }
}

if(isForwards)
{
    MoveForward();
}
else
{
    MoveBack();
}