当前位置: 首页 > news >正文

UGUI不规则形状按钮(基于图标不透明区域)

这是某公司的面试题,原题是判断鼠标点击到了一个字母O的环上。当然也可以扩展到任意字母,任意图案。出题之所以使用字母O可能是为了诱导人使用2D碰撞体做,但真实想要的是用UGUI的一些API。

ICanvasRaycastFilter接口和IsRaycastLocationValid

继承Image,Image继承了ICanvasRaycastFilter接口,它有一个bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)方法,根据输入的屏幕坐标返回是否射线有效。

重写这个方法,从输入的屏幕坐标>相对自身RectTransform的坐标>归一化的局部坐标(实际上已经是uv坐标了)>sprite空间坐标>采样像素>比较像素alpha和阈值>返回。

using UnityEngine; using UnityEngine.UI; public class CustomShapeButton : Image { [SerializeField] const float alphaThreshold=.1f; public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) { // 1. 先走Image默认检测(矩形、可交互等) if (!base.IsRaycastLocationValid(screenPoint, eventCamera)) return false; // 2. 无Sprite/无纹理,直接不响应 if (sprite == null || sprite.texture == null) return false; Texture2D tex = sprite.texture; RectTransform rt = rectTransform; // 3. 屏幕点 → 本地坐标 → UV坐标 RectTransformUtility.ScreenPointToLocalPointInRectangle( rt, screenPoint, eventCamera, out Vector2 localPoint); Vector2 normalized = Rect.PointToNormalized(rt.rect, localPoint); // 4. UV → 像素坐标(考虑Sprite的边框/裁剪) Rect spriteRect = sprite.rect; int px = Mathf.RoundToInt(normalized.x * spriteRect.width + spriteRect.x); int py = Mathf.RoundToInt(normalized.y * spriteRect.height + spriteRect.y); // 5. 边界保护 px = Mathf.Clamp(px, 0, tex.width - 1); py = Mathf.Clamp(py, 0, tex.height - 1); // 6. 读取Alpha并判断 Color pixel = tex.GetPixel(px, py); bool ok=pixel.a >= alphaThreshold; return ok; } }

image.alphaHitTestMinimumThreshold

把图标启用Read/Write。

image.alphaHitTestMinimumThreshold改大一点。

http://www.jsqmd.com/news/496816/

相关文章:

  • Docker上部署前后端分离项目
  • 2026北京婚纱摄影机构对比:如何选到靠谱好店 - 博客万
  • 外贸企业为什么“有产品却没有客户”?问题可能出在获客方式 - 资讯焦点
  • C# WinForms机房管理系统源码|支持SQL Server/MySQL/Access多数据库|.NET Framework窗体应用
  • 机试搜索----dfs
  • OpenClaw企业级AI安全防护实战:七层策略+沙箱隔离+细粒度权限,彻底根治AI越权乱操作
  • C语言:字符函数和字符串函数—及模拟实现
  • 广柔扁平电缆在机器人AI技术创新应用中的前景探索 - 资讯焦点
  • PyQt:从图像文件或字节流生成QImage的速度测试
  • JMeter实战2--阶梯线程组及计算逻辑
  • 链接脚本优化(lsl或ld),Map文件解析,内存分析软件MapSee免费下载
  • ROS2的核心概念A-节点
  • Windows如何阻止应用程序联网
  • 灵芝孢子粉哪个牌子好?从破壁率、成分、口碑分析.
  • 计算机毕业设计源码:Python基于大数据的租房价格分析平台 Django框架 Requests爬虫 可视化 房子 房源 大数据 大模型(建议收藏)✅
  • VMware安装教程带资料完整版
  • 【愚公系列】《剪映+DeepSeek+即梦:短视频制作》009-剪辑:把碎片素材串联成片(画面调整)
  • 2026年地方招投标新规密集出台:火眼审阅标书查重,精准响应政策要求的合规利器 - 资讯焦点
  • 红外热像仪优质厂家推荐:工业巡检机器人、手持红外热像仪、热成像相机、热成像红外夜视仪、电力巡视、管道巡检机器人选择指南 - 优质品牌商家
  • NMN哪个产品最好?2026选哪个NMN牌子性价最高?高活NMN推荐理由:转化NAD+吸收率高 - 资讯焦点
  • vue基于springboot高校教材管理网站_47nia
  • 2026云南钢材一站式供应权威之选:五大综合服务商全链赋能,省心之选 - 深度智识库
  • 2026UHPC构件板厂家推荐:UHPC外墙挂板/UHPC装饰板/UHPC挂板定制/UHPC挂板厂家精选 - 品牌推荐官
  • 2026不锈钢方型水箱专业品牌推荐指南 - 优质品牌商家
  • Windows上使用scp安装OpenSSH服务端 客户端
  • 二分查找(在排序数组查找元素)(2)
  • mysql事务以及MVCC相关原理
  • ubuntu工具之可视化录制的bag数据——PlotJuggler(ROS1版本下载安装)
  • 2026 年国内优质靠谱化工原料直销厂家实力盘点 - 深度智识库
  • 告别熬夜苦写论文:8款AI工具10分钟出万字,降重改稿全搞定 - 麟书学长