unity提供了很多API给我们使用,但是经常会由于锚点或者不好的原因计算错误的结果,这里有一个100%正确的做法。
private Rect GetWorldRect(RectTransform rectTransform)
{
Vector3[] corners = new Vector3[4];
rectTransform.GetWorldCorners(corners);
float width = Math.Abs(Vector2.Distance(corners[0], corners[3]));
float height = Math.Abs(Vector2.Distance(corners[0], corners[1]));
return new Rect(corners[0], new Vector2(width, height));
}
private bool IsClickInArea(Vector2 position)
{
RectTransform rect = transform as RectTransform;
if(rect!=null)
{
Rect worldRect = GetWorldRect(rect);
RectTransformUtility.ScreenPointToWorldPointInRectangle((RectTransform)canvas.transform, position, UICamera, out Vector3 worldPosition);
return worldRect.Contains(worldPosition);
}
return false;
}
都转化到世界坐标判断,就无敌了