UGUI使用小技巧(四)給不規(guī)則按鈕添加點(diǎn)擊事件

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容