Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理

news2024/12/22 17:01:03

请添加图片描述

  • Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理
    • 一、Unity中 屏蔽透明区域的点击事件
      • 1.1 使用Image组件自带的参数检测
      • 1.2 根据点击的坐标计算该点的像素值是否满足阈值
    • 二、Unity中屏蔽 不规则图片按钮点击的事件
  • 总结

在这里插入图片描述

  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------

请添加图片描述请添加图片描述请添加图片描述

请添加图片描述


Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理

在Unity中 屏蔽UI点击事件的方法有很多种,本文来介绍几种比较实用的方法,一起来看下吧。

一些基础的方法这里简单提一下,例如将Button组件的 Interactable 属性设置为false,可以直接禁用按钮的交互功能。这种方法简单直接,适用于临时禁用或条件性禁用UI元素的情况。

还有通过修改UI元素的isEnabled属性或监听并处理onClick事件,我们可以在运行时根据游戏逻辑或用户行为来决定是否屏蔽点击事件。这种方法适用于需要复杂逻辑控制或动态响应的场景。

Unity中我们有时候会遇到一些带有透明度或者形状千奇百怪的图片按钮,有些时候可能并不希望点击按钮的透明区域时也触发点击事件,这个时候就要进行额外处理,下面整理了几种方法可以进行参考使用!


一、Unity中 屏蔽透明区域的点击事件

在这里插入图片描述

像素检测 过滤透明区域

这种方法是通过读取Sprite在某一点的像素值(RGBA),如果该点的像素值中的Alpha小于一定的阈值(比如0.5)则表示该点是透明的,即用户点击的位置在精灵边界以外,否则用户点击的位置在精灵边界内部。

这种做法就是通过判断点击的某一点是否达到我们期望的像素Alpha阈值,达到阈值就响应事件,未达到阈值就说明点击了透明区域,此时不响应事件。

UGUI在处理控件是否被点击的时候,主要是根据IsRaycastLocationValid这个方法的返回值来进行判断的,而这个方法用到的基本原理则是判断指定点对应像素的RGBA数值中的Alpha是否大于某个指定临界值。

1.1 使用Image组件自带的参数检测

而UGUI中可以通过Image组件拿到一个alphaHitTestMinimumThreshold ,这个值代表的含义就是期望的像素Alpha阈值,通过改变这个值就可以实现过滤透明区域的点击事件。

this.GetComponent<Image>().alphaHitTestMinimumThreshold = 0.1f;

所以使用方法很简单,拿到指定按钮上的Image组件,改变这个Image的alphaHitTestMinimumThreshold即可实现过滤透明区域的所有点击事件,下面看下实际使用方法及效果。

通过控制alpahThreshold的值可以实现透明过滤的强度,也就是透明度过滤的阈值。比如alpahThreshold 为0则代表只过滤全透明的区域,alpahThreshold 为0.5则是把半透明一下的过滤掉,alpahThreshold 为1的话那就整张图都被过滤了,都不会响应事件。

准备两个带有透明度的切图,然后放置到场景的Button组件上,测试代码如下:

using UnityEngine;
using UnityEngine.UI;

public class UnityImageAlphaTest : MonoBehaviour
{
    public Button btnImage1;
    public Button btnImage2;

    [Header("透明度过滤阈值")]
    public float alpahThreshold = 0.5f;

    void Start()
    {
        btnImage1.onClick.AddListener(OnClickImage);
        btnImage2.onClick.AddListener(OnClickImage);

        btnImage2.GetComponent<Image>().alphaHitTestMinimumThreshold = alpahThreshold;
    }

    private void OnClickImage()
    {
        Debug.Log("点击图片测试!");
    }
}

值得注意的是还需要把过滤透明区域的图片设置为可读写状态(Read/Write Enable 设置为true),如下图所示,否则这种方法不会生效且会报错。
在这里插入图片描述

将两个Button挂载到脚本中,第一个Button不参与透明过滤,第二个Button过滤透明区域点击事件。
在这里插入图片描述

此时运行Unity就可以看到效果了,效果如下:
请添加图片描述

1.2 根据点击的坐标计算该点的像素值是否满足阈值

与上述直接使用Image组件的方法有所区别,这种方法是通过计算我们点击的坐标点的像素值是否达到阈值来判断需要过滤。

但原理是相同的,都是通过像素检测去判断是否选择过滤,下面看下实现代码:

using UnityEngine;
using UnityEngine.UI;
public class Model_ButtonSetting : MonoBehaviour, ICanvasRaycastFilter
{
    [Header("透明度过滤阈值")]
    public float alpahThreshold = 0.1f;

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

