我是新手使用协同程序,并且在运行此函数时出现了超出范围数组错误。我希望这是一个包含在这个函数中的简单问题,也许我在错误的点上屈服,或者需要使用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,代码是如何可达的。在收益率突破之间是否有可能发生其他事情;行和打印日志?协同程序是否与其他可能发生冲突的代码同时运行?。
答案 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
语句毫无意义。