Unity C# 检视面板赋值数组运行时触发NullReferenceException报错
问题根因
报空引用说明characters数组本身是null,和你预期的检视面板已赋值不符,只会是以下几种情况:
- 方法调用时机早于Unity序列化赋值完成节点,检视面板的public字段赋值是在
Awake生命周期后、Start生命周期前完成的,如果在Awake、或者场景加载未完成的阶段调用createInventory(),拿到的就是未初始化的null数组 - 场景里存在多个挂载Inventory脚本的对象,你给其中一个实例的数组做了赋值,但实际调用方法的是另一个没有赋值的脚本实例
- 检视面板的数组赋值没有真正保存:要么数组Size参数被设为0,要么赋值后触发了组件Revert操作,引用被重置
- 其他逻辑在调用
createInventory()前,通过代码重新赋值了characters字段(比如执行过characters = new Image[0]),覆盖了序列化的引用
修复方案
- 先给方法加防御性判空,快速定位问题点:
public void createInventory(){ // 校验数组本身状态 if (characters == null || characters.Length == 0) { Debug.LogError("characters数组未初始化", this); return; } for (int i = 0; i < characters.Length; i++){ // 校验单个元素引用,避免单个槽位丢失引用报错 if (characters[i] == null) { Debug.LogError($"数组索引{i}位置的Image引用为空", this); continue; } characters[i].sprite = character; } }
加了this参数的Debug日志可以在控制台直接点击定位到对应的脚本实例,快速排查是不是重复挂载的问题。
- 逐项排查配置和逻辑:
- 选中挂载Inventory脚本的对象,查看Inspector面板:确认
characters数组的Size和你赋值的元素数量一致,展开数组后每个槽位都有对应的Image引用,不存在None (Image)的空槽 - 在Hierarchy面板搜索
Inventory,列出所有挂载该脚本的对象,删除多余的、未做赋值的冗余脚本实例 - 调整
createInventory()的调用时机:如果是生命周期内自动调用,把逻辑从Awake移到Start执行;如果是场景切换后调用,等SceneManager.sceneLoaded回调触发后再执行 - 全局搜索
characters =关键字,检查是否有其他代码提前覆盖了数组引用
调试提示:你原来写在循环里的
Debug.Log(characters)只会打印整个数组的类型信息,没有调试价值,需要打印单个元素的话可以改成Debug.Log($"索引{i}的Image:{characters[i]}", this);
内容的提问来源于stack exchange,提问作者user12372197
相关产品推荐
相关产品推荐

