Пример #1
0
        //아이템 테이블 새로고침 ( 탭 아이템 리스트 시각화)
        public void Refresh(InventoryTab tab)
        {
            if (tab.Capacity > slotList.Count)
            {
                Debug.Log("탭의 아이템 수용량이 슬롯 수를 초과합니다. : " + tab.TabName);
                return;
            }

            //슬롯 아이템 및 현재 탭 설정
            for (int i = 0; i < tab.Capacity; i++)
            {
                slotList[i].SetSlot(tab.ItemTable[i]);
            }

            LastRefreshedTab = tab;
        }
Пример #2
0
        void IPointerUpHandler.OnPointerUp(PointerEventData eventData)
        {
            itemHandler.OnSlotUp?.Invoke(eventData, this);

            //좌클릭 이벤트
            if (eventData.button == PointerEventData.InputButton.Left)
            {
                //이동 활성화 및 선택된 아이템 존재시 이벤트 발생
                if (itemHandler.movable && itemHandler.SelectedItem != null)
                {
                    InventorySlot targetSlot = null;
                    GameObject    lastObject = null;


                    //대상 아이템 등록
                    try
                    {
                        eventData.position = GetPointerPosition();
                        List <RaycastResult> results = new List <RaycastResult>();
                        itemHandler.gr.Raycast(eventData, results);
                        if (results.Count > 0)
                        {
                            lastObject = results[0].gameObject;
                        }


                        if ((targetSlot = lastObject.GetComponent <InventorySlot>()) != null)    // 예외처리 안할시 에러나는 부분
                        {
                            itemHandler.TargetItem = targetSlot.Item;
                        }
                    }
                    // 인벤토리 외부로 드랍됨
                    catch (Exception)
                    {
                        itemHandler.DragOutEvent?.Invoke(itemHandler.SelectedItem);
                        itemHandler.ResetItems();

                        return;
                    }

                    // 슬롯의 Slot Manager가 다를 경우 이벤트 ( 옮길수 없을 때 이벤트 )
                    if (targetSlot != null && this.slotManager != targetSlot.slotManager)
                    {
                        if (!itemHandler.moveToOtherSlot || !targetSlot.itemHandler.moveToOtherSlot)
                        {
                            itemHandler.SlotMoveFailEvent?.Invoke(itemHandler.SelectedItem);
                            itemHandler.ResetItems();
                            return;
                        }
                    }

                    /*
                     *  순서도 *
                     * 타깃이 없다 -> 이동
                     * 타깃이 있다
                     *  if (merging, allow type)
                     *      { Merge }
                     *  else if ( switching )
                     *      {Switch}
                     */

                    // 선택아이템 != 타겟아이템 일 경우 이벤트
                    if (itemHandler.SelectedItem != itemHandler.TargetItem)
                    {
                        //드랍된 곳이 슬롯일 때 이벤트
                        if (targetSlot != null)
                        {
                            InventoryTab tab = targetSlot.slotManager.LastRefreshedTab;

                            // 타겟이 없을 경우 아이템 이동
                            if (itemHandler.TargetItem == null)
                            {
                                // 타겟 슬롯에 타입이 없거나 두 타입이 일치할 경우 실행
                                if (targetSlot.allowType == "" || itemHandler.SelectedItem.Type == targetSlot.allowType)
                                {
                                    itemHandler.Move(itemHandler.SelectedItem, targetSlot);
                                    slotManager.Refresh(slotManager.LastRefreshedTab);
                                    targetSlot.slotManager.Refresh(tab);
                                }
                                else
                                {
                                    itemHandler.TypeNotMatchEvent?.Invoke(itemHandler.SelectedItem, targetSlot);
                                }
                            }
                            // 타겟이 있을 경우
                            else
                            {
                                //아이템 병합이 활성화 일 때 이벤트 실행
                                if (itemHandler.merging && (itemHandler.SelectedItem.Name == itemHandler.TargetItem.Name))
                                {
                                    itemHandler.Merge(itemHandler.SelectedItem, itemHandler.TargetItem);
                                    slotManager.Refresh(slotManager.LastRefreshedTab);
                                    targetSlot.slotManager.Refresh(tab);
                                }
                                else if (itemHandler.switching)
                                {
                                    if (targetSlot.allowType == "" || itemHandler.SelectedItem.Type == targetSlot.allowType)
                                    {
                                        itemHandler.Switch(itemHandler.SelectedItem, itemHandler.TargetItem);
                                        slotManager.Refresh(slotManager.LastRefreshedTab);
                                        targetSlot.slotManager.Refresh(tab);
                                    }
                                    else
                                    {
                                        itemHandler.TypeNotMatchEvent?.Invoke(itemHandler.SelectedItem, targetSlot);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            itemHandler.ResetItems();
        }