/// <summary> /// Execute drop action. /// </summary> /// <param name="eventData">Will contain item that is expected to drop here.</param> public void OnDrop(PointerEventData eventData) { InventoryItem eventSourceItem = eventData.pointerDrag.GetComponent <InventoryItem>(); if (!eventSourceItem.CurrentParent.CanChildMove) { return; } // Source Item must be present. if (eventSourceItem == null) { throw new ArgumentException($"{nameof(InventorySlot)} dropped object is not item."); } // Slot must be valid for taking items. if (!SlotType.CanTakeItems()) { return; } // Slot must be eligible for source item. if (!SlotType.CanAcceptItem(eventSourceItem.CurrentItemData.Type)) { return; } if (newItemCallback != null && newItemCallback.Invoke(this, eventSourceItem)) { return; } // Stacking happens if is not free and other item is also in stack-able category if (!IsFree && SlotType.CanStackItems() && CurrentItem.CanStackWith(eventSourceItem)) { CurrentItem.UpdateStackSize(eventSourceItem); return; } // On free we can insert item. if (IsFree) { AdoptChild(eventSourceItem); return; } }