You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中C#数组能否从负索引开始?索引越界问题求助

解决Unity计分板的IndexOutOfRangeException问题

嘿,我来帮你拆解下这个问题的核心,顺便给出符合你需求的修复方案!

为什么只有首个值是"A"时会触发报错?

首先得明确一个关键:C#里的数组索引是从0开始的,根本不允许使用-1作为索引。你的代码里初始xIndex = -1,当第一个数据是"A"时,会直接触发越界异常,咱们来捋清楚这个逻辑:

看你代码里的BIG ROAD区域判断:

if (result.Equals(newPrevious) || result.Equals("A") && yIndex < table.GetLength(1)) {
    yIndex += 1;
    table[xIndex, yIndex] = result; // 这里xIndex还是-1!
} else if (result.Equals("A")) {
    xIndex += 1;
    table[xIndex, yIndex] = result;
} else {
    xIndex += 1;
    yIndex = 0;
    table [xIndex, yIndex] = result;
}

当第一个result是"A"时:

  • 初始newPrevious是"placeholder",所以result.Equals(newPrevious)不成立,但result.Equals("A") && yIndex < 15是成立的(yIndex初始为0,小于15)
  • 这时候会进入第一个if分支,直接把yIndex加1变成1,然后尝试给table[-1, 1]赋值——这就触发了IndexOutOfRangeException

而当首个值是"B"或"C"时:

  • 不会满足第一个if的条件,会走到else分支,执行xIndex +=1把-1变成0,然后给table[0,0]赋值,这是合法的数组索引,所以不会报错。

修复方案(贴合你的预期效果)

你的需求是“当数值数量超过7时,横向扩展至下一行的同一列位置”,咱们得放弃用负索引的想法,重新梳理行列逻辑,同时保证数组访问的合法性:

  1. 把xIndex初始值改成0(符合C#数组的索引规则)
  2. 调整行列判断条件,明确逻辑优先级(注意||和&&的优先级,建议加括号避免歧义)
  3. 增加索引越界的提前拦截,避免后续报错

修改后的核心代码片段如下:

// 初始值调整为合法的数组索引起点
int xIndex = 0; 
int yIndex = 0; 
string newPrevious = "placeholder";

// ... 其他代码保持不变,直到BIG ROAD区域 ...

#region BIG ROAD
// 提前判断数组容量,避免越界
if (xIndex >= table.GetLength(0) || yIndex >= table.GetLength(1)) {
    Debug.LogWarning("计分板数组容量不足,无法继续添加数据");
    break;
}

// 用括号明确逻辑优先级,符合你“超过7个换行”的需求(0-6是7个位置)
if ((result.Equals(newPrevious)) || (result.Equals("A") && yIndex < 6)) { 
    yIndex += 1;
    table[xIndex, yIndex] = result;
} else if (result.Equals("A")) {
    // A无法在当前行继续时,换行到下一行的同一列
    xIndex += 1;
    table[xIndex, yIndex] = result;
} else {
    // 非A的新值,换行到下一行的第一列
    xIndex += 1;
    yIndex = 0;
    table[xIndex, yIndex] = result;
}

previous = result ;
if (!result.Equals("A")) {
    newPrevious = previous;
}
#endregion

额外的小优化建议

  • 原代码里strData是单个元素的数组,字符串里还有多余空格,拆分后会出现空字符串,建议清理空格后再拆分:
string[] newNewData = OriginalData.Replace(" ", "").Split(',');
  • 每次循环都实例化对象,记得在场景切换或重置计分板时清理旧对象,避免内存泄漏

内容的提问来源于stack exchange,提问作者user9804443

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:17:49