Unity触发IndexOutOfRangeException数组越界 背包系统CreateSlots方法报错
错误原因
- 核心逻辑问题:你在
StaticInterface的CreateSlots方法中,循环边界取的是背包物品数组inventory.Container.Items的长度,但循环内访问的是UI槽位数组Slots的对应下标,只要Slots数组的元素数量小于背包物品数组的长度,就会触发数组下标越界报错。 - Unity定位到父类抽象方法声明行只是调用栈的溯源标记,实际错误仅和子类的数组访问逻辑有关,不需要修改父类的抽象方法定义。
修复方案
1. 调整循环逻辑增加边界防护
优先取两个数组长度的较小值作为循环上限,从代码层面杜绝越界可能,修改后的CreateSlots代码如下:
public override void CreateSlots() { // 前置空校验,避免空引用报错 if (Slots == null || Slots.Length == 0) { Debug.LogError("当前StaticInterface组件的Slots数组未配置,请检查Inspector面板的赋值", this); return; } if (inventory == null || inventory.Container?.Items == null) { Debug.LogError("背包对象未正确赋值,请检查组件的inventory参数配置", this); return; } itemsDisplayed = new Dictionary<GameObject, InventorySlot>(); // 取两个数组的较小值作为循环上限,保证不会访问到不存在的下标 int loopLimit = Mathf.Min(Slots.Length, inventory.Container.Items.Length); for (int i = 0; i < loopLimit; i++) { var obj = Slots[i]; AddEvent(obj, EventTriggerType.PointerEnter, delegate { OnEnter(obj); }); AddEvent(obj, EventTriggerType.PointerExit, delegate { OnExit(obj); }); AddEvent(obj, EventTriggerType.BeginDrag, delegate { OnDragStart(obj); }); AddEvent(obj, EventTriggerType.EndDrag, delegate { OnDragEnd(obj); }); AddEvent(obj, EventTriggerType.Drag, delegate { OnDrag(obj); }); itemsDisplayed.Add(obj, inventory.Container.Items[i]); } // 可选:增加长度不一致的警告,方便调试 if (Slots.Length < inventory.Container.Items.Length) { Debug.LogWarning($"UI槽位数量({Slots.Length})小于背包容量({inventory.Container.Items.Length}),超出部分的物品将不会在界面上显示", this); } }
2. 编辑器侧配置对齐
如果你做的是固定槽位的装备栏界面,需要保证两个配置的数值完全一致:
- 选中挂载
StaticInterface组件的UI对象,检查Inspector面板中Slots数组的元素数量 - 打开你用到的
InventoryObject资产文件,检查容器配置的格子数量
两个数值必须相等才能保证所有背包格子都能正常显示和交互
内容的提问来源于stack exchange,提问作者GrollyGames
相关产品推荐
相关产品推荐

