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时,横向扩展至下一行的同一列位置”,咱们得放弃用负索引的想法,重新梳理行列逻辑,同时保证数组访问的合法性:
- 把
xIndex初始值改成0(符合C#数组的索引规则) - 调整行列判断条件,明确逻辑优先级(注意
||和&&的优先级,建议加括号避免歧义) - 增加索引越界的提前拦截,避免后续报错
修改后的核心代码片段如下:
// 初始值调整为合法的数组索引起点 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
相关产品推荐
相关产品推荐

