UGUI中的Button都是矩形的,但是在項目中轻猖,也會遇到不規(guī)則圖形的按鈕(比如做地圖)帆吻,如果給你一張不規(guī)則的圖形,按普通的矩形按鈕做咙边,圖形以外的區(qū)域也會添加上點擊事件猜煮,怎么給不規(guī)則的按鈕添加點擊事件呢,這里介紹兩種方法:
方法一:
修改不規(guī)則按鈕的Image組件中的的alphaHitTestMinimumThreshold屬性败许。
public class Test : MonoBehaviour {
public Image image;
public float test = 0.5f;
// Use this for initialization
void Start () {
image.alphaHitTestMinimumThreshold = test;
}
}
再修改圖片的Read/Write Enabled屬性為true王带,這樣的話,只有alpha大于設置的值時市殷,才會響應點擊事件愕撰。
這個解決方案有兩個缺點。
1、圖片在導入時需要開啟Readable/Write Enable屬性搞挣,使運行時圖片大小變大带迟, 增大內存開銷。
2囱桨、如果不規(guī)則區(qū)域外的alpha值不低于設置值的透明值則不能使用仓犬,比如圖片的alpha值都是1。
方法二:
繼承Image蝇摸,重寫IsRaycastLocationValid方法婶肩,利用PolygonCollider2D自定義按鈕的點擊區(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 也會持續(xù)的早成繪制的開銷貌夕。)
protected PolygonImage()
{
useLegacyMeshGeneration = true;
raycastTarget = false;//默認關閉射線檢測
}
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);
}
}
}