C# Unity游戏库存售卖时误删全部物品,如何实现单次仅删1个
库存移除逻辑异常排查与修复方案
核心异常特征匹配
你遇到的“库存为1时移除正常、多数量时一次全删”的表现,是典型的参数传递或扣减逻辑分支错误问题,和拾取、UI槽位渲染逻辑无关,按以下优先级排查即可定位问题。
常见根本成因(按出现概率排序)
- 移除操作的传参错误(占90%以上同类问题)
触发售卖/移除时,接口收到的移除数量不是固定值1,而是当前物品的实际库存总数。常见错误场景:ItemSlotUI代码中绑定点击事件时,误把槽位的当前堆叠数量作为参数传给RemoveFromInventory,而非固定写死扣减1个- 在Unity Inspector面板给按钮绑定时,错误把动态变化的堆叠数值设为事件传入参数,而非手动输入固定值1
这类错误完全匹配你的现象:库存为1时传参为1,扣减1个到0,结果符合预期;库存为15时传参为15,直接扣完全部数量。
RemoveFromInventory核心逻辑错误
常见错误写法:跳过数量扣减步骤,只要触发移除就直接从字典中删除整个物品条目,比如:
这种写法下,库存为1时删除条目刚好是预期的“扣1到0”,但库存为15时就会直接清空全部数量。// 错误实现示例 public void RemoveFromInventory(Item item, int removeAmount = 1) { if (inventory.ContainsKey(item)) { inventory.Remove(item); // 不做扣减直接删条目 onInventoryChange?.Invoke(); } }- 字典Key匹配异常
如果你使用的Item是自定义普通C#类而非ScriptableObject,没有重写Equals和GetHashCode时会出现Key匹配错位。但根据你能正常累加物品数量的表现,这类问题概率极低,仅在每次拾取时动态生成新Item实例的场景下才会出现。
可落地修复方案
- 第一步:修正传参逻辑
- 检查所有调用
RemoveFromInventory的代码位置,确保移除操作传入的扣减值为固定1,而非当前物品的堆叠总数 - 检查Unity Inspector面板中所有绑定移除/售卖按钮的事件配置,确认传入的移除数量参数是手动输入的固定值1,不要绑定动态变化的槽位数值
- 检查所有调用
- 第二步:加固库存核心逻辑
替换为带校验的移除实现,从逻辑上避免参数错误导致的全删问题:public void RemoveFromInventory(Item item, int removeAmount = 1) { // 尝试获取当前物品库存,不存在直接告警返回 if (!inventory.TryGetValue(item, out int currentCount)) { Debug.LogWarning($"尝试移除未持有物品: {item.name}"); return; } // 入参兜底:禁止传入非法的移除值 removeAmount = Mathf.Clamp(removeAmount, 1, currentCount); int remainCount = currentCount - removeAmount; // 剩余数量为0时才删除字典条目 if (remainCount <= 0) { inventory.Remove(item); } else { inventory[item] = remainCount; } // 触发库存变更事件 onInventoryChange?.Invoke(); } - 第三步:排查字典Key匹配问题(仅自定义Item类需要)
如果Item不是ScriptableObject,需要在类内重写Equals和GetHashCode方法,确保相同物品的Key匹配一致,避免字典查询异常。
内容的提问来源于stack exchange,提问作者keremy96
相关产品推荐
相关产品推荐

