- Home /
Detection of Overlap is offset by about 16.5f and increases based on scale.
Two scripts one for Slot one for Item.
Issue
Once scale of Item goes over 4x4 the Overlap detection goes off by about 16.5f. Ideally the detection be right and on point no matter the scale even at 100x100. I believe core problem is inside Slot Script between lines (58-61).
SetUp
Panel
GridLayoutGroup apply following settings
CellSize (X = 35, Y = 35)
StartCorner (Upper Left)
ChildAlignment (UpperLeft)
Image
Apply Slot Script bellow and attach as child to Panel
D_Color = Hex B0B0B0
O_Color = Hex 2ACACF
Image Source Image = UISprite
Button
Attach Item Script same level at panel NOT A CHILD OF PANEL
My Scale (X = 5, Y = 5) or Larger
Button Colors = Hex 1C1C1C
Image Source Image = UISprite
SCRIPTS
Slot.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Slot : MonoBehaviour, IDragHandler, IDropHandler
{
//[HideInInspector]
public Rect itemRect;
[HideInInspector]
public Rect myRect;
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 Item_CS 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()
{
if (Item_DragRect != null)
{
CurrItem = Item_DragRect.GetComponent<Item_CS>();
Vector3[] sCorners = new Vector3[4];
rectTransform.GetWorldCorners(sCorners);
Vector2 MyPos = ((Vector2)sCorners[0] * 1);
Vector3[] iCorners = new Vector3[4];
Item_DragRect.GetWorldCorners(iCorners);
Vector2 ItemPos = ((Vector2)iCorners[0]);
if(rectParent != null)
{
Vector3[] pCorners = new Vector3[4];
rectParent.GetWorldCorners(pCorners);
Vector2 ParentPos = ((Vector2)pCorners[0]);
}
myRect = new Rect(MyPos.x, MyPos.y, rectTransform.rect.width, rectTransform.rect.height);
itemRect = new Rect(ItemPos.x + (CurrItem.MyScale.x), ItemPos.y + (CurrItem.MyScale.y), Item_DragRect.rect.width, Item_DragRect.rect.height);
if (!myRect.Overlaps(itemRect))
{
GetComponent<Image>().color = D_Color;
}
else
{
GetComponent<Image>().color = O_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;
using System.Linq;
public class Item_CS : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{
public static GameObject Item_Dragged;
public GameObject CurrID;
public Vector2 MyScale;
private Vector3 ItemPos;
public Rect myRect;
public List<Slot> Slots;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
RectTransform rectTransform = this.GetComponent<RectTransform>();
myRect = new Rect(rectTransform.localPosition.x, rectTransform.localPosition.y, rectTransform.rect.width, rectTransform.rect.height);
rectTransform.sizeDelta = new Vector2(MyScale.x * 35f, MyScale.y * 35f);
DragFunction();
CurrID = Item_Dragged;
if(Slots.Count != MyScale.x * MyScale.y)
{
Slots = new Slot[Mathf.RoundToInt(MyScale.x * MyScale.y)].ToList();
}
}
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)
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
}
}
public void OnPointerExit(PointerEventData eventData)
{
//throw new System.NotImplementedException();
}
}
Your answer
Follow this Question
Related Questions
Unity Check overlap of rect works except if in gridlayoutgroup 0 Answers
Horizontal Layout Group making a Scroll Rect's Content rect width to be negative 1 Answer
Best approach in making Inventory UseItem functionality. 1 Answer
Why RecTransform.rect.center.Set isn't working? 0 Answers
Layout of standard rect window? 1 Answer