前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【100个 Unity实用技能】 | Unity不规则图片按钮的事件屏蔽

【100个 Unity实用技能】 | Unity不规则图片按钮的事件屏蔽

作者头像
呆呆敲代码的小Y
发布2024-03-19 09:07:53
1330
发布2024-03-19 09:07:53
举报

Unity 实用技能学习

Unity不规则图片按钮的事件屏蔽

前面写过一篇文章介绍了怎样过滤UI中透明区域的点击事件: 【100个 Unity实用技能】☀️ | Unity中 过滤透明区域的点击事件

里面提到了两种方法,都是通过像素检测来实现的,方法简单好用。但是有个条件是需要打开图片的Read/Write Enabled,这会导致一张图片占用了两份内存。 一般这种透明区域的出现的不多情况下,使用起来也没什么太大的问题,但如果使用了很多这种图片,且都想实现过滤的效果,那可能造成比较多的消耗内存,所以就要考虑下别的方案。

下面介绍一种使用 PolygonCollider2D 多边形碰撞组件 来实现不规则图片的事件屏蔽方法,也是简单易用,下面一起看下:

具体事例:

代码语言:javascript
复制
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(PolygonCollider2D))]
public class PolygonImageClick : MonoBehaviour, ICanvasRaycastFilter
{
    /// <summary>
    /// 2D多边形碰撞器
    /// </summary>
    protected PolygonCollider2D m_polygonCollider2D;
    protected Image _image;

    void Start()
    {
        _image = GetComponent<Image>();
        m_polygonCollider2D = GetComponent<PolygonCollider2D>();
    }

    public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
    {
        Vector3 worldPos;
        //将屏幕上的点转换为世界坐标中的点,考虑到了矩形(RectTransform)的本地坐标系
        RectTransformUtility.ScreenPointToWorldPointInRectangle(_image.rectTransform, screenPoint, eventCamera, out worldPos);
        return m_polygonCollider2D.OverlapPoint(worldPos);
    }
}

通过继承一个ICanvasRaycastFilter接口,实现 IsRaycastLocationValid() 方法,在方法中判断某点是否在多边形碰撞器区域内即可实现不规则区域的点击。

将上述代码挂载到有Image的组件上,然后调整多边形不规则形状用来适配我们的不规则图片。

调整好多边形后运行游戏,即可实现只在多边形区域内可以实现点击事件,其他区域就被过滤掉了。

效果如下:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Unity 实用技能学习
    • Unity不规则图片按钮的事件屏蔽
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档