// create a Slot (or use the optional supplied one) and populate it with the given object protected Slot MakeSlot(UnityEngine.Object obj, Slot preMade = null) { GameObject go = null; Slot slot = preMade; if (slot != null) { // use the existing one and get its GameObject go = slot.gameObject; } else { // make a child slot go = Instantiate(slotPrefab.gameObject, transform); slot = go.GetComponent <Slot>(); } // make an item object inside it as a child GameObject goi = Instantiate(itemPrefab.gameObject, slot.GetSlot()); Draggable item = goi.GetComponent <Draggable>(); item.SetObject(obj); // set up all required pointers slot.item = item; slot.container = this; item.slot = slot; return(slot); }
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(); }