在寻路过程中使参数超出范围Coroutine

时间:2017-03-31 17:33:10

标签: unity3d 2d path-finding indexoutofrangeexception

我是新手使用协同程序,并且在运行此函数时出现了超出范围数组错误。我希望这是一个包含在这个函数中的简单问题,也许我在错误的点上屈服,或者需要使用path.count -1。

public void UpdatePath() {
    the.pathFinder.FindPath (my);

    Vector3[] pathVectors = new Vector3[my.path.Count + 1];

    pathVectors [0] = (Vector3)my.transform.position;

    if (my.path.Count > 0) {
        for (int i = 0; i < my.path.Count; i++)
            pathVectors [i + 1] = my.path [i].transform.position;
    }

    my.pathLine.SetVertexCount (my.path.Count + 1);
    my.pathLine.SetPositions(pathVectors);

    StopCoroutine("FollowPath");
    StartCoroutine("FollowPath");
}

IEnumerator FollowPath() {

    Vector3 currentWayPoint = my.path [0].transform.position;

    while (true) {

        Vector2 heading = the.Heading (my.transform.position, currentWayPoint);

        if (heading.sqrMagnitude < 0.4) {
            targetIndex++;
            if (targetIndex >= my.path.Count) {
                print ("On yield break - TargetIndex is " + targetIndex + " and my.path.Count is " + my.path.Count);
                yield break;
            }
            print ("On assigning currentWayPoint - TargetIndex is " + targetIndex + " and my.path.Count is " + my.path.Count);
            currentWayPoint = my.path [targetIndex].transform.position;
        }

        my.pathGoal = ((heading).sqrMagnitude > 1f) ? heading.normalized * my.speed : heading * my.speed;
        yield return null;
    }
}

我已经输入了一个打印日志来检查my.path.Count的targetIndex。据我所知,在第二个打印日志中,targetIndex不应该等于或大于my.path.Count,但是在日志中,我得到“On assigning currentWayPoint - TargetIndex是1和my。 path.Count是1“。我意识到这就是为什么我得到超出范围的异常,但我不明白如果TargetIndex等于my.path.Count,代码是如何可达的。在收益率突破之间是否有可能发生其他事情;行和打印日志?协同程序是否与其他可能发生冲突的代码同时运行?。

1 个答案:

答案 0 :(得分:0)

这与协同程序无关。

您正在尝试访问索引高于数组元素数的成员:

for (int i = 0; i < my.path.Count; i++)
    pathVectors [i + 1] = my.path [i].transform.position; // will fail on i = path.Count

此外,编译器会告诉您代码中的这个异常发生在哪一点,这很容易让您得出已经达成的结论:

  

需要使用path.count -1

在向SO提出问题之前,先尝试一下代码中的内容,看看是否有效,这一直是个好主意。

此外,围绕此代码的if语句毫无意义。