//直接穿戴功能(不需拖拽) public void PutOn(_Item item) { _Item exitItem = null; //临时保存需要交换的物品 foreach (_Slot slot in slotArray) //遍历角色面板中的物品槽,查找合适的的物品槽 { _EquipmentSlot equipmentSlot = (_EquipmentSlot)slot; if (equipmentSlot.IsRightItem(item)) //判断物品是否合适放置在该物品槽里 { if (equipmentSlot.transform.childCount > 0) //判断角色面板中的物品槽合适的位置是否已经有了装备 { _ItemUI currentItemUI = equipmentSlot.transform.GetChild(0).GetComponent <_ItemUI>(); exitItem = currentItemUI.Item; currentItemUI.SetItem(item, 1); } else { equipmentSlot.StoreItem(item); } break; } } if (exitItem != null) { _Knapscak.Instance.StoreItem(exitItem); //把角色面板上是物品替换到背包里面 } UpdatePropertyText(); //更新显示角色属性值 }
//当前物品(UI)和 出入物品(UI)交换显示 public void Exchange(_ItemUI itemUI) { _Item itemTemp = itemUI.Item; int amountTemp = itemUI.Amount; itemUI.SetItem(this.Item, this.Amount); this.SetItem(itemTemp, amountTemp); }
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; } } }