今天碰到要判断两个UI是否相交的交互。
尝试了下,发现有两个方法都成功了。
1、使用Collider2D组件
分别创建两个Image组件,并且添加Collider2D组件,其中一个还要添加Rigidbody2D组件,如下图:
然后创建个判断脚本“UIintersect.cs",具体脚本代码如下,把脚本拉到场景中,当物体碰到一起是就能检测到它们是否相交了。
public Image image1;
public Image image2;
private Collider2D collider1;
private Collider2D collider2;
// Start is called before the first frame update
void Start()
{
// 获取image1和image2的Collider组件
collider1 = image1.GetComponent<Collider2D>();
collider2 = image2.GetComponent<Collider2D>();
}
// Update is called once per frame
void Update()
{
// 检测两个Collider是否相交
if (collider1.IsTouching(collider2))
{
Debug.Log("UI相交了!");
}
else
{
Debug.Log("UI没有相交!");
}
}
2、使用RectTransform组件和边界框。
本方法只需要脚本获取UI的RectTransform,然后判断它们的边界是否相交即可。
代码如下:
public RectTransform uiElement1;
public RectTransform uiElement2;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (CheckCollision(uiElement1, uiElement2))
{
Debug.Log("UI相交了!");
}
else
{
Debug.Log("UI没有相交!");
}
}
private bool CheckCollision(RectTransform rectTransform1, RectTransform rectTransform2)
{
Rect rect1 = rectTransform1.rect;
Rect rect2 = rectTransform2.rect;
Rect worldRect1 = GetWorldRect(rectTransform1);
Rect worldRect2 = GetWorldRect(rectTransform2);
return worldRect1.Overlaps(worldRect2);
}
private Rect GetWorldRect(RectTransform rectTransform)
{
Vector3[] corners = new Vector3[4];
rectTransform.GetWorldCorners(corners);
Vector3 bottomLeft = corners[0];
Vector3 topRight = corners[2];
return new Rect(bottomLeft.x, bottomLeft.y, topRight.x - bottomLeft.x, topRight.y - bottomLeft.y);
}
把代码拉到场景中,也能判断UI是否相交。
总的感觉两种方法都不错。
效果:Unity判断两个UI是否相交_哔哩哔哩_bilibili