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();
}
}
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)
{
}
}