ugui unity 取消选择_UGUI中几种不规则按钮的实现方式

前言

UGUI中的按钮默认是矩形的,若要实现非矩形按钮该怎么做呢?比如这样的按钮:

2794d76d4ef857b4f29f54df9bb8149e.png

本文将介绍两种实现方式供大家选择。

使用alphaHitTestMinimumThreshold

Image类的alphaHitTestMinimumThreshold是一个浮点值,Raycast检测时只有图片中高于该值的部分会抛出点击事件。因此我们可以使用一张alpha通道的值高于该设置值的Sprite用于自定义按钮的点击相应区域。

我们准备一张点击区域alpha高于某值,非点击区域alpha低于某值的Sprite用于Button的Image组件的Sprite。然后给这个Button挂上如下脚本组件即可:

using UnityEngine;
using UnityEngine.UI;public class AlphaButton : MonoBehaviour
{public float alphaThreshold = 0.1f;void Start() {GetComponent<Image>().alphaHitTestMinimumThreshold = alphaThreshold;}
}

但这种方法有几个问题:

  1. 由于是代码中需要读取图片的alpha值用于比较,因此图片在导入时需要开启Readable/Write Enable,这样会使运行时贴图大小翻倍,内存中会额外存储一份贴图数据,增大内存开销。
  2. 如果是点击区域内部需要有一些低于设置值的透明样式则无法满足。
  3. 点击区域的调整需要修改图片资源,十分不便。

如果可以接受这些缺点,可以使用这个方法。

使用IsRaycastLocationValid

通过继承Image并重写IsRaycastLocationValid方法可以自定义按钮的可点击区域。

将如下代码放置于项目中:

