public void OnDraggableEnter() { if (container != null && container.CanDrop(Draggable.current, this)) { onDragEnterCanSlot.Invoke(); } else { onDragEnterCannotSlot.Invoke(); } }
public void OnEndDrag(PointerEventData eventData) { if (!dragging) { return; } // raycast to find what we're dropping over Slot target = GetSlotUnderMouse(); ObjectContainer containerTarget = null; ObjectContainer containerDrag = slot.container; bool legal = true; // check that this move is OK with both containers - they can both veto it if (target) { containerTarget = target.container; // if there is a container and we can't drop into it for game logic reasons, cancel the drag if (containerTarget != null) { if (containerTarget.CanDrop(this, target) == false) { legal = false; } } // check the other way too, since the drag and drop is a swap if (containerDrag != null) { if (containerDrag.CanDrop(target.item, slot) == false) { legal = false; } } } // we're Ok to move if (legal) { Slot fromSlot = slot; SwapWith(target, containerDrag != null ? containerDrag.IsReadOnly() : true, containerTarget != null ? containerTarget.IsReadOnly() : true); // game logic - let both containers know about the update if (containerTarget != null) { containerTarget.Drop(target, containerDrag); } if (containerDrag != null) { containerDrag.Drop(fromSlot, containerTarget); } } else { // allow us to make a sound or anything similar that the rejecting container has specified containerTarget.onDragFail.Invoke(); } // return to our parent slot now transform.SetParent(slot.GetSlot()); (transform as RectTransform).anchoredPosition3D = Vector3.zero; dragging = false; current = null; // call the dragexit functions when we're placing, to unhighlight everything. // at the slot level... if (currentSlotOver) { currentSlotOver.OnDraggableExit(); } // ...and at the container level ObjectContainer oldContainer = currentSlotOver != null ? currentSlotOver.container : null; if (oldContainer != null) { oldContainer.OnDraggableExit(); } currentSlotOver = null; currentSlotOver = null; if (canvas) { canvas.sortingOrder = 0; } InventoryUI.Instance.UpdateInventory(); }