一、Unity自带的点击策略
在上一篇文章中我们了解到,UI的默认响应区域是UI元素所在的矩形框线内的区域。这也就意味着,当UI的图形为不规则形状时,点击图形的外部也可能会触发事件。
但其实Unity自带了一种不规则区域点击策略。要想使用它,我们首先要将精灵的「Read/Write」属性设置为开启状态
然后在代码中将「Image」组件中的「alphaHitTestMinimumThreshold」属性设置为0.1。这样图片的透明度低于0.1的地方就不会响应点击事件
void Start()
{
GetComponent<Image>().alphaHitTestMinimumThreshold = 0.1f;
}
效果如下:
但这种方式存在一个问题:如果将图片的「Read/Write」开启的话,图片所占用的内存会大幅度增加,且该图片将无法被并入图集。因此一般项目中不会使用这个功能。
二、自己实现的点击策略
既然需要自己实现点击策略,那就又要用到IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
这个方法。只是这次我们无法使用已生成好的顶点坐标列表,不过可以用「Polygon Collider 2D」组件来替代。这个组件可以给物体添加自定义形状的碰撞体(对于这张图片来说也可以添加圆形碰撞体)。
然后调用组件中的OverlapPoint
方法,就可以直接判断点击的目标点是否位于碰撞体内部
public class IrregularUIClick : Image
{
private PolygonCollider2D _polygon;
public PolygonCollider2D Polygon
{
get
{
if (_polygon == null)
_polygon = GetComponent<PolygonCollider2D>();
return _polygon;
}
}
public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, screenPoint, eventCamera,out Vector3 worldPoint);
return Polygon.OverlapPoint(worldPoint);
}
}
最终效果如下: