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

Unity Inventory系统问题:Slot外观无法随Item类数据更新

问题排查与修复方案

核心问题分析

你的代码无法正确更新Slot视觉的原因有三个:

  1. 直接修改预制体而非场景实例:DisplayItemsOnSlots中操作的是InventorySlotPrefab预制体本身,不是已经在场景中实例化的Slot对象,所以运行时看不到任何变化,还会意外修改预制体资源。
  2. 无实例化Slot的引用存储:没有保存场景中生成的Slot对象列表,无法将每个Item对应到具体的Slot。
  3. 循环逻辑错误:每次循环都获取同一个预制体的Image组件,最终只会把预制体的Sprite设为最后一个Item的Sprite,完全没有处理场景中的Slot。

修复后的代码实现

修改后的Inventory类

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;

public class Inventory : MonoBehaviour
{
    public List<Item> InventoryList = new List<Item>();
    [Header("InventoryUI")]
    public GameObject InventorySlotPrefab;
    public Transform slotParent; // 拖拽场景中存放Slot的父物体到这里
    private List<GameObject> spawnedSlots = new List<GameObject>();

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.E))
        { 
            DisplayItemsOnSlots();
        }
    }

    public void AddItem(int _itemId, string _itemName, int _itemAmount, Sprite _sprite)
    { 
        Item newItem = Item.CreateInstance<Item>();
        newItem.SetItemDetails(_itemId, _itemName, _itemAmount, _sprite);
        InventoryList.Add(newItem);
        // 添加Item时同步生成对应的Slot
        SpawnNewSlot();
    }

    private void SpawnNewSlot()
    {
        GameObject newSlot = Instantiate(InventorySlotPrefab, slotParent);
        spawnedSlots.Add(newSlot);
    }
    

    public void DisplayItemsOnSlots()
    {
        // 为每个Item匹配对应的Slot
        for (int i = 0; i < InventoryList.Count; i++)
        {
            if (i >= spawnedSlots.Count) break;
            
            Image itemImage = spawnedSlots[i].GetComponentInChildren<Image>();
            if (itemImage != null)
            {
                itemImage.sprite = InventoryList[i].sprite;
                itemImage.enabled = true;
            }
        }

        // 隐藏多余的Slot内容(当Item数量少于Slot时)
        for (int i = InventoryList.Count; i < spawnedSlots.Count; i++)
        {
            Image itemImage = spawnedSlots[i].GetComponentInChildren<Image>();
            if (itemImage != null)
            {
                itemImage.sprite = null;
                itemImage.enabled = false;
            }
        }
    }
}

关键修改说明

  • 新增spawnedSlots列表,专门存储场景中实例化后的Slot对象,确保能精准操作每个Slot
  • 新增slotParent变量,用于统一管理生成的Slot,避免场景层级混乱
  • 在AddItem中同步调用SpawnNewSlot,保证Item和Slot的数量对应
  • 优化DisplayItemsOnSlots逻辑:
    • 遍历Item列表,为每个Item匹配对应的Slot设置Sprite
    • 处理Item数量少于Slot的情况,隐藏多余Slot的Image组件

额外注意事项

  1. 确保Slot预制体中的Image组件存在,且默认状态为禁用或无Sprite
  2. 调用AddItem时,传入的_sprite必须是有效的Sprite资源,不能为null
  3. 用Item.CreateInstance<Item>()创建的ScriptableObject属于临时对象,退出Play模式后会丢失,若需要永久保存,建议在Editor中创建ScriptableObject资产并引用

内容的提问来源于stack exchange,提问作者erdem.61

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:40:28