Ejemplo n.º 1
0
        public void OnDrag(PointerEventData eventData)
        {
            // move the dragged object with the mouse
            if (dragging)
            {
                transform.position = eventData.position;
            }
            else
            {
                return;
            }

            // highlight squares that can receive this component?
            Slot slot = GetSlotUnderMouse();

            if (slot != currentSlotOver)
            {
                if (slot)
                {
                    slot.OnDraggableEnter();
                }
                if (currentSlotOver)
                {
                    currentSlotOver.OnDraggableExit();
                }
                ObjectContainer oldContainer = currentSlotOver != null ? currentSlotOver.container : null;
                ObjectContainer newContainer = slot != null ? slot.container : null;
                if (oldContainer != null)
                {
                    oldContainer.OnDraggableExit();
                }
                if (newContainer != null)
                {
                    newContainer.OnDraggableEnter();
                }

                currentSlotOver = slot;
            }
        }
Ejemplo n.º 2
0
        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();
        }