ugui 基于圖片透明度的點(diǎn)擊過濾器

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

using System.IO;

 

[DisallowMultipleComponent]

[RequireComponent(typeof(Image))]

[ExecuteInEditMode]

public class ImageRaycastFilter : MonoBehaviour, ICanvasRaycastFilter

{

    public bool reversed;

 

    private Image image;

 

    void OnEnable()

    {

        image = GetComponent<Image>();

        image.type = Image.Type.Simple;

    }

 

    public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)

    {

        if (!enabled)

            return true;

 

        Sprite sprite = image.overrideSprite;

        if (sprite == null)

            return true;

 

        Vector2 local;

        RectTransformUtility.ScreenPointToLocalPointInRectangle(image.rectTransform, screenPoint, eventCamera, out local);

 

        Rect rect = image.rectTransform.rect;

 

        // Convert to have lower left corner as reference point.

        local.x += image.rectTransform.pivot.x * rect.width;

        local.y += image.rectTransform.pivot.y * rect.height;

 

        float u = local.x / rect.width;

        float v = local.y / rect.height;

 

        try

        {

            if(!reversed)

                return sprite.texture.GetPixelBilinear(u, v).a != 0;

            else

                return sprite.texture.GetPixelBilinear(u, v).a == 0;

        }

        catch (UnityException e)

        {

            Debug.LogException(e);

            return true;

        }

    }

}
Paste_Image.png

對(duì)圖片進(jìn)行任意變形都支持。只有非透明區(qū)域是可以點(diǎn)擊的。也可以反過來用,對(duì)透明區(qū)域可以點(diǎn)擊,比如用來做點(diǎn)擊遮罩。

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

using System.IO;

 

[DisallowMultipleComponent]

[RequireComponent(typeof(RawImage))]

public class RawImageRaycastFilter : MonoBehaviour, ICanvasRaycastFilter

{

    public bool reversed;

 

    private RawImage rawImage;

 

    void OnEnable()

    {

        rawImage = GetComponent<RawImage>();

    }

 

    public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)

    {

        if (!enabled)

            return true;

 

        Texture2D texture = rawImage.texture as Texture2D;

        if (texture == null)

            return true;

 

        Vector2 local;

        RectTransformUtility.ScreenPointToLocalPointInRectangle(rawImage.rectTransform, screenPoint, eventCamera, out local);

 

        Rect rect = rawImage.rectTransform.rect;

 

        // Convert to have lower left corner as reference point.

        local.x += rawImage.rectTransform.pivot.x * rect.width;

        local.y += rawImage.rectTransform.pivot.y * rect.height;

 

        Rect uvRect = rawImage.uvRect;

        float u = local.x / rect.width * uvRect.width + uvRect.x;

        float v = local.y / rect.height * uvRect.height + uvRect.y;

 

        try

        {

            if (!reversed)

                return texture.GetPixelBilinear(u, v).a != 0;

            else

                return texture.GetPixelBilinear(u, v).a == 0;

        }

        catch (UnityException e)

        {

            Debug.LogException(e);

            return true;

        }

    }

} 
![3.png](http://upload-images.jianshu.io/upload_images/1239281-0de722714aa6d388.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后編輯于
?著作權(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)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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