/// <summary> /// 将字典中的物品加入背包,传过来的字典应该是没有相同项的 /// 进行两次遍历,第一次先查找里面有没有同类的东西,第二次再查找空的背包槽 /// 当然这里的背包存储的物品的个数没有上限 /// </summary> /// <param name="items"></param> public void AddItem(Dictionary <int, GameObject> items) { // 第一次遍历,找出背包槽中和字典中ID一样的物体合并 for (int i = 0; i < slotList.Count; i++) { Transform tempTransform = slotList[i].transform.Find("InventoryItem"); GameObject tempGameObject; if (tempTransform != null) { InventoryItemController tempInventory = tempTransform.GetComponent <InventoryItemController>(); if (items.TryGetValue(tempInventory.ItemID, out tempGameObject)) { tempInventory.ChangeNum(tempGameObject.GetComponent <InventoryItemController>().Number); items.Remove(tempInventory.ItemID); GameObject.Destroy(tempGameObject); } } } // 如果一次遍历无法达到目标 if (items.Count > 0) { // 寻找背包槽中的空槽放入字典中的第一个物品就可以 for (int i = 0; i < slotList.Count; i++) { Transform tempTransform = slotList[i].transform.Find("InventoryItem"); if (tempTransform == null && items.Count > 0) { // 遍历中没法改变其中的值,但是直接 break 是可以的 foreach (var k in items) { k.Value.transform.SetParent(slotList[i].transform); k.Value.GetComponent <InventoryItemController>().IsInventory = true; items.Remove(k.Key); break; } } if (items.Count <= 0) { break; } } } }
/// <summary> /// 根据 ID 值进行添加材料 /// name 用来确定图标 /// </summary> public void AddItemWithID(int id, string name, int number = 1) { Show(); /// 第一次寻找字典中的相应 ID 的值并合并 for (int i = 0; i < slotList.Count; i++) { Transform tempTransform = slotList[i].transform.Find("InventoryItem"); if (tempTransform != null) { InventoryItemController tempInventory = tempTransform.GetComponent <InventoryItemController>(); if (tempInventory.ItemID == id) { tempInventory.ChangeNum(number); Hide(); return; } } } /// 没找到的时候添加一个 for (int i = 0; i < slotList.Count; i++) { Transform tempTransform = slotList[i].transform.Find("InventoryItem"); if (tempTransform == null) { GameObject temp = GameObject.Instantiate(m_View.Prefab_Item, slotList[i].transform); temp.name = "InventoryItem"; Sprite tempSprite = m_View.GetInventorySpriteByName(name); temp.GetComponent <InventoryItemController>().InitSingleItem(id, tempSprite, number, 0); Hide(); return; } } Hide(); }