【问题标题】:Getting error IndexOutOfRange in unity but still working统一出现错误 IndexOutOfRange 但仍在工作
【发布时间】: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];
     }

【问题讨论】:

    标签: c# arrays for-loop unity3d


    【解决方案1】:
    1. 它可能应该是Random.Range(0, targets.Length),因为第二个参数是int 独有的。否则永远不会包含最后一个元素。

    2. 1234563会抛出异常
    3. transArray 基本上总是小于targets,所以如果有什么你宁愿迭代transArray.Length 而不是更大的targets.Length。否则,一旦i 超过transArray.Length - 1,你就会得到一个异常

    4. 不知道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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      相关资源
      最近更新 更多