统一获得错误IndexOutOfRange,但仍可正常工作

问题描述 投票:0回答:1

下面获得我的所有目标并将其随机分配给敌人,这有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];
     }
c# arrays for-loop unity3d
1个回答
0
投票
  1. 它可能应该是Random.Range(0, targets.Length),因为第二个参数是int的专有参数。否则,将永远不会包含最后一个元素。

  2. 如果targets是一个空数组,因为FindGameObjectsWithTag找不到任何元素,那么您也会创建一个空的transArraynew Transform[0]),因此访问i = 0的第一个索引将引发一个例外

  3. transArray基本上总是小于targets,因此,如果有任何需要,您宁愿遍历transArray.Length而不遍历较大的targets.Length。否则,一旦i超过transArray.Length - 1

  4. ,您将获得异常
  5. 不知道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;
© www.soinside.com 2019 - 2024. All rights reserved.