public void OnBeginDrag(PointerEventData eventData)
        {
            if(this.itemsAreDraggable)
            {
                foreach(GameObject go in eventData.hovered)
                {
                    UIInventoryGridEntry entry = go.GetComponent<UIInventoryGridEntry>();

                    if(entry != null)
                    {

                        this.entryBeingDragged = entry;
                        this.startPosition = entryBeingDragged.rectTransform.anchoredPosition;
                        this.dragOffset = this.startPosition - new Vector2(Input.mousePosition.x, Input.mousePosition.y);
                        break;
                    }
                }
            }

            this.UpdateDropzones();
        }
        public void OnPointerDown(PointerEventData eventData)
        {
            foreach(GameObject go in eventData.hovered)
            {
                UIInventoryGridEntry uiEntry = go.GetComponent<UIInventoryGridEntry>();

                if(uiEntry != null)
                {
                    this.selectedEntry = uiEntry;
                    OnHighlight(uiEntry.entry);
                    break;
                }
            }
        }
        /**
         * Updates dropzone states
         */
        public void UpdateDropzones(UIInventoryGridEntry uiEntry = null)
        {
            // Define the entry rect, including current position
            Rect entryRect = new Rect();

            if(uiEntry == null)
            {
                uiEntry = this.entryBeingDragged;
            }

            if(uiEntry != null)
            {
                entryRect = uiEntry.rectTransform.rect;

                entryRect.x = uiEntry.rectTransform.anchoredPosition.x;
                entryRect.y = uiEntry.rectTransform.anchoredPosition.y;

                // TODO: Why is this necessary? A Y coordinate is inverted somewhere
                entryRect.y -= this.slotSize * (uiEntry.entry.item.inventorySize.y - 1);

                // Clamp rect position to grid
                entryRect.x = (float) Math.Round(entryRect.x / this.slotSize) * this.slotSize;
                entryRect.y = (float) Math.Round(entryRect.y / this.slotSize) * this.slotSize;
            }

            // Look for dropzones
            for(int i = 0; i < this.transform.childCount; i++)
            {
                UIDropzone zone = this.transform.GetChild(i).GetComponent<UIDropzone>();

                if(zone != null)
                {
                    // Define the dropzone rect, including position
                    Rect zoneRect = zone.GetImage().rectTransform.rect;

                    zoneRect.x = zone.GetImage().rectTransform.anchoredPosition.x;
                    zoneRect.y = zone.GetImage().rectTransform.anchoredPosition.y;

                    // Set the dropzone hover state based on rect overlap
                    bool isHovering = entryRect.Overlaps(zoneRect);
                    zone.SetHover(isHovering);
                }
            }
        }
        public void OnEndDrag(PointerEventData eventData)
        {
            if(this.itemsAreDraggable && this.entryBeingDragged != null)
            {
                // If no zone was found, snap back to the start position
                Vector2 snapPosition = this.startPosition;

                // Look for dropzones
                for(int i = 0; i < this.transform.childCount; i++)
                {
                    UIDropzone zone = this.transform.GetChild(i).GetComponent<UIDropzone>();

                    // If the dropzone is hovered, set that to the snap position
                    if(zone != null && zone.GetHover())
                    {
                        snapPosition = zone.GetImage().rectTransform.anchoredPosition;
                        break;
                    }
                }

                // Get grid position from UI position
                int x = (int)Math.Round(snapPosition.x / this.slotSize);
                int y = -(int)Math.Round(snapPosition.y / this.slotSize);

                // Try to place the entry into the inventory grid
                // If this fails, reset the snap position
                if(!this.inventory.PlaceIntoGrid(x, y, this.entryBeingDragged.entry))
                {
                    snapPosition = this.startPosition;
                }

                this.entryBeingDragged.rectTransform.anchoredPosition = snapPosition;
            }

            this.entryBeingDragged = null;

            this.UpdateDropzones(this.selectedEntry);
        }