下面获得我的所有目标并将其随机分配给敌人,这有99%的时间有效,但是每个敌人给出的错误IndexOutOfRange Index不在数组的范围之内。最后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];
}
它可能应该是Random.Range(0, targets.Length)
,因为第二个参数是int
的专有参数。否则,将永远不会包含最后一个元素。
如果targets
是一个空数组,因为FindGameObjectsWithTag
找不到任何元素,那么您也会创建一个空的transArray
(new Transform[0]
),因此访问i = 0
的第一个索引将引发一个例外
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;
}
Btw:不确定,但是如果您实际上想获得随机目标,您也可以简单地做]
target = targets[Random.Range(0, targets.Length)].transform;