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

这篇具有很好参考价值的文章主要介绍了Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶

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

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

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

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

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

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

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

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

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶


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

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

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

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

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


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

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,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),如下图所示,否则这种方法不会生效且会报错。
Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶

将两个Button挂载到脚本中,第一个Button不参与透明过滤,第二个Button过滤透明区域点击事件。
Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶

此时运行Unity就可以看到效果了,效果如下:
Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,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的组件上,然后调整多边形不规则形状用来适配我们的不规则图片。
Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶

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

效果如下:
Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理,# Unity 进阶技巧,unity,ui,游戏引擎,UGUI,屏蔽点击事件,Unity进阶

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


总结

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

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

到了这里,关于Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D】实现UI点击事件穿透

              注意:EventSystem.current.RaycastAll获取到的对象列表是能够接受事件的,假如你的按钮Button自己身上没有Image,而是Button的子物体有,那么你就要给这个子物体也加上标签Tag才能响应到。 如果ExecuteEvents.Execute不管用,可以试试ExecuteEvents.ExecuteHierarchy

    2024年02月04日
    浏览(55)
  • Unity功能测试3D物体和UI的点击事件

    我们在功能开发中 当UI和3D物体在一起的时候点击事件通常会有这么几种情况 1、UI和3D物体同时响应事件 这种情况很常见,如果是故意有次功能需求那将不需要改动.实现代码 3D物体上挂载 UI上挂载 这里面ExecuteAll这个方法也可以处理同理响应事件的问题(已注释) 2、UI和3D物体

    2024年02月05日
    浏览(63)
  • 在uniapp中实现长按事件(屏蔽点击事件)

    问题 在uniapp使用官方提供的长按点击事件时会触发点击事件 这样使用在元素上只绑定了长按事件时没有任何问题,但如果元素上同时绑定的单击事件就无法区分 解决 原理 点击事件在点击结束后才会触发。 长按事件在点击持续一定时间后就会触发 方案 我们可以定义一个记

    2024年02月16日
    浏览(40)
  • 【Unity】 基础交互入门(按钮点击事件的三种方法)

    1、在资源面板创建C#脚本 2、创建点击事件需要执行的代码(这里以loadMain为例),新增一个叫OnStartButtonClick的Public方法。 可以选择生成或者调试,从VS更新代码到Unity。 3、场景中创建Button和empty(生成空的GameObject) 4、将代码挂在刚刚的GameObject上(这里将GameObject重命名为

    2024年02月09日
    浏览(50)
  • js点击事件多种写法

    给html标签内添加 onclick属性 , 值 写 js中 定义的函数名 ,最终 实现 调用 

    2024年02月16日
    浏览(37)
  • Threejs进阶之十:让模型移动到鼠标点击的指定位置

    上一节中我们实现了物体沿指定轨迹移动的动画效果,这一节我们来实现让模型移动到鼠标点击的制定位置的动画效果。 先看下实现后的最终效果 要实现上面的动画效果,我们需要通过以下步骤来实现 我们需要监听鼠标的点击事件,获取鼠标点击点相对浏览器可视区域左上

    2024年02月09日
    浏览(56)
  • 鸿蒙HarmonyOS实战-ArkUI事件(键鼠事件)_ark ui 点击事件

    .onMouse((event: MouseEvent) = { event.stopPropagation(); // 在Button的onMouse事件中设置阻止冒泡 this.buttonText = ‘Button onMouse:n’ + ‘’ + \\\'button = ’ + event.button + ‘n’ + \\\'action = ’ + event.action + ‘n’ + ‘x,y = (’ + event.x + ‘,’ + event.y + ‘)’ + ‘n’ + ‘screenXY=(’ + event.screenX + ‘,’ + eve

    2024年04月16日
    浏览(49)
  • Unity实现文本点击事件

    写在前面的一些碎碎念: 好久没有来写文章了,主要是这一两年找了一份不错的工作,进入了舒适区,工作上的功能没有什么创新,都是以前做过的功能。这不,最近开发一款类似传奇的手游,需要实现聊天栏文字点击的效果,今天就来分享一下。 直接上代码,组件用的是

    2024年02月13日
    浏览(41)
  • unity 点击事件

    目录 点击按钮,显示图片功能教程 第1步添加ui button,添加ui RawImage 第2步 添加脚本: 第3步,把脚本拖拽到button,点击button,设置脚本的变量, GameObject添加 Component组件 第1步添加ui button,添加ui RawImage 第2步 添加脚本: 第3步,把脚本拖拽到button,点击button,设置脚本的变量

    2024年02月19日
    浏览(33)
  • Unity 2D点击事件、碰撞

    1.事件封装 定义脚本,实现事件相关接口即可 2.点击对象必须要添加BoxCollider2D脚本 3.摄像机上必须添加Physics2DRaycaster脚本 4.GameInputEvent2D 事件必须添加在挂载Physics2DRaycaster的对象及其父类身上。 5.如果要有碰撞或者触发器回调,碰撞其中之一要添加Rigidbody2D脚本,且不能设置

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包