I'd like to know how I check whether two UI Panels on my Unity Canvas are overlapping each other.
Currently I am doing this by comparing the canvas elements Rects
Canvas Settings
- Render Mode: Screen Space - Camera
- Pixel Perfect: [Yes]
- Render Camera: Main Camera
- Plane Distance: 100
- Sorting Layer: Default
- Order In Layer: 0
Canvas Scaler Settings
- UI Scale Mode: Constant Pixel Size
- Scale Factor: 1
- Reference Pixels Per Unit: 100
Code I am using to check
[Header("Check For Overlap")]
public RectTransform PlayerBar;
public RectTransform LeftBar;
public Rect RectOne;
public Rect RectTwo;
public bool overlapping;
//Check if the two canvas element Rects overlap each other
public void CheckForOverlap()
{
overlapping = false;
// Convert Canvas RectTransforms to World Rects
RectOne = GetWorldRect(LeftBar);
RectTwo = GetWorldRect(PlayerBar);
if (RectOne.Overlaps(RectTwo))
{
overlapping = true;
}
}
public Rect GetWorldRect(RectTransform rt)
{
// Get World corners, take top left
Vector3[] corners = new Vector3[4];
rt.GetWorldCorners(corners);
Vector3 topLeft = corners[0];
// Rect Size ... I'm not sure if this is working correctly?
Vector2 size = new Vector2(rt.rect.size.x, rt.rect.size.y);
return new Rect(topLeft, size);
}
What happens
'Overlapping' bool instantly changes to true.
The Rect One returns as (example)
X -7.5, Y 2.5 W 98.5, H 164.1667
Convert the
RectTransform
toRect
then check if it overlaps.Here is a simple function that can do that:
Usage:
Even better, make it an extension method:
Now, you can do
Updated version considering scale of the rectTransform.