![c65ce917c09474ecc9768ceb0c44ce8f.png](https://i-blog.csdnimg.cn/blog_migrate/7a73d663a51342e9f6ba1fc663d03951.png)
在用Unity做项目的过程中,会遇到一类比较特殊的问题。怎么特殊呢?我给你一张圆形的图片,你拿去做按钮或者UI图,乍一听,貌似也没啥。但是有一个要求,点击图片的透明部分不能有反应(也就是说只有点击不透明的部分才能触发按钮或者图片点击),看下图(灵魂画手,哈哈哈哈),只有点击非黄色(透明)区域才能触发按钮点击。
![ce9d28429b6a852017e075592b8f4d6e.png](https://i-blog.csdnimg.cn/blog_migrate/d7386b6d8cc39d5a7429a971420cf152.png)
遇到这样的需求怎么搞呢?按照一般的思路是点击鼠标时查看鼠标点击位置的alpha的值,对其进行过滤处理。笔者一开始也是这么想的,但是查了很多API发现不太能方便的拿到这个像素的alpha值。所以后来网上找了一些资料,发现Unity在Image上提供了一个属性alphaHitTestMinimumThreshold,表示可以进行hit检测的alpha阈值,再直白一点就是图片或者按钮想要满足交互事件,那么alpha值必须大于等于我们设置的值,剩下的就不用你管了,只要设置一下这个值就OK了。
所以我们写一个脚本,再需要检测的UI上挂在此组件即可。
using UnityEngine;
[RequireComponent(typeof(UnityEngine.UI.Image))]
public class DoAlphaTest : MonoBehaviour
{
public float alphaTestThreshold = .05f;
private void Awake()
{
GetComponent<UnityEngine.UI.Image>().alphaHitTestMinimumThreshold = alphaTestThreshold;
}
}
但是首次运行会报错,如下图所示。
![a4dd70f91860e32836fc5d49602f63ae.png](https://i-blog.csdnimg.cn/blog_migrate/e45c8d228942dae5fdc264cfa72b80f9.png)
大致意思是想要使用alphaHitTestMinimumThreshold属性,Image组件使用的sprite必须是可读的,所以选择对应的Sprite,勾选“Read/WriteEnabled”属性,如下图所示。
![336ef10429f19f6c6b53c73e3a010f94.png](https://i-blog.csdnimg.cn/blog_migrate/ea21b970f1a11b67e68e9da5d4ff8917.png)
至此,这个问题已经解决了。