统一出现错误 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 独有的。否则永远不会包含最后一个元素。

    1234563会抛出异常

    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 但仍在工作的主要内容,如果未能解决你的问题,请参考以下文章

CORS 已启用,但仍出现 CORS 错误

访问 OleDbDataReader 项目时出现 IndexOutOfRange 错误

尽管对 Web 配置和主机工厂进行了更改,但仍会出现 WCF 错误

尽管在 Opsworks 中成功部署了 php 应用程序,但仍出现“未找到”错误。其他 php 应用程序运行良好

报错但仍能正常运行

表格视图单元格中的 uicollectionview 出现错误:索引超出范围,为啥?