1.图片不规则点击事件处理-精灵像素检测法
UGUI在处理控件是否被点击的时候,主要是根据IsRaycastLocationValid这个方法的返回值来进行判断的,而这个方法用到的基本原理则是判断指定点对应像素的RGBA数值中的Alpha是否大于某个指定临界值。例如,我们知道半透明通常是指Alpha=0.5,而对一个后缀名为png格式的图片来说半透明或者完全透明的区域理论上不应该被响应的,所以根据这个原理,我们只需要设定一个透明度的临界值,然后对当前鼠标位置对应的像素进行判断就可以了,因此这种方法叫做精灵像素检测。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 不规则区域Button /// </summary> [RequireComponent(typeof(RectTransform)) [RequireComponent(typeof(Image))] public class IrregulaButton : MonoBehaviour{ [Tooltip("设定Sprite响应的Alpha阈值")] [Range(0, 0.5f)] public float alpahThreshold = 0.5f; private void Awake(){ var image = this.GetComponent<Image>(); if (null != image){ image.alphaHitTestMinimumThreshold = alpahThreshold; } } }
注:
(1).图片需要开启Read/Writeable属性
开启Texture的Read/Writeable属性,但是这样这张图片就不能打进我们的图集里面了,必须以散图的形式存在于工程当中,不利于统一管理。而且开启了Read/Writeable属性属性的话,在程序运行的时候,它会在内存中多复制出来一份,必然会影响到游戏的运行效率。所以尽量还是减少游戏中这种不规则UI的出现。
(2).像素检测有偏移,不准确的问题
实际点击的时候经常会有偏移(经常偏下一些),有的透明的地方可以点击,而明明是不透明的地方却不能点击。
对于周围有空白区域的图片,我们需要在Unity图片导入设置的时候,将Mesh Type格式设置为Full Rect,而unity导入时默认帮我们设置的是Tight模式。
2.Canvas点击事件
(1)必须添加Graphic Raycaster组件
(2)Canvas Group必须勾选Blocks Raycasts