    public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
    {
        //将选中的点转换为Image区域内的本地点
        Vector2 localPoint;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(_image.rectTransform, sp, eventCamera, out localPoint);

        Vector2 pivot = _image.rectTransform.pivot;
        Vector2 normalizedLocal = new Vector2(pivot.x + localPoint.x / _image.rectTransform.rect.width, pivot.y + localPoint.y / _image.rectTransform.rect.height);
        Vector2 uv = new Vector2(
            _image.sprite.rect.x + normalizedLocal.x * _image.sprite.rect.width,
            _image.sprite.rect.y + normalizedLocal.y * _image.sprite.rect.height);

        uv.x /= _image.sprite.texture.width;
        uv.y /= _image.sprite.texture.height;


        //获取指定纹理坐标(u, v)处的像素颜色。它返回一个Color结构,其中包含红、绿、蓝和alpha通道的值。
        //Color c = _image.sprite.texture.GetPixel((int)uv.x, (int)uv.y);
        //用于在纹理上执行双线性插值以获取像素颜色值,这个方法使用双线性插值算法来估算纹理中某个位置的颜色,而不是直接从纹理的像素中读取颜色。
        Color c = _image.sprite.texture.GetPixelBilinear(uv.x, uv.y);

        return c.a > alpahThreshold;
    }
}

这种方法也需要把过滤透明区域的图片设置为可读写状态(Read/Write Enable 设置为true),否则这种方法也不会生效且会报错。

将上述脚本挂载到需要屏蔽透明区域的按钮上即可生效,简单易用。


二、Unity中屏蔽 不规则图片按钮点击的事件

除了上述方法通过检测图片的透明区域来屏蔽点击事件之外,还可以使用 PolygonCollider2D 多边形碰撞组件 来实现不规则图片的事件屏蔽方法,也是简单易用,下面一起看下:

具体事例:

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的组件上,然后调整多边形不规则形状用来适配我们的不规则图片。
在这里插入图片描述

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

效果如下:
请添加图片描述

这种方法不止可以过滤掉透明区域,还可以让我们随意指定范围,并且不需要将图片设置为可读写状态(Read/Write Enable 开启后加载时会多一份内存消耗),内存也不会白白多浪费,比起前面几种方法有更高的扩展性。


总结

  • 在Unity游戏开发过程中,UI(用户界面)的设计和管理是至关重要的一环。有时,开发者可能希望屏蔽或禁用某些UI元素的点击事件,以避免不必要的交互或错误操作。

  • Unity中屏蔽指定UI点击事件的方法多种多样,从简单的属性设置到复杂的脚本编程和高级技术应用,每种方法都有其适用的场景和优缺点。开发者可以根据具体需求选择合适的方法来实现UI点击事件的屏蔽,从而提升游戏的用户体验和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1500157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LInux-多线程基础概念

文章目录 前言预备页表详解缺页中断页表的映射 一、多线程是什么&#xff1f;轻量级进程 二、Pthread库pthread_create 前言 从本章的多线程开始&#xff0c;我们开始进入Linux系统的尾声&#xff0c;所以&#xff0c;在学习多线程的过程中&#xff0c;我们也会逐步对之前的内…

Spring基础——Spring配置Mybatis连接数据库

目录 Spring配置MyBatis流程1. 添加Mybatis依赖2. 配置MySQL数据库连接池2.1 首先创建jdbc配置文件2.2 配置数据库DataSource 3. 配置MyBatis3.1 配置SqlSessionFactoryBean3.2 配置mybatis Mapper Bean 4. 创建MyBatis Mapper接口6. 测试数据输出 数据库类型&#xff1a;MySQL…

centos7虚拟机启动并配置java环境(vmware启动+安装jdk+安装maven)

VMware下载 推荐很详细的一个教程Centos7.7安装及配置教程 - 掘金 VMware下载链接&#xff1a;https://pan.baidu.com/s/1jnUBawBPOtAD0gicZj-qTA?pwdm959 提取码&#xff1a;m959 centos7镜像&#xff08;文件较大&#xff0c;建议使用迅雷&#xff0c;更好支持暂停后继续下…

(MATLAB)应用实例13-时域信号的频谱分析

采用傅里叶变换来计算存在噪声的适于信号频谱。 假设数据采样频率为1000Hz&#xff0c;一个信号包含两个正弦波&#xff0c;频率50Hz、120Hz&#xff0c;振幅0.7、1&#xff0c;噪声为零平均值的随机噪声&#xff0c;采用FFT方法分析其频谱。 clearFs 1000; …

【C++】设计模式:观察者、策略、模板

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍设计模式&#xff1a;观察者、策略、模板。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xf…

最长上升子序列c++

题目 输入样例&#xff1a; 7 3 1 2 1 8 5 6输出样例&#xff1a; 4 思路 题目求最大长度&#xff0c;考虑使用DP来做。我们从状态表示和状态计算两方面进行分析。 假设用a数组来存序列&#xff0c;f数组来存以f[i]结尾的最长上升子序列。 1. 状态表示&#xff1a; 这一步…

找不到msvcr100.dll怎么办,五种有效解决msvcr100.dll丢失的方法

