You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity库存UI异常:物品已添加无视觉显示,物品保存或存在问题

Unity库存UI不显示及保存问题排查方案

一、UI显示异常排查

1. 确认itemsParent赋值正确性

检查Inspector面板中,InventoryUI组件的itemsParent字段是否已拖拽绑定库存物品槽的父物体。若未赋值,slots = itemsParent.GetComponentsInChildren<InventorySlot>()会得到空数组,UpdateUI无法执行任何有效更新操作。

2. 验证InventorySlot的AddItem方法逻辑

检查InventorySlot脚本中的AddItem实现,确认:

  • 是否正确设置了物品图标(如image.sprite = item.icon)
  • 是否激活了物品显示的UI元素(如gameObject.SetActive(true))
  • 是否正确更新了物品数量文本(若有)
    如果AddItem内部逻辑缺失或错误,即使调用该方法,物品也不会在界面上显示。

3. 检查Inventory单例的有效性

确认Inventory.Instance的单例初始化逻辑正确:

  • 在Inventory脚本的Awake方法中,是否正确实现了单例模式(如if (Instance == null) Instance = this; else Destroy(gameObject);)
  • 确保Inventory对象在场景中存在且未被意外销毁,否则Inventory.Instance.items会引用错误。

4. 确认onItemChangedCallback触发时机

检查Inventory脚本的AddItem方法,确认在物品添加完成后是否调用了回调:

public void AddItem(Item item)
{
    items.Add(item);
    onItemChangedCallback?.Invoke(); // 必须有这行触发UI更新
}

若未触发回调,仅在Start时调用一次UpdateUI,后续添加物品时UI不会自动更新。

5. 调整LoadEquipment执行顺序(若涉及)

当前Start方法中先执行equipmentManager.LoadEquipment(),再订阅回调和执行UpdateUI。若LoadEquipment会修改Inventory的items列表,这个顺序是合理的,但需确认LoadEquipment是否正确将加载的物品添加到Inventory.Instance.items中,而非覆盖或未添加。

二、物品保存功能排查

1. 检查保存逻辑的序列化/反序列化

确认保存时是否正确处理了Inventory.items的序列化:

  • 使用JsonUtility时,需确保Item类标记了[System.Serializable],且所有需要保存的字段都是可序列化类型
  • 使用PlayerPrefs时,需将列表转换为可存储的格式(如JSON字符串),读取时再反序列化为列表

2. 验证LoadEquipment的读取逻辑

检查EquipmentManager.LoadEquipment()方法,确认:

  • 是否从保存位置(如PlayerPrefs、本地文件)正确读取到保存的数据
  • 是否将读取到的物品数据正确添加到Inventory.Instance.items中,而非清空或未处理

三、代码优化建议(避免空引用)

在InventoryUI脚本中添加空引用检查,便于快速定位问题:

void Start()
{
    if (EquipmentManager.Instance == null)
    {
        Debug.LogError("EquipmentManager Instance not found!");
        return;
    }
    equipmentManager = EquipmentManager.Instance;
    equipmentManager.LoadEquipment();

    if (Inventory.Instance == null)
    {
        Debug.LogError("Inventory Instance not found!");
        return;
    }
    Inventory.Instance.onItemChangedCallback += UpdateUI;

    if (itemsParent == null)
    {
        Debug.LogError("itemsParent not assigned in InventoryUI!");
        return;
    }
    slots = itemsParent.GetComponentsInChildren<InventorySlot>();

    UpdateUI();
}

void UpdateUI()
{
    if (slots == null || slots.Length == 0 || Inventory.Instance == null)
        return;

    for (int i = 0; i < slots.Length; i++)
    {
        if (i < Inventory.Instance.items.Count)
        {
            slots[i].AddItem(Inventory.Instance.items[i]);
        }
        else
        {
            slots[i].ClearSlot();
        }
    }
}

内容的提问来源于stack exchange,提问作者Upii Oonee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:15:54