Search code examples
c#unity-game-enginegrid-layoutoverlappinginventory

Unity Check overlap of rect works except if in gridlayoutgroup


So for my scene I have an Item and a Slot script. If the Slot script is applied to UI in GridLayoutGroup it doesn't read, even if it is hovering or not. However if Slot UI object is not insideGridLayoutGroup it reads overlap fine.

Below are the scripts. I am basing scale on 35px currently for testing.

Slot.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class Slot : MonoBehaviour, IDragHandler, IDropHandler
{

    public RectTransform Item_DragRect
    {
        get
        {
            if(Item_CS.Item_Dragged != null)
            {
                return Item_CS.Item_Dragged.GetComponent<RectTransform>();
            }
            else
            {
                return null;
            }
        }
    }
    public RectTransform rectTransform;
    public Rect DisplayRect;

    public Color D_Color;
    public Color O_Color;
    public Color T_Color;
    public GameObject CurrItem;

    // Start is called before the first frame update
    void Start()
    {
        rectTransform = this.GetComponent<RectTransform>();
    }

    // Update is called once per frame
    public void FixedUpdate()
    {
        DisplayRect = new Rect(rectTransform.localPosition.x, rectTransform.localPosition.y, rectTransform.rect.width, rectTransform.rect.height);
        if (Item_DragRect != null)
        {
            CurrItem = Item_DragRect.gameObject;
            Rect myRect = new Rect(rectTransform.localPosition.x, rectTransform.localPosition.y, rectTransform.rect.width, rectTransform.rect.height);
            Rect ItemRect = new Rect(Item_DragRect.localPosition.x, Item_DragRect.localPosition.y, Item_DragRect.rect.width, Item_DragRect.rect.height);

            if (ItemRect.Overlaps(myRect))
            {
                GetComponent<Image>().color = O_Color;
            }
            else
            {
                GetComponent<Image>().color = D_Color;
            }
        }
        else
        {
            CurrItem = null;
            GetComponent<Image>().color = D_Color;
        }
    }
    public void OnDrag(PointerEventData eventData)
    {

    }

    public void OnDrop(PointerEventData eventData)
    {

    }
}

Item_CS.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Item_CS : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{
    public static GameObject Item_Dragged;
    public GameObject CurrID;
    public Vector2 MyScale;
    private Vector3 ItemPos;




    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        RectTransform rectTransform = this.GetComponent<RectTransform>();
        rectTransform.sizeDelta = new Vector2(MyScale.x * 35, MyScale.y * 35);
        DragFunction();
        CurrID = Item_Dragged;
    }

    public void DragFunction()
    {
        if(Item_Dragged != null)
        {
            Item_Dragged.transform.SetAsLastSibling();
        }
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        if(Item_Dragged == null)
        {
            Item_Dragged = gameObject;
            GetComponent<CanvasGroup>().blocksRaycasts = false;
        }
        else
        {
            Item_Dragged = gameObject;
            GetComponent<CanvasGroup>().blocksRaycasts = false;
        }
    }

    public void OnDrag(PointerEventData eventData)
    {
        this.transform.position = Input.mousePosition;       
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Item_Dragged = null;
        GetComponent<CanvasGroup>().blocksRaycasts = true;
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        //throw new System.NotImplementedException();
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        //throw new System.NotImplementedException();
    }
}

Solution

  • So turns out it was because of parent object had cancel out its transform as far as position by adding it to current so added a simple check see if slot parent has gridlayoutgrid if so to cancel out the difference

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    
    public class Slot : MonoBehaviour, IDragHandler, IDropHandler
    {
    
        public RectTransform Item_DragRect
        {
            get
            {
                if(Item_CS.Item_Dragged != null)
                {
                    return Item_CS.Item_Dragged.GetComponent<RectTransform>();
                }
                else
                {
                    return null;
                }
            }
        }
        public RectTransform rectTransform;
        public RectTransform rectParent;
        public Rect DisplayRect;
    
        public Color D_Color;
        public Color O_Color;
        public Color T_Color;
        public GameObject CurrItem;
    
        // Start is called before the first frame update
        void Start()
        {
            rectTransform = this.GetComponent<RectTransform>();
            if(GetComponentInParent<GridLayoutGroup>() != null)
            {
                rectParent = GetComponentInParent<GridLayoutGroup>().GetComponent<RectTransform>();
            }
            else
            {
                rectParent = null;
            }
    
        }
    
        // Update is called once per frame
        public void FixedUpdate()
        {
            DisplayRect = new Rect(rectTransform.transform.position.x, rectTransform.transform.position.y, rectTransform.rect.width, rectTransform.rect.height);
            if (Item_DragRect != null)
            {
                CurrItem = Item_DragRect.gameObject;
                if(rectParent != null)
                {
                    Rect myRect = new Rect(rectTransform.localPosition.x + rectParent.localPosition.x, rectTransform.localPosition.y + rectParent.localPosition.y, rectTransform.rect.width, rectTransform.rect.height);
                    Rect ItemRect = new Rect(Item_DragRect.localPosition.x, Item_DragRect.localPosition.y, Item_DragRect.rect.width, Item_DragRect.rect.height);
    
                    if (ItemRect.Overlaps(myRect))
                    {
                        GetComponent<Image>().color = O_Color;
                    }
                    else
                    {
                        GetComponent<Image>().color = D_Color;
                    }
                }
                else
                {
                    Rect myRect = new Rect(rectTransform.localPosition.x, rectTransform.localPosition.y, rectTransform.rect.width, rectTransform.rect.height);
                    Rect ItemRect = new Rect(Item_DragRect.localPosition.x, Item_DragRect.localPosition.y, Item_DragRect.rect.width, Item_DragRect.rect.height);
    
                    if (ItemRect.Overlaps(myRect))
                    {
                        GetComponent<Image>().color = O_Color;
                    }
                    else
                    {
                        GetComponent<Image>().color = D_Color;
                    }
                }
    
    
            }
            else
            {
                CurrItem = null;
                GetComponent<Image>().color = D_Color;
            }
        }
        public void OnDrag(PointerEventData eventData)
        {
    
        }
    
        public void OnDrop(PointerEventData eventData)
        {
    
        }
    }