统一出现错误 IndexOutOfRange 但仍在工作
Posted
技术标签:
【中文标题】统一出现错误 IndexOutOfRange 但仍在工作【英文标题】:Getting error IndexOutOfRange in unity but still working 【发布时间】:2020-10-04 17:01:31 【问题描述】:下面获取我所有的目标并随机将其提供给敌人,这在 99% 的时间内都有效,但每个敌人都会给出错误 IndexOutOfRange 索引超出数组范围。最后 1% 的时间里,敌人没有得到目标,并且变量未分配错误。
我发现了一些带有此错误的帖子,其中我得到了 -1 部分,但它仍然无法正常工作。
targets = GameObject.FindGameObjectsWithTag("Target");
transArray = new Transform[Random.Range(0, targets.Length - 1)];
for (int i = 0; i < targets.Length - 1; i++)
transArray[i] = targets[i].transform;
target = transArray[i];
【问题讨论】:
【参考方案1】:它可能应该是Random.Range(0, targets.Length)
,因为第二个参数是int
独有的。否则永远不会包含最后一个元素。
transArray
基本上总是小于targets
,所以如果有什么你宁愿迭代transArray.Length
而不是更大的targets.Length
。否则,一旦i
超过transArray.Length - 1
,你就会得到一个异常
不知道target = transArray[i];
应该做什么,但无论如何它总是最后一个元素。无需循环执行此操作。你可以在你的循环之后做
target = transArray[transArray.Length - 1];
获取transArray
的最后一个元素。
所以总的来说它应该看起来像例如
targets = GameObject.FindGameObjectsWithTag("Target");
switch(targets.Length)
case 0:
transArray = targets;
target = null;
break;
case 1:
transArray = targets;
target = transArray[0];
break;
default:
transArray = new Transform[Random.Range(0, targets.Length)];
for (int i = 0; i < transArray.Length; i++)
transArray[i] = targets[i].transform;
target = transArray[transArray.Length - 1];
break;
顺便说一句:不确定,但如果你实际上是为了获得一个随机目标,你也可以简单地做
target = targets[Random.Range(0, targets.Length)].transform;
【讨论】:
以上是关于统一出现错误 IndexOutOfRange 但仍在工作的主要内容,如果未能解决你的问题,请参考以下文章
访问 OleDbDataReader 项目时出现 IndexOutOfRange 错误
尽管对 Web 配置和主机工厂进行了更改,但仍会出现 WCF 错误