/// <summary> /// 锻造物品功能:重点 /// </summary> public void ForgeItem() { //得到当前锻造面板里面有哪些材料 List <int> haveMaterialIDList = new List <int>();//存储当前锻造面板里面拥有的材料的ID foreach (_Slot slot in slotArray) { if (slot.transform.childCount > 0) { _ItemUI currentItemUI = slot.transform.GetChild(0).GetComponent <_ItemUI>(); for (int i = 0; i < currentItemUI.Amount; i++) { haveMaterialIDList.Add(currentItemUI.Item.ID);//物品槽里有多少个物品,就存储多少个ID } } } //Debug.Log(haveMaterialIDList[0].ToString()); //判断满足哪一个锻造配方的需求 _Formula matchedFormula = null; foreach (_Formula formula in formulaList) { bool isMatch = formula.Match(haveMaterialIDList); //Debug.Log(isMatch); if (isMatch) { matchedFormula = formula; break; } } // Debug.Log(matchedFormula.ResID); if (matchedFormula != null) { _Knapscak.Instance.StoreItem(matchedFormula.ResID);//把锻造出来的物品放入背包 //减掉消耗的材料 foreach (int id in matchedFormula.NeedIDList) { foreach (_Slot slot in slotArray) { if (slot.transform.childCount > 0) { _ItemUI itemUI = slot.transform.GetChild(0).GetComponent <_ItemUI>(); if (itemUI.Item.ID == id && itemUI.Amount > 0) { itemUI.RemoveItemAmount(); if (itemUI.Amount <= 0) { DestroyImmediate(itemUI.gameObject); } break; } } } } } }
public virtual void OnPointerDown(PointerEventData eventData) //为虚函数,方便子类EquipmentSlot重写 { if (eventData.button == PointerEventData.InputButton.Right) //鼠标右键点击直接实现穿戴,不经过拖拽 { if (transform.childCount > 0 && _InventroyManager.Instance.IsPickedItem == false) //需要穿戴的物品得有,并且鼠标上要没有物品,否则就发生:当鼠标上有物品,在其他物品上点击鼠标右键也能穿上这种情况。 { _ItemUI currentItemUI = transform.GetChild(0).GetComponent <_ItemUI>(); if (currentItemUI.Item is _Equipment || currentItemUI.Item is _Weapon) //只有装备和物品才可以穿戴 { _Item currentItem = currentItemUI.Item; //临时存储物品信息,防止物品UI销毁导致物品空指针 currentItemUI.RemoveItemAmount(1); //当前物品槽中的物品减少1个 if (currentItemUI.Amount <= 0) //物品槽中的物品没有了 { DestroyImmediate(currentItemUI.gameObject); //立即销毁物品槽中的物品 _InventroyManager.Instance.HideToolTip(); //隐藏该物品的提示框 } _CharacterPanel.Instance.PutOn(currentItem); //直接穿戴 } } } if (eventData.button != PointerEventData.InputButton.Left) { return; //只有鼠标左键能够点击物品拖拽 } //情况分析如下: //一:自身是空 ///1.pickedItem != null(即IsPickedItem == true),pickedItem放在这个位置 ////①按下Ctrl键,放置当前鼠标上的物品的一个 ////②没有按下Ctrl键,放置当前鼠标上物品的所有 ///2.pickedItem==null(即IsPickedItem == false),不做任何处理 //二:自身不是空 ///1.pickedItem != null(即 IsPickedItem == true) ////①自身的id == pickedItem.id //////A.按下Ctrl键,放置当前鼠标上的物品的一个 //////B.没有按下Ctrl键,放置当前鼠标上物品的所有 ///////a.可以完全放下 ///////b.只能放下其中一部分 ////②自身的id != pickedItem.id,pickedItem跟当前物品交换 ///2.pickedItem == null(即IsPickedItem == false) ////①按下Ctrl键,取得当前物品槽中物品的一半 ////②没有按下Ctrl键,把当前物品槽里面的物品放到鼠标上 if (transform.childCount > 0) //二:自身不是空 { _ItemUI currentItem = transform.GetChild(0).GetComponent <_ItemUI>(); //取得当前的物品 if (_InventroyManager.Instance.IsPickedItem == false) ///2.pickedItem == null。如果当前没有选中任何物品,即当前鼠标上没有物品 { if (Input.GetKey(KeyCode.LeftControl)) ////①按下Ctrl键,取得当前物品槽中物品的一半 { int amountPicked = (currentItem.Amount + 1) / 2; //如果物品为偶数就拾取刚好一般,如果为奇数就拾取一半多一个 _InventroyManager.Instance.PickUpItem(currentItem.Item, amountPicked); int amountRemained = currentItem.Amount - amountPicked; //拾取后剩余的物品个数 if (amountRemained <= 0) //如果物品槽中没有剩余的物品了,就销毁ItemUI { Destroy(currentItem.gameObject); } else//如果物品槽中还有剩余的物品,就让它的数量减去被拾取的数量 { currentItem.SetAmount(amountRemained); } } else ////②没有按下Ctrl键,把当前物品槽里面的物品放到鼠标上 { //InventroyManager.Instance.PickedItem.SetItemUI(currentItem);//把当前物品槽里的物品复制给PickedItem(跟随鼠标移动) //InventroyManager.Instance.IsPickedItem = true;//注释的这两句合并为下面的一句 _InventroyManager.Instance.PickUpItem(currentItem.Item, currentItem.Amount); Destroy(currentItem.gameObject);//复制完之后销毁当前物品槽中的物品 } } else { ///1.pickedItem != null(即 IsPickedItem == true) ////①自身的id == pickedItem.id //////A.按下Ctrl键,放置当前鼠标上的物品的一个 //////B.没有按下Ctrl键,放置当前鼠标上物品的所有 ///////a.可以完全放下 ///////b.只能放下其中一部分 ////②自身的id != pickedItem.id,pickedItem跟当前物品交换 if (currentItem.Item.ID == _InventroyManager.Instance.PickedItem.Item.ID) { if (Input.GetKey(KeyCode.LeftControl)) { if (currentItem.Item.Capacity > currentItem.Amount) //如果物品槽里的物品容量大于当前物品数量,那就说明物品槽里还能再放 { currentItem.AddItemAmount(); //增加物品槽中物品数量 _InventroyManager.Instance.ReduceAmountItem(); //让鼠标上的物品减掉一个(默认移除一个) } else//如果物品槽里的物品容量小于当前物品数量,那就说明物品槽里不能再放了 { return; } } else { if (currentItem.Item.Capacity > currentItem.Amount) //如果物品槽里的物品容量大于当前物品数量,那就说明物品槽里还能再放 { int itemRemain = currentItem.Item.Capacity - currentItem.Amount; //物品槽还可以再放的数量 if (itemRemain >= _InventroyManager.Instance.PickedItem.Amount) //如果物品槽还可以再放的数量大于等于鼠标上的数量, 那就可以完全放下 { currentItem.AddItemAmount(_InventroyManager.Instance.PickedItem.Amount); _InventroyManager.Instance.ReduceAmountItem(itemRemain); } else//只能放下其中一部分 { currentItem.AddItemAmount(itemRemain); _InventroyManager.Instance.PickedItem.RemoveItemAmount(itemRemain); } } else//如果物品槽里的物品容量小于当前物品数量,那就说明物品槽里不能再放了 { return; } } } else//②自身的id != pickedItem.id,pickedItem跟当前物品交换 { //保存当前鼠标捡起物品,用于和物品槽中的物品交换 _Item pickedItemTemp = _InventroyManager.Instance.PickedItem.Item; int pickedItemAmountTemp = _InventroyManager.Instance.PickedItem.Amount; //保存当前物品槽中的物品,用于和鼠标上的物品交换 _Item currentItemTemp = currentItem.Item; int currentItemAmountTemp = currentItem.Amount; //两者交换 currentItem.SetItem(pickedItemTemp, pickedItemAmountTemp); //把当前鼠标上的物品放入物品槽 _InventroyManager.Instance.PickedItem.SetItem(currentItemTemp, currentItemAmountTemp); //把当前物品槽中的物品放在鼠标上 } } } else//一:自身是空 { ///1.pickedItem != null(即IsPickedItem == true),pickedItem放在这个位置 ////①按下Ctrl键,放置当前鼠标上的物品的一个 ////②没有按下Ctrl键,放置当前鼠标上物品的所有 ///2.pickedItem==null(即IsPickedItem == false),不做任何处理 if (_InventroyManager.Instance.IsPickedItem == true) { if (Input.GetKey(KeyCode.LeftControl)) { this.StoreItem(_InventroyManager.Instance.PickedItem.Item); _InventroyManager.Instance.ReduceAmountItem(); } else//②没有按下Ctrl键,放置当前鼠标上物品的所有 { for (int i = 0; i < _InventroyManager.Instance.PickedItem.Amount; i++) { this.StoreItem(_InventroyManager.Instance.PickedItem.Item); } _InventroyManager.Instance.ReduceAmountItem(_InventroyManager.Instance.PickedItem.Amount); } } else { return; } } }