库存项目插槽UI系统unity3d的问题

时间:2019-06-18 07:02:48

标签: c# unity3d

我在库存用户界面中项目栏后面的逻辑上遇到了麻烦。

我想要的行为是,当我调用此方法时,该方法将针对playerInventory.InventoryList(其中包含Items)检查List itemSlots(这是一个列表,其中包含从ItemSlot预制实例化的项目插槽)。

然后我要根据玩家的库存从itemSlots中添加和删除游戏对象(即,列表应该在我拾取和放下物品时更新)

这是我当前的代码:

public void UpdateUI()
    {
        for (int i = 0; i < playerInventory.InventoryList.Count; i++)
        {          
            if (playerInventory.InventoryList[i] != null)
            {
                Debug.Log("Creating new inventory slot...");
                itemSlots.Add(Instantiate(itemSlot, contentPanel.transform));
                itemSlots[i].transform.SetParent(contentPanel.transform);
                ItemSlot newSlot = itemSlots[i].GetComponent<ItemSlot>();
                newSlot.AddItem(playerInventory.InventoryList[i]);
            }
        }
}

当前正在添加项目,但是问题是,每次我调用UpdateUI时,它都会从预制中添加新的空按钮。我知道为什么会这样,因为每次我调用UpdateUI时,它都会检查i = 0是否小于playerInventory.InventoryList.Count,这始终是正确的,但是我不知道如何解决它。

我也不知道如何在实例化这些UI元素后删除它们(即,如果玩家放下一个物品)。

我想我可以通过定义一个特定大小的数组并添加项目,然后使用SetActive设置项目槽的可见性来做到这一点,但是我必须定义一个库存大小,我不想做到这一点。

任何提示都将受到欢迎,谢谢!

1 个答案:

答案 0 :(得分:1)

itemSlots似乎已经有一些条目。 itemSlots.Add总是将新项目添加到该列表的末尾,但是它们的索引可能与i的{​​{1}}索引不同。


我认为您应该先破坏列表中先前实例化的对象及其相应条目,例如

playerInventory.InventoryList

提示:如果您实际上将public void UpdateUI() { // first clean up previously instantiated stuff while(contentPanel.transform.childcount != 0) { Destroy(contentPanel.transform.GetChild(0)); } // also reset the according list itemSlots.Clear(); foreach (var inventoryItem in playerInventory.InventoryList) { if (inventoryItem != null) { Debug.Log("Creating new inventory slot..."); var newSlot = Instantiate(itemSlot, contentPanel.transform).GetComponent<ItemSlot>(); newSlot.AddItem(inventoryItem); itemSlots.Add(newSlot.gameObject); } } } itemSlot的类型设为

itemSlots

代替public ItemSlot itemSlot; public List<ItemSlot> itemSlots = new List<ItemSlot>(); 并拖动到预制中,您以后可以简单地使用

GameObject