阶段1:点击准备槽显示 “equiped new item”+item.data.name且限定类型为Equipment
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.EventSystems;
public class UI_itemSlot : MonoBehaviour ,IPointerDownHandler//是物品栏的每一个格子{[SerializeField] private Image itemImage;//物品图片[SerializeField] private TextMeshProUGUI itemText;//物品数量文字
public InventoryItem item;//获取物品信息与上述2属性绑定
public voidOnPointerDown(PointerEventData eventData){if(item.data.itemDataType == ItemDataType.Equipment)
Debug.Log("equiped new item"+ item.data.name);}}//利用IPointerDownHandler来检测鼠标点下事件,当点下时调用OnPointerDown
阶段2:实现点击准备上Equip ment类
//新建UI_equipementSlots
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UI_equipementSlots : UI_itemSlot
{
public EquipmentType slotType;
private voidOnValidate(){
gameObject.name ="Equipment slot -"+ slotType.ToString();}}
//修改脚本Inventory
public List<InventoryItem> equipment;//inventoryItems类型的列表
public Dictionary<ItemData_equipment, InventoryItem> equipmentDictionary;//以ItemData为Key寻找InventoryItem的字典[SerializeField] private Transform equipmentSlotParent;
private UI_equipementSlots[] equipmentSlot;
public voidStart(){
equipment = new List<InventoryItem>();
equipmentDictionary = new Dictionary<ItemData_equipment, InventoryItem>();
equipmentSlot = equipmentSlotParent.GetComponentsInChildren<UI_equipementSlots>();}
public voidEquipItem(ItemData _item){//解决在itemdata里拿不到子类equipment里的enum的问题
ItemData_equipment newEquipment = _item as ItemData_equipment;//将父类转换为子类
InventoryItem newItem = new InventoryItem(newEquipment);
ItemData_equipment oldEquipment = null;foreach(KeyValuePair<ItemData_equipment, InventoryItem> item in equipmentDictionary)//这种方法可以同时拿到key和value保存到item里面{if(item.Key.equipmentType == newEquipment.equipmentType)//将拿到的key与转换成itemdata_equipment类型的_item的type对比拿到存在的key{
oldEquipment = item.Key;//此key需保存在外部的data类型里//equipment.Remove(item.Value);//equipmentDictionary.Remove(item.Key);}}//好像用foreach里的value和key无法对外部的list和字典进行操作if(oldEquipment != null){Unequipment(oldEquipment);AddItem(oldEquipment);}
equipment.Add(newItem);
equipmentDictionary.Add(newEquipment, newItem);RemoveItem(_item);}
private voidUnequipment(ItemData_equipment itemToRemove)//装备其他同类型的装备时。去除已装备的装备{if(equipmentDictionary.TryGetValue(itemToRemove, out InventoryItem value)){
equipment.Remove(value);
equipmentDictionary.Remove(itemToRemove);}}
private voidUpdateSlotUI(){for(int i =0; i < equipmentSlot.Length; i++){//此步骤用于将对应类型的武器插入对应的槽内foreach(KeyValuePair<itemData_Equipment, InventoryItem> item in equipmentDictionary)//这种方法可以同时拿到key和value保存到item里面{if(item.Key.equipmentType == equipmentSlot[i].slotType){
equipmentSlot[i].UpdateSlots(item.Value);}}}//解决出现UI没有跟着Inventory变化的bugfor(int i =0; i < inventoryItemSlot.Length;i++){
inventoryItemSlot[i].CleanUpSlot();}for(int i =0; i < stashItemSlot.Length; i++){
stashItemSlot[i].CleanUpSlot();}for(int i =0; i < inventory.Count; i++){
inventoryItemSlot[i].UpdateSlots(inventory[i]);}for(int i =0; i < stash.Count; i++){
stashItemSlot[i].UpdateSlots(stash[i]);}}
//修改脚本UI_itemSlot
public voidCleanUpSlot()//解决出现UI没有跟着Inventory变化的bug{
item = null;
itemImage.sprite = null;
itemImage.color = Color.clear;
itemText.text ="";}
public voidOnPointerDown(PointerEventData eventData){if(item.data.itemType == ItemType.Equipment)
Inventory.instance.EquipItem(item.data);}