Ejemplo n.º 1
0
    /// <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;
        }
    }
Ejemplo n.º 2
0
 /// <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);
 }
Ejemplo n.º 3
0
    /// <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;
        }
    }