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

Unity UI 中最干净的点击区域实现:RaycastZone 完整实战讲解

RaycastZone可以解决什么问题

在移动 UI 或自定义输入中,常常需要一个看不见但能响应点击的区域。例如:

虚拟摇杆
全屏点击遮罩
引导指引层的“非透明点击区域”
很多开发者习惯用 Image 组件设置透明来处理,但这样仍然会:

  1. 产生 draw call
  2. 增加 fillrate 开销
  3. 导致 GPU 负担

于是,就有了这类经典实现:继承 MaskableGraphic,但不绘制图像。

RaycastZone 原理

MaskableGraphic 本身具有射线检测(RaycastTarget)能力
重写 OnPopulateMesh 清空顶点数据,不渲染图像
保留 raycastTarget,可以照常接收点击事件

真机无逻辑开销的优化
我们通过 #if UNITY_EDITOR 宏包装调试部分:

编辑器中可开启红色调试绘制
构建到 iOS/Android/WebGL 后调试逻辑完全剔除,连 if 判断都没有

性能对比

方法是否渲染可点击真机性能
Image + Alpha 0有渲染有额外 fillrate
RaycastZone✅ 不渲染✅ 零开销,最推荐

源码

using UnityEngine;
using UnityEngine.UI;#if UNITY_EDITOR
using UnityEditor;
#endif[AddComponentMenu("UI/Raycast Zone")]
public class RaycastZone : MaskableGraphic
{#if UNITY_EDITOR[SerializeField] private bool m_EnableDebugDraw = false;[SerializeField] private Color m_DebugColor = new Color(1f, 0f, 0f, 0.2f);
#endifprotected override void OnPopulateMesh(VertexHelper vh){vh.Clear();#if UNITY_EDITORif (!m_EnableDebugDraw)return;var rect = GetPixelAdjustedRect();UIVertex vertex = UIVertex.simpleVert;vertex.color = m_DebugColor;vertex.position = new Vector2(rect.xMin, rect.yMin);vh.AddVert(vertex);vertex.position = new Vector2(rect.xMin, rect.yMax);vh.AddVert(vertex);vertex.position = new Vector2(rect.xMax, rect.yMax);vh.AddVert(vertex);vertex.position = new Vector2(rect.xMax, rect.yMin);vh.AddVert(vertex);vh.AddTriangle(0, 1, 2);vh.AddTriangle(2, 3, 0);
#endif}protected override void OnPopulateMesh(Mesh mesh){mesh.Clear();}#if UNITY_EDITORprotected override void OnValidate(){base.OnValidate();SetAllDirty();}public void SetDebugVisible(bool visible){m_EnableDebugDraw = visible;SetAllDirty();}public void SetDebugColor(Color color){m_DebugColor = color;SetAllDirty();}
#endif
}

使用建议
添加 UI 空物体,附加 RaycastZone.cs
设置尺寸/锚点,作为你想监听的点击区域
不要添加 Sprite/Image
如需调试:勾选 Enable Debug Draw,可设置颜色透明度


文章转载自:

http://xadRD4jk.tnhmp.cn
http://XTBFlyTG.tnhmp.cn
http://GEKqGdtV.tnhmp.cn
http://TLT0mfa9.tnhmp.cn
http://rtAAkNh3.tnhmp.cn
http://R8DuCcVk.tnhmp.cn
http://8fpLrs3F.tnhmp.cn
http://KcvcJ4sP.tnhmp.cn
http://v99BSBVi.tnhmp.cn
http://tajf5bxD.tnhmp.cn
http://dWMjda1I.tnhmp.cn
http://YJpNPb8T.tnhmp.cn
http://fRJyMbsT.tnhmp.cn
http://Vy3NyOkC.tnhmp.cn
http://Bxph6Pw6.tnhmp.cn
http://qhhYK7vR.tnhmp.cn
http://gUpQ6ruF.tnhmp.cn
http://nw0oaf3E.tnhmp.cn
http://OFRsk9o8.tnhmp.cn
http://ISpSUdIA.tnhmp.cn
http://q4qgxk5v.tnhmp.cn
http://td17Ptwe.tnhmp.cn
http://afPROJlb.tnhmp.cn
http://9kmPwha6.tnhmp.cn
http://lQaXXzWw.tnhmp.cn
http://FAGuEG6q.tnhmp.cn
http://pYnVUD0Q.tnhmp.cn
http://RRmk9Gl8.tnhmp.cn
http://OirIqL57.tnhmp.cn
http://Ee5GtOwk.tnhmp.cn
http://www.dtcms.com/a/371717.html

相关文章:

  • Java开发环境配置入门指南
  • lua中table键类型及lua中table的初始化有几种方式
  • 【CMake】缓存变量
  • Flink NetworkBufferPool核心原理解析
  • python数据可视化之Matplotlib(8)-Matplotlib样式系统深度解析:从入门到企业级应用
  • Recharts:React图表库,组件化设计助力高效数据可视化开发
  • Linux知识清单
  • SpringMVC 入门详解: MVC 思想(附核心流程)
  • CMake简易使用教程
  • daily notes[13]
  • Solana 核心概念:计算单元与交易成本解析
  • 【系统分析师】第11章-关键技术:软件需求工程(核心总结)
  • 如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比
  • 做好LoRaWAN的传感器都需要实现哪些功能点?
  • React入门 | React 新手入门与常用库和工具
  • jvm问题排查
  • C/C++数据结构之栈基础
  • 【Qt】项目的创建和各个控件的使用
  • Python高级技巧(七):装饰器
  • C#有人IO模块USR-IO808的完整指南
  • Apache Dubbo学习笔记-使用Dubbo发布、调用服务
  • CTFshow系列——PHP特性Web97-
  • Photoshop - Photoshop 创建图层蒙版
  • DevOps实战(3) - 使用Arbess+GitLab+Hadess实现Java项目自动化部署
  • Python从入门到精通_00_初识python
  • LabVIEW 与 PLC 通讯
  • 项目介绍:图像分类项目的最小可用骨架--代码细节讲解
  • 【.Net技术栈梳理】01-核心框架与运行时(CLR与GC)
  • 简述ajax、node.js、webpack、git
  • Java安全体系深度研究:技术演进与攻防实践