我在库存用户界面中项目栏后面的逻辑上遇到了麻烦。
我想要的行为是,当我调用此方法时,该方法将针对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设置项目槽的可见性来做到这一点,但是我必须定义一个库存大小,我不想做到这一点。
任何提示都将受到欢迎,谢谢!
答案 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