using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR using UnityEditor;#endif
[RequireComponent(typeof(PolygonCollider2D))]
public class NonRectangularButtonImage : Image
{private PolygonCollider2D areaPolygon;protected NonRectangularButtonImage() {useLegacyMeshGeneration = true;}private PolygonCollider2D Polygon{get{if (areaPolygon != null)return areaPolygon;areaPolygon = GetComponent<PolygonCollider2D>();return areaPolygon;}}protected override void OnPopulateMesh(VertexHelper vh) {vh.Clear();}public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) {return Polygon.OverlapPoint(eventCamera.ScreenToWorldPoint(screenPoint));}#if UNITY_EDITOR protected override void Reset() {base.Reset();transform.localPosition = Vector3.zero;var w = rectTransform.sizeDelta.x * 0.5f + 0.1f;var h = rectTransform.sizeDelta.y * 0.5f + 0.1f;Polygon.points = new[]{new Vector2(-w, -h),new Vector2(w, -h),new Vector2(w, h),new Vector2(-w, h)};}
#endif
}
#if UNITY_EDITOR
[CustomEditor(typeof(NonRectangularButtonImage), true)]
public class CustomRaycastFilterInspector : Editor
{public override void OnInspectorGUI() {}
}public class NonRectAngularButtonImageHelper
{[MenuItem("GameObject/UI/NonRectangularButtonImage")]public static void CreateNonRectAngularButtonImage() {var goRoot = Selection.activeGameObject;if (goRoot == null)return;var button = goRoot.GetComponent<Button>();if (button == null){Debug.Log("Selecting Object is not a button!");return;}// 关闭原来button的射线检测var graphics = goRoot.GetComponentsInChildren<Graphic>();foreach (var graphic in graphics){graphic.raycastTarget = false;}var polygon = new GameObject("NonRectangularButtonImage");polygon.AddComponent<PolygonCollider2D>();polygon.AddComponent<NonRectangularButtonImage>();polygon.transform.SetParent(goRoot.transform, false);polygon.transform.SetAsLastSibling();}
}#endif

这段代码大部分参考自雨松大神的这篇文章:

UGUI研究院之不规则按钮的响应区域(十四)

还额外写了一个自动添加组件和设置raycastTarget属性的菜单项。创建完一个普通的按钮后,右键执行命令:

c2a659bbb261609a02c4695c8993ad2f.png

这将自动创建一个名为“NonRectangularButtonImage”的子节点,并添加一个同名的脚本组件和一个PolygonCollider2D组件。编辑PolygonCollider2D组件即可设置按钮的点击区域,调整起来也十分方便,既简单又节省内存。

我的Github中这两种方式都有实现,供大家参考:

88458bbdecf71db7dac992a81b14a6cb.png

共三组按钮,点击后可以在Console窗口中看到响应Log。

第一组是没有任何处理的普通按钮,由于在Hierarchy中RightButton在下,点击Left的右下角还是右边按钮响应,用于对照。

第二组使用了设置alphaHitTestMinimumThreshold的方式。

第三组使用了重写IsRaycastLocationValid的方式,并故意调整了Button在Hierarchy中的顺序。

如果可以,也希望大家点个Star。

专栏文章继续更新,欢迎关注微信公众号:Unity与图形学

6b8b13babe05ef2c2f47c76440899de8.png

参考

使用alphaHitTestMinimumThreshold的方式

UGUI研究院之不规则按钮的响应区域(十四)

使用mask的方式

Image.alphaHitTestMinimumThreshold

ICanvasRaycastFilter.IsRaycastLocationValid

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

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

相关文章

你的专业 VS 你妈口中你的专业

亲妈认证★英语语言文学我妈&#xff1a;她就是一个学英语的~我同学&#xff1a;你学英语的啊&#xff1f;那你看美剧不用看字幕的吧&#xff1f;你听英文歌都听得懂的吧&#xff1f;这个怎么翻译啊&#xff1f;这上面写的什么&#xff1f;你不是专八吗&#xff1f;哈喽~ 在吗&…

反射 + 抽象工厂模式切换不同的实现方法

概述工厂模式&#xff08;Abstract Factory&#xff09;定义 &#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其…

3 年工作经验程序员应有的技能

前言因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结&#xff0c;因此有了这篇文章。这篇文章大部分内容都是面向整个程序员群体的&#xff0c;当然因为LZ本身是做Java开发的&#xff0c;因此有一部分内容也是专门面向咱们Java程序员的。第二阶段&#xff1a;五年五…

应急响应中的溯源方法

在发现有入侵者后&#xff0c;快速由守转攻&#xff0c;进行精准地溯源反制&#xff0c;收集攻击路径和攻击者身份信息&#xff0c;勾勒出完整的攻击者画像。 对内溯源与对内溯源 对内溯源&#xff1a;确认攻击者的行为 &#xff0c;分析日志 数据包等&#xff1b; 对外溯源&…

POP3口令扫描案例

通过本案例可以学到&#xff1a; (1)了解POP3有关知识(2)利用Hscan工具软件来破解POP3账号和口令现在很多邮箱服务器都支持POP3功能&#xff0c;通过POP3来收取信件&#xff0c;收取信件时仅仅需要提供用户名和密码。目前有很多工具可以扫描POP3邮件账号和口令&#xff0c;本案…

中connect怎么用_烘焙中的各种酒,到底该怎么用?

​在烘焙食谱中&#xff0c;经常会出现“酒”这样材料。烘焙中的酒&#xff0c;仿佛是个神秘的存在&#xff0c;品种也繁多得让人一脸懵逼&#xff0c;朗姆酒是干嘛用的&#xff1f;怎么还有分白朗姆和金朗姆&#xff1f;和利口酒有什么区别&#xff1f;利口酒和力娇酒是同一个…

QQ旋风爆缓冲区溢出漏洞

据金山毒霸安全实验室5月7日透露&#xff0c;金山毒霸安全实验室研究人员进行例行漏洞检查过程中&#xff0c;发现QQ旋风存在一鲜为人知的缓冲区溢出0day漏洞&#xff0c;***者可以利用该漏洞制造恶意URL&#xff0c;使用IE6&#xff0c;7内核的各种浏览器均会受此漏洞的影响。…

w10计算机无法打印,win10升级后惠普无法打印怎么解决_win10升级后惠普打印不了的处理办法...

使用电脑工作或学习时&#xff0c;我们经常会需要用到打印机。可是最近有一些网友却反映说&#xff0c;自己的win10电脑在升级后出现了惠普无法打印的情况&#xff0c;这是怎么一回事呢&#xff1f;我们又该怎么解决呢&#xff1f;用户不是很清楚&#xff0c;所以对此今天本文为…

女神节爆猛料!. NET程序员男女比例公布!

今天是三八女神节&#xff0c;这里先祝广大的程序员妹子们节日快乐&#xff0c;健康美丽&#xff01;有一个问题&#xff0c;相信很多.NET程序员都很感兴趣&#xff1a;.NET程序员中女生占比多少&#xff1f;先来公布答案&#xff1a;在本次调查中发现&#xff0c;.NET程序员群…

金蝶凭证序时簿在哪_来了!金蝶日常账务处理大全

上一期给宝宝们更新了金蝶软件建账的一些处理流程&#xff0c;宝宝们已经迫不及待要求后续了。在日常处理部分主要是以下几个方面一、凭证审核1.凭证录入点击主窗口中的【凭证】&#xff0c;单击【凭证】录入在凭证录入窗口中单击【凭证录入】按钮&#xff0c;在这个窗口中就可…

在C#中使用SQLite

SQLite 是一个嵌入式的关系数据库系统&#xff0c;使用十分广泛。在一些数据量不大的应用程序中&#xff0c;如果使用SQLite可以极大的减少部署时的工作量。 要在C#中使用SQLite也很简单&#xff0c;只要找一个C#的wrapper就可以了&#xff0c;例如&#xff0c;我使用的就是来自…

BI 界震动 - Power BI Premium 个人版只要每月 120 元

大事来了就在今天&#xff0c;微软宣布&#xff1a;Power BI Premium Per User 定价&#xff1a;每月 120 元人民币。我只能说&#xff1a;他没有骗人。Power BI 团队也在这个战略决策上符合了微软的核心使命。这一举措将更加彻底的巩固微软 Power BI 的商业智能帝国地位&#…

用 Python 实现一个大数据搜索引擎

搜索是大数据领域里常见的需求。Splunk和ELK分别是该领域在非开源和开源领域里的领导者。本文利用很少的Python代码实现了一个基本的数据搜索功能&#xff0c;试图让大家理解大数据搜索的基本原理。布隆过滤器 &#xff08;Bloom Filter&#xff09;第一步我们先要实现一个布隆…

iNeuOS工业互联操作系统,图表与数据点组合成新组件,进行项目复用

目 录1. 概述... 12. 演示信息... 23. 应用过程... 21. 概述针对有些行业的数据已经形成了标准化的建模或者有些公司专注于某个领域&#xff0c;对于开发业务有很多情况需求进行复用&#xff0c;以前的版本和文章介绍了图元及数据点的组合形成新的图元进…

通过对象属性去重_Redis常见对象类型的底层数据结构

作者&#xff1a;伍陆七来源&#xff1a;cnblogs.com/chentianming/p/13838347.htmlRedis 是一个基于内存中的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。Redis 支持五种常见对象类型&#xff1a;字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有…

按照演算,整个宇宙将会陷入无边的黑暗

导读&#xff1a;能量守恒定律告诉我们&#xff1a;能量既不会凭空产生&#xff0c;也不会凭空消失&#xff0c;它只会从一种形式转化为另一种形式&#xff0c;或者从一个物体转移到其它物体&#xff0c;而能量的总量保持不变。熵作为只增不减的物质&#xff0c;该怎么去理解它…

xp计算机启动检测硬盘,取消WinXP开机自检技巧五则

有时我们正常关闭计算机后&#xff0c;再次开机时发现系统会出现自行检测&#xff0c;这让许多XP用户们感到不方便&#xff0c;那么该怎么取消XP开机自检呢&#xff1f;下面就是具体的方法了&#xff0c;一起来看看吧。方法①&#xff1a;假如分区是FAT32格式&#xff0c;将其转…

10 邮件槽_员工主动发离职邮件,提出申请又反悔,法院判决让人懵了!

前言&#xff1a;很多职场人从来不把劳动法当作一项技能&#xff0c;一遇到事&#xff0c;瞬间就傻。还有部分职场人&#xff0c;什么事都不做&#xff0c;只会说劳动法没有用。就笔者认识的一部分大厂员工&#xff0c;他们现在已经把每天视频打卡跟录音取证作为一项日常工作来…

干货|机器学习零基础?不要怕,吴恩达机器学习课程笔记2-多元线性回归

吴恩达Coursera机器学习课系列笔记课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础1Linear Regression with Multiple Variables紧接上一篇的例子 – 房价预测。现在我们有更多的特征来预测房价了&#xff0c;“房间的数量”、“楼层”、“房龄”……说明一下接下来要…

技能高考本科计算机类,技能高考多少分上本科

技能高考总分为700分&#xff0c;包括专业技能满分490分&#xff0c;文化课满分210分。能上大学只要总分300往上都可以。如果是本科的话&#xff0c;每个专业的分数线不一样&#xff0c;少的在400分左右&#xff0c;多的比如会计类专业的话可能要到500以上才能报考本科院校。什…