//아이템 테이블 새로고침 ( 탭 아이템 리스트 시각화) 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; }
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(); }