C# Unity数组索引未越界却报错 长度显示为1问题排查
问题根因
这是Unity序列化机制导致的典型问题:
你定义的public string[] fen是public字段,Unity默认会对所有public可序列化字段做Inspector序列化存储,如果挂载PuzzleVariables脚本的场景对象/预制体,曾经在Inspector面板给fen数组设置过Size=1、存过1个元素,运行时Unity会直接读取Inspector中序列化的数组值,完全覆盖你在代码里写的3个元素的初始化逻辑。这就是你打印数组长度始终为1、判断条件直接触发跳转ModuleCompleted页面的核心原因——你代码里写的3个FEN字符串根本没有在运行时被加载到数组里。
解决方案
按以下步骤处理即可:
- 找到挂载
PuzzleVariables脚本的单例对象,选中后在Inspector面板查看fen数组属性,你会直接看到数组的Size值确实为1,和你打印的结果一致。 - 两种修复方式二选一即可:
- 直接在Inspector里把
fen数组的Size改为3,把你代码里写的3个FEN字符串依次填入对应元素槽;也可以点击脚本组件右上角的更多菜单(三个点图标),选择Reset重置组件,重置后会自动同步你代码里写的初始数组值。 - 如果不想让Inspector覆盖代码里的初始化配置,可以给
fen字段添加[NonSerialized]特性,告诉Unity不要序列化这个字段,运行时就会固定执行代码里的数组初始化逻辑,代码写法如下:
- 直接在Inspector里把
[System.NonSerialized] public string[] fen = { "2q3k1/8/8/5N2/6P1/7K/8/8 w", "7k/8/8/4b1n1/8/8/5PPP/5R1K w", "r1bqkb1r/pppp1ppp/2n5/4p3/2B1N3/5N2/PPPP1PPP/R1BQK2R b" };
- 额外优化建议:你当前的边界判断逻辑可以简化,数组合法索引范围是
0 ~ Length-1,不需要做puzzlenumber +1的计算,直接判断puzzlenumber - 1 >= fen.Length即可跳转完成页,减少多余计算带来的出错概率。
内容的提问来源于stack exchange,提问作者Tsubodai
相关产品推荐
相关产品推荐