由于系统中关键文件msvcr100.dll的缺失&#xff0c;用户可能会遭遇一系列始料未及的困扰与问题。msvcr100.dll是Microsoft Visual C运行库中的一个核心动态链接库文件&#xff0c;对于许多应用程序的正常运行至关重要。当这个特定的dll文件丢失时&#xff0c;可能会导致部分软件…

电脑如何快速生成图片二维码?在线图片生码的制作步骤

多张图片在电脑上如何生成二维码之后预览呢&#xff1f;现在很多场景下都会发现扫码会展现很多的图片&#xff0c;通过手机来获取图片内容&#xff0c;那么图片放入二维码中的制作方法是什么样的呢&#xff1f;下面就通过本篇文章来给大家介绍图片二维码在线制作的方法及步骤&a…

SpringBoot+Ajax+redis实现隐藏重要接口地址

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

测试常用的Linux命令

前言 直接操作硬件 将把操作硬件的代码封装成系统调用&#xff0c;供程序员使用 虚拟机软件 可以模拟的具有完整硬件系统的功能 可以在虚拟机上安装不同的操作系统 Linux内核只有一个&#xff0c;发行版有很多种 内核来运行程序和管理像磁盘和打印机等硬件设备的核心程序 终端…

JumpServer 简介安装

目录 1、概念介绍 JumpServer 概述 JumpServer 功能 JumpServer 组件 JumpServer 架构 2、前置安装 环境要求 安装 ELRepo 库 更新内核 设置 grub2 安装 Python 配置 Python 虚拟环境 3、安装 Jumpserver Core 组件 下载安装 替换客户端组件 安装 Python 依赖库…

基于树莓派4B的智能家居系统设计

目录 一、项目介绍 二、前期准备 1.硬件准备 2.开发环境 三、C语言的简单工厂模式 1.工厂模式介绍 2.类和对象 3.工厂模式的优缺点 四、树莓派的基本使用 1.树莓派刷机和登入 2.树莓派WiringPi库介绍 3.树莓派 CSI 摄像头配置 4.树莓派与其他模块接线 五、智能家居…

【Java】生成条形码工具类

报销单需要根据单号生成条形码 先看效果图 直接上代码&#xff0c;复制即可使用 /*** Description:生成条形码*/ public class BarCodeUtils {/*** 默认图片宽度*/private static final int DEFAULT_PICTURE_WIDTH 300;/*** 默认图片高度*/private static final int DEFAULT_…

【C++杂货铺】详解string

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 为什么学习string &#x1f4c1; 认识string&#xff08;了解&#xff09; &#x1f4c1; string的常用接口 &#x1f4c2; 构造函数 &#x1f4c2; string类对象的容量操作 &#x1f4c2; string类对象的访问以及遍历操…

智慧油气场站:油气行业实现数字化转型的关键一步

智慧油气场站&#xff1a;油气行业实现数字化转型的关键一步 在现代社会&#xff0c;能源供应是国家经济发展和人民生活的重要保障。而油气场站作为能源的重要供应和储存基地&#xff0c;扮演着至关重要的角色。此外&#xff0c;油气场站还可以为石油和天然气的生产提供支持。…

前端手册-实现挂坠灯笼效果

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

网红老阳推荐的蓝海项目,视频号带货怎么样?有优势吗?

老阳是一位在互联网创业领域颇具影响力的任务&#xff0c;他经常会在自己的社交媒体平台上分享一些他认为有潜力的蓝海项目和创业机会。近期&#xff0c;老阳推荐了一个备受关注的蓝海项目——视频号带货。那么&#xff0c;这个项目究竟怎么样呢?我们来分析一下。 首先&#x…

TypeScript 基础(一)

目录 一、概述 二、开发环境 三、数据类型 1.boolean 2.number 3.string 4.Array 5.type 6.tuple 7.enum 8.any 9.null / undefined 10.never 11.object 结束 一、概述 TypeScript 是一种由微软开发的开源编程语言。它是 JavaScript 的一个超集&#xff0c;这意…

【排序算法】推排序算法解析:从原理到实现

目录 1. 引言 2. 推排序算法原理 3. 推排序的时间复杂度分析 4. 推排序的应用场景 5. 推排序的优缺点分析 5.1 优点&#xff1a; 5.2 缺点&#xff1a; 6. Java、JavaScript 和 Python 实现推排序算法 6.1 Java 实现&#xff1a; 6.2 JavaScript 实现&#xff1a; 6.…

使用langchain搭建本地知识库系统(新)

使用langchain搭建自己的本地知识库系统&#xff08;新&#xff09; 前些时候字节上了自己的扣子&#xff0c;用来构建我们自己的 agent [AI 实战&#xff1a;手把手教你使用「扣子/coze」来搭建个人blog知识库 受到启发&#xff0c;想在本地或者自己的服务器上面搭建一个知识…