void Start() { toolTip = GameObject.FindObjectOfType <_ToolTip>();//根据类型获取 canvas = GameObject.Find("Canvas").GetComponent <Canvas>(); pickedItem = GameObject.Find("PickedItem").GetComponent <_ItemUI>(); pickedItem.Hide();//开始为隐藏状态 }
//直接穿戴功能(不需拖拽) 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); }
/// <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; } } } } } }
//控制物品信息的保存(ID,Amount数量) public void SaveInventory() { StringBuilder sb = new StringBuilder();//用来保存物品信息的字符串 foreach (_Slot slot in slotArray) { if (slot.transform.childCount > 0) { _ItemUI itemUI = slot.transform.GetChild(0).GetComponent <_ItemUI>(); sb.Append(itemUI.Item.ID + "," + itemUI.Amount + "-");//用逗号分隔一个物品中的ID和数量,用 - 分隔多个物品 } else { sb.Append("0-");//如果物品槽里没有物品就是0 } } PlayerPrefs.SetString(this.gameObject.name, sb.ToString());//保存字符串数据 }
public _Weapon.WeaponType wpType; //武器类型,只有副手和主手能有武器,其他为Null public override void OnPointerDown(UnityEngine.EventSystems.PointerEventData eventData) //重写父类Slot的方法 { if (eventData.button == PointerEventData.InputButton.Right) //鼠标右键点击直接实现脱掉,不经过拖拽 { if (transform.childCount > 0 && _InventroyManager.Instance.IsPickedItem == false) //需要脱掉的物品得有,并且鼠标上要没有物品,否则就发生:当鼠标上有物品,在其他物品上点击鼠标右键也能脱掉这种情况。 { _ItemUI currentItemUI = transform.GetChild(0).GetComponent <_ItemUI>(); _Item item = currentItemUI.Item; //临时保存物品信息,防止下面一销毁就没了 DestroyImmediate(currentItemUI.gameObject); //立即销毁物品槽中的物品 transform.parent.SendMessage("PutOff", item); //脱掉物品放入背包里(发送消息方式) _InventroyManager.Instance.HideToolTip(); //隐藏该物品的提示框 } } if (eventData.button != PointerEventData.InputButton.Left) { return; //只有鼠标左键能够点击物品拖动 } //情况分析: //一:鼠标上有物品 //1.当前装备槽有装备 //2.当前装备槽无装备 //二:鼠标上没有物品 //1.当前装备槽有装备 //2.当前装备槽无装备(不做任何处理) bool isUpdataProperty = false; //是否需要更新角色属性 if (_InventroyManager.Instance.IsPickedItem == true) //一:鼠标上有物品 { _ItemUI pickedItemUI = _InventroyManager.Instance.PickedItem; //鼠标上的物品 if (transform.childCount > 0) //1.当前装备槽有装备 { _ItemUI currentItemUI = transform.GetChild(0).GetComponent <_ItemUI>(); //当前物品槽中的物品 if (IsRightItem(pickedItemUI.Item) && pickedItemUI.Amount == 1) //如果鼠标上的物品是否适合放在该位置并且鼠标上的物品只有一个时,那就交换,否则不做处理 { pickedItemUI.Exchange(currentItemUI); isUpdataProperty = true;//需要更新角色属性 } } else//2.当前装备槽无装备 { if (IsRightItem(pickedItemUI.Item))//如果鼠标上的物品是否适合放在该位置,那就把该物品放入角色面板,并且鼠标上的物品减少一个,否则不做处理 { this.StoreItem(pickedItemUI.Item); _InventroyManager.Instance.ReduceAmountItem(1); isUpdataProperty = true;//需要更新角色属性 } } } else//二:鼠标上没有物品 { if (transform.childCount > 0) //1.当前装备槽有装备,把装备去到鼠标上,销毁物品槽中的物品 { _ItemUI currentItemUI = transform.GetChild(0).GetComponent <_ItemUI>(); _InventroyManager.Instance.PickUpItem(currentItemUI.Item, currentItemUI.Amount); Destroy(currentItemUI.gameObject); isUpdataProperty = true;//需要更新角色属性 } //2.当前装备槽无装备(不做任何处理) } if (isUpdataProperty == true) { transform.parent.SendMessage("UpdatePropertyText"); } }
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; } } }
//判断物品个数是否超过物品槽的容量Capacity public bool isFiled() { _ItemUI itemUI = transform.GetChild(0).GetComponent <_ItemUI>(); return(itemUI.Amount >= itemUI.Item.Capacity); //true表示当前数量大于等于容量,false表示当前数量小于容量 }