/// <summary> /// 拖拽开始 /// </summary> /// <param name="eventData"></param> public void OnBeginDrag(PointerEventData eventData) { if (!active) { return; } //如果光标层已经存在物体,则无法触发拖拽 if (InventoryModule.Instance.PickUpEntity.GetComponentInChildren <ItemEntity>() != null) { return; } switch (itemState) { case ItemState.Common: cacheSlot = transform.parent.GetComponent <SlotEntity>() ?? throw new Exception("null"); //缓存当前格子,拖拽失败时返回 InventoryModule.Instance.PickUpEntity.SetPickUpItem(this); //设置当前跟随鼠标 break; case ItemState.Instore: cacheSlot = transform.parent.GetComponent <SlotEntity>() ?? throw new Exception("null"); //缓存当前格子,拖拽失败时返回 var item = ItemModule.Instance.GetItemEntity(data.id); //复制商店的物品 item.itemState = ItemState.Instore; //设置复制品的状态 InventoryModule.Instance.PickUpEntity.SetPickUpItem(this); //将商店的物品放在光标层 cacheSlot.AddItem(item); //将复制品放商店 break; case ItemState.Check: break; } }
/// <summary> /// 储存物品 假设每次最多存入一组物品 /// </summary> /// <param name="item"></param> /// <returns>剩余物品</returns> public virtual ItemEntity SetItem(ItemEntity item) { if (item == null || item.data == null) { throw new Exception("null"); } //无法堆叠的物品 if (item.data.capacity == 1) { //创建新itemUI SlotEntity s = FindSlot(); if (s == null) { Debug.Log("没有储存空间"); return(item); } s.AddItem(item);//将物品放置在格子上 } //是否存在未满相同id物品 else { var slotEntity = FindSlotById(item.data.id);//查找相同id的格子 //存在没有装满的相同id物品 if (slotEntity != null && slotEntity.data != null) { //存入item后 没有超过最大堆叠 if (slotEntity.data.amount + item.data.amount <= slotEntity.data.capacity) { slotEntity.data.amount += item.data.amount; slotEntity.OnRefresh();//刷新数据 item.OnRefresh(); } //超过了最大堆叠 else { item.data.amount -= item.data.capacity - slotEntity.data.amount; //传入的物品数量减少 slotEntity.data.amount = item.data.capacity; //格子中存满 slotEntity.OnRefresh(); //刷新数据 item.OnRefresh(); //创建新itemUI SlotEntity s1 = FindSlot();//没有位置了 if (s1 == null) { return(item); } s1.AddItem(item);//存入+刷新 } } //不存在未装满的相同id物品 else { var s = FindSlot(); if (s == null) { return(item); } s.AddItem(item); } } return(null); }
/// <summary> /// 拖拽结束 /// </summary> /// <param name="eventData"></param> public void OnEndDrag(PointerEventData eventData) { if (!active) { return; } var mouseItem = InventoryModule.Instance.PickUpEntity.GetComponentInChildren <ItemEntity>();//当前光标层上的物品 //光标层上没有物品 或者物品与本次拖拽的不同,不触发拖拽模式,mouseItem与this相等用于判定光表层的物品和本次拖拽相同,否则光表层的物品可能是点击选取的 if (mouseItem == null || mouseItem != this) { return; } switch (itemState) { case ItemState.Common: //无效拖拽 if (eventData.pointerCurrentRaycast.gameObject == null) { cacheSlot.AddItem(this); //放回原格子 return; } var itemEntity = eventData.pointerCurrentRaycast.gameObject.GetComponent <ItemEntity>(); //当前鼠标位置存在物品 if (itemEntity != null) { switch (itemEntity.itemState) { //背包物品拖拽到背包物品 交换 叠加 case ItemState.Common: //相同id 并且可以叠加 执行叠加 if (data.id == itemEntity.data.id && data.capacity != 1) { if (data != null && itemEntity.data != null) { if (itemEntity.data.amount >= itemEntity.data.capacity) //已经达到最大堆叠 { cacheSlot.AddItem(this); //放回原格子 return; } //没有超过堆叠上限 if (itemEntity.data.amount + data.amount <= itemEntity.data.capacity) { itemEntity.data.amount += data.amount; //物品叠加 data.amount = 0; OnRefresh(); //更新UI itemEntity.OnRefresh(); } //超过最大堆叠 else { data.amount -= itemEntity.data.capacity - itemEntity.data.amount; itemEntity.data.amount = itemEntity.data.capacity; cacheSlot.AddItem(this); //放回原格子 OnRefresh(); //更新 itemEntity.OnRefresh(); } } } //交换 else { var slot = itemEntity.GetComponentInParent <SlotEntity>() ?? throw new Exception("null"); cacheSlot.AddItem(itemEntity); //终点的物品放到起点 slot.AddItem(this); //起点的物品放到终点 } break; //背包物品拖拽到商店 出售 case ItemState.Instore: ItemModule.Instance.Sell(this); break; default: cacheSlot.AddItem(this); //无效拖拽 放回原格子 break; } } else { var slot = eventData.pointerCurrentRaycast.gameObject.GetComponent <SlotEntity>(); //当前鼠标位置存在格子 if (slot != null) { switch (slot.slotType) { case SlotType.Common: slot.AddItem(this); //拖拽到普通格子结束 放置 break; case SlotType.Store: ItemModule.Instance.Sell(this); //拖拽到商店格子结束 出售 break; } } else { cacheSlot.AddItem(this); //无效拖拽 放回原格子 } } break; case ItemState.Instore: if (eventData.pointerCurrentRaycast.gameObject == null) { EntityModule.Instance.UnSpawnEntity(this); //无效拖拽 销毁复制品 return; } var itemEntity1 = eventData.pointerCurrentRaycast.gameObject.GetComponent <ItemEntity>(); //当前鼠标位置存在物品 if (itemEntity1 != null) { switch (itemEntity1.itemState) { //商店格子拖拽到普通格子 购买 case ItemState.Common: ItemModule.Instance.Buy(this); EntityModule.Instance.UnSpawnEntity(this); //回收该物体 break; default: EntityModule.Instance.UnSpawnEntity(this); //本次拖拽无效 回收复制品 break; } } else { var slot = eventData.pointerCurrentRaycast.gameObject.GetComponent <SlotEntity>(); //当前鼠标位置存在格子 if (slot != null) { switch (slot.slotType) { //商店物品拖拽到背包物品上 购买 case SlotType.Common: ItemModule.Instance.Buy(this); //拖拽购买 EntityModule.Instance.UnSpawnEntity(this); //回收该物体 break; default: EntityModule.Instance.UnSpawnEntity(this); //本次拖拽无效 回收复制品 break; } } else { EntityModule.Instance.UnSpawnEntity(this); //本次拖拽无效 回收复制品 } } break; case ItemState.Check: break; } }