UnityUnity技术分享unity3D技术分享

UGUI 按像素过滤点击 ICanvasRaycastFilte

2016-11-23  本文已影响770人  2b75747cf703
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;
    }
}
using UnityEngine;
using UnityEngine.UI;

[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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读