标签:Image worldPos 响应 Unity 判定 polygonCollider2D override UI
一:前言
例如这张UI图片,正常情况下它的响应区域是一个矩形,如果当前有个需求是只有点击到UI元素上才视为点击,其他空白地方不视作点击,显然正常的做法不能满足需求
UGUI为我们提供了一种实现响应区域精确判断的方法,可以代码动态将alphaHitTestMinimumThreshold参数设置为0.1,这样就实现了只有在透明度大于0.1的像素点才视为响应,但它要求图片的Read/Write Enabled必须开启,这就导致了图片占用了两份内存,所以不建议使用
还有一种方法可以看这篇文章:Unity中实现自己的圆形Image组件_L的博客-CSDN博客
使用Ray-Crossing算法去判断响应区域,但前提是UI元素必须是代码动态绘制出来的
对于上面这种美术直接提供的PNG素材的响应区域精确判断,我们可以使用Polygon Collider2D组件,将大致轮廓勾出来,然后使用OverlapPoint方法计算是否在多边形碰撞器区域内
二:代码实现
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 多边形Image组件
/// </summary>
[AddComponentMenu("LFramework/UI/PolygonImage", 12)]
[RequireComponent(typeof(PolygonCollider2D))]
public class PolygonImage : Image
{
/// <summary>
/// 2D多边形碰撞器
/// </summary>
PolygonCollider2D m_polygonCollider2D;
protected override void Awake()
{
m_polygonCollider2D = GetComponent<PolygonCollider2D>();
}
protected override void OnPopulateMesh(VertexHelper vh)
{
base.OnPopulateMesh(vh);
}
public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
Vector3 worldPos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, screenPoint, eventCamera, out worldPos);
return m_polygonCollider2D.OverlapPoint(worldPos);
}
}
标签:Image,worldPos,响应,Unity,判定,polygonCollider2D,override,UI 来源: https://blog.csdn.net/LLLLL__/article/details/122146807
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。