UGUI中的Button都是矩形的,但是在項(xiàng)目中,也會(huì)遇到不規(guī)則圖形的按鈕(比如做地圖),如果給你一張不規(guī)則的圖形,按普通的矩形按鈕做,圖形以外的區(qū)域也會(huì)添加上點(diǎn)擊事件,怎么給不規(guī)則的按鈕添加點(diǎn)擊事件呢,這里介紹兩種方法:
方法一:
修改不規(guī)則按鈕的Image組件中的的alphaHitTestMinimumThreshold屬性。
public class Test : MonoBehaviour {
public Image image;
public float test = 0.5f;
// Use this for initialization
void Start () {
image.alphaHitTestMinimumThreshold = test;
}
}

image.gif
再修改圖片的Read/Write Enabled屬性為true,這樣的話(huà),只有alpha大于設(shè)置的值時(shí),才會(huì)響應(yīng)點(diǎn)擊事件。
這個(gè)解決方案有兩個(gè)缺點(diǎn)。
1、圖片在導(dǎo)入時(shí)需要開(kāi)啟Readable/Write Enable屬性,使運(yùn)行時(shí)圖片大小變大, 增大內(nèi)存開(kāi)銷(xiāo)。
2、如果不規(guī)則區(qū)域外的alpha值不低于設(shè)置值的透明值則不能使用,比如圖片的alpha值都是1。
方法二:
繼承Image,重寫(xiě)IsRaycastLocationValid方法,利用PolygonCollider2D自定義按鈕的點(diǎn)擊區(qū)域。
using UnityEngine;
using UnityEngine.UI;
public class PolygonImage : Image
{
private Collider2D _collider2D = null;
private Collider2D UICollider2D
{
get
{
if (_collider2D == null)
_collider2D = GetComponent<Collider2D>();
return _collider2D;
}
}
#region 優(yōu)化 (透明的Image 也會(huì)持續(xù)的早成繪制的開(kāi)銷(xiāo)。)
protected PolygonImage()
{
useLegacyMeshGeneration = true;
raycastTarget = false;//默認(rèn)關(guān)閉射線(xiàn)檢測(cè)
}
protected override void OnPopulateMesh(VertexHelper vh)
{
vh.Clear();
}
#endregion
public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
if (UICollider2D != null)
{
return UICollider2D.OverlapPoint(eventCamera.ScreenToWorldPoint(screenPoint));
}
else
{
return base.IsRaycastLocationValid(screenPoint, eventCamera);
}
}
}

image.gif