【Unity-UGUI】UGUI知识汇总
目录
- 前言
- 1 UGUI系统原理
- 2 事件系统
- 2.1 EventSystem
- 2.2 InputModules
- 2.3 Raycasters
- 2.4 协作
- 3 UGUI系统的组件
- 3.1 Image和RawImage
- 3.2 Mask和RectMask2D
- 扩展
- UI穿透问题
前言
记录一些最近学到的有关UGUI的知识。
参考
知乎:6千字带你入门UGUI源码
书籍:《Unity3D高级编程》
1 UGUI系统原理
UGUI是3D网格下建立起来的UI系统,它的每个可显示的元素都是通过3D模型网格的形式建立起来的。当UI系统被实例化时,UGUI系统首先要做的就是构建网格。
也就是说,Unity在制作一个UI元素时,都会先构建一个方形网格,再将图片放入网格内。可以理解成构建了一个3D模型,用一个网格绑定一个材质球,材质球内存放要显示的图片。
但这里有个问题,就是如果每个元素都生成一个模型且绑定一个材质球存入一张图片,那么界面上成千上万的元素就会有成千上万的材质球和图片,显然是不可能的,因为如果这样的话,GPU需要对每个材质球和网格都进行渲染,GPU的负担会很重。
UGUI确实对这一部分进行了优化,它将一部分相同类型的图片合并成一张图,然后将拥有相同图片、相同着色器的材质球指向同一个材质球,并且把分散的模型网格合并起来。这样就生成几个大网格、几个不同图集的材质球和几张图集(合并这一步是由Canvas实现的)。
不过UGUI并不是把所有的网格和材质球合并成一个,它只是把相同层级的元素,以及相同层级上拥有相同材质球参数的进行合并。合并成一个网格,就相当于一个静止的模型,如果有任何元素被移动或者销毁,或者元素的参数被改变,就需要摧毁原来的网格,重新进行构建。这样的操作会消耗很多的CPU内存,因此我们要想方设法地合并更多元素,减少重构次数。这也是UGUI性能优化的一个方向之一。
UI重建(rebuild)
2 事件系统
UGUI的事件系统由以下三个子版块组成:
2.1 EventSystem
事件系统主要是基于输入(键盘、鼠标、触摸或自定义输入)向应用程序中的对象发送事件,当然这需要其他组件的配合。当你在GameObject中添加EventSystem时,你会发现它并没有太多的功能,这是因为EventSystem本身被设计成事件系统不同模块之间通信的管理者和推动者,它主要包含以下功能:
- 管理正在使用的输入模块
- 管理哪个游戏对象被选中
- 管理射线检测
管理输入模块(InputModule)
EventSystem负责管理所有的输入模块(InputModule),它在Update中调用TickModules更新每一个模块,并在满足条件时调用模块的Process方法。
管理选中的游戏对象
当场景中有了新的被选中的对象,会通知之前选中的对象执行OnDeselect事件,通知新的对象执行OnSelect事件。
管理射线检测
EventSystem中,还有一个非常重要的函数RaycastAll(),主要是获取目标。这个方法会首先获取所有的BaseRaycast对象,调用其Raycast方法,然后对最后得到的结果进行排序(大部分情况下按深度进行排序,也有一些情况下会使用距离、排序顺序(SortingOrder,如果是UI则根据Canvas面板的Sort order,3D物体默认是0或者根据Sorting Layer作为排序依据))。
PS:在看UGUI性能优化时,有一条是将无交互事件的UI的Raycast Target字段设为false,我怀疑可能就是为了减少这里的BaseRaycast对象。
2.2 InputModules
输入模块是配置和定制事件系统主逻辑的地方。 自带的输入模块有两个,一个是为独立输入(StandaloneInputModule),另一个是为触摸输入(TouchInputModule)。 StandaloneInputModule是PC、Mac&Linux上的具体实现,而TouchInputModule是IOS、Android等移动平台上的具体实现,每个模块都按照给定配置接收和分派事件。 运行EventSystem后,它会查看附加了哪些输入模块,并将事件传递给特定的模块。
而事件执行则通过ExecuteEvent类,这个类中定义了许多接口,比如鼠标按下、点击、拖拽等。
2.3 Raycasters
Raycasters负责确定目标对象。给定一个屏幕空间位置,它们将收集所有潜在目标,找出它们是否在给定位置下,然后返回离屏幕最近的对象。 系统提供了以下几种类型的Raycaster:
- Graphic Raycaster: 检测UI元素
- Physics Raycaster: 用于3D物理元素
- Physics 2D Raycaster: 用于2D物理元素
2.4 协作
EventSystem会在Update中调用输入模块的Process方法来处理输入消息。PointerInputModule的Process方法会调用EventSystem中的RaycastAll方法进行射线检测。RaycastAll又会调用所有BastRaycaster的Raycast方法执行具体的射线检测操作,用以获取屏幕某个点下的所有目标。
获取完点击目标后,又会回到PointerInputModule,对其触发那些事件接口(IPointerClickHandler之类的)并传入PointerEventData参数 => 使用冒泡排序通知,直到有能处理对应IEventSystemHandler的UI接收为止(比如Button上的Text无点击事件,那就父物体Button接收)。
举例:
当你点击了一个Button组件,首先你的行为会在EventSystem的Update中被输入模块的Process方法被抓取到,之后输入模块就会调用RaycastAll方法来得到所有屏幕下点击到的目标,最后通过冒泡的方式来找到第一个可以接收点击事件的UI目标。确定好UI目标后,对其执行点击事件。
3 UGUI系统的组件
3.1 Image和RawImage
Unity中的RawImage
RawImage从功能上可以看成是丐版的Image。
区别:
1.Image只能展示Sprite类型图片,RawImage则可以展示各种类型的图片(描述为Texture)。
2.Sprite 只能用在 Image 组件上,做2D and UI,Sprite可以理解为2D特意做的对Texture的封装。
2.Sprite可以做九宫格。
3.Sprite一般用在小图,可以打Atlas(图集)。
4.Texture基于纹理寻址模式,不能打包Atlas。
5. UI 需要修改UV rect和用到寻址模式的,用Texture,否则用Sprite。
6. 当图片尺寸很大导致合并图集效率太低,也可以用RawImage。
优势:
1.Image有Image的优势,Image可以九宫格拉伸。
2.RawImage有RawImage的优势,RawImage可以UV rect贴图的纹理寻址。
3.一般用Image,除了地图寻址,滚动之类的,从贴图哪个位置开始显示。
3.2 Mask和RectMask2D
它们是遮挡组件,可以将子节点下矩形区域外的内容剔除,这两个组件的区别主要是剔除方法不同。Mask使用顶点重构的方式剔除矩形区域外的部分,而RectMask2D组件则采用着色器的剔除方式。
扩展
UI穿透问题
问题描述:在Unity中,当UI元素和3D物体同时存在时,点击UI可能导致3D物体的点击事件也被触发。
查了一下资料似乎是使用OnMouseDown这个方法导致的,网上提到的解决方案是在摄像机上挂载Graphic Raycaster组件,然后使用OnPointerClick()方法替代OnMouseDown进行检测。
也有其他解决方案,不过也是围绕UI专用的射线检测Graphic Raycaster进行的:文章
相关文章:
【Unity-UGUI】UGUI知识汇总
目录 前言1 UGUI系统原理2 事件系统2.1 EventSystem2.2 InputModules2.3 Raycasters2.4 协作 3 UGUI系统的组件3.1 Image和RawImage3.2 Mask和RectMask2D 扩展UI穿透问题 前言 记录一些最近学到的有关UGUI的知识。 参考 知乎:6千字带你入门UGUI源码 书籍ÿ…...
JavaScript性能测试:策略、工具与实践
在Web开发中,性能测试是确保应用程序达到预期响应速度和处理能力的关键步骤。JavaScript作为构建交互式Web应用的核心语言,其性能直接影响用户体验。本文将详细介绍如何使用JavaScript进行性能测试,包括性能测试的基本概念、测试类型、工具、…...

嵌入式软件开发学习一:软件安装(保姆级教程)
资源下载: 江协科技提供: 资料下载 一、安装Keil5 MDK 1、双击.EXE文件,开始安装 2、 3、 4、此处尽量不要安装在C盘,安装路径选择纯英文,防止后续开发报错 5、 6、 7、弹出来的窗口全部关闭,进入下一步&a…...
SpringMVC学习中遇到的不懂注解记录
文章目录 Autowrite 和 ResourceQualifier 和 PrimaryPathVariableController、Service、Repository 和 Component Autowrite 和 Resource 我们先讲讲 Autowrite 注解 吧。 public class StudentService3 implements IStudentService {//Autowiredprivate IStudentDao studentD…...
Java面试题--分布式锁
分布式锁 你说一下什么是分布式锁 分布式锁是在分布式/集群环境中解决多线程并发造成的一系列数据安全问题.所用到的锁就是分布式锁,这种锁需要被多个应用共享才可以,通常使用Redis和zookeeper来实现。 分布式锁有哪些解决方案 常用的三种方案 基于…...

一文讲清数据平台与数据中台的关系与区别
前言 如果您是IT领域或者数据领域的从业者,一定对IT行业“创造”概念的能力深有体会,也一定经常被看起来名称相似,但又不同的各种概念绕的云里雾里,摸不着头脑。今天我们要讨论的是数据平台和数据中台两个概念,您是不…...
Android的Service和Thread的区别
Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。 Android Service是组件,既不能说它是单独的进程也不能说它是单独的线程。 如果非要从通俗的语言层面来理解的话,姑且将其理解为对象。这个Service对象本身作为应用程序的一部分与它的…...

经纬恒润亮相第四届焉知汽车年会,功能安全赋能域控
8月初,第四届焉知汽车年会在上海举行。此次年会围绕当下智能电动汽车的热点和焦点,聚焦于智能汽车场景应用、车载通信、激光雷达、智能座舱、功能安全、电驱动系统等多个领域,汇聚了来自OEM、科技公司、零部件供应商、测试认证机构、政府院校…...
掌握JavaScript单元测试:最佳实践与技术指南
单元测试是软件开发过程中的关键环节,它帮助开发者确保代码的每个独立部分按预期工作。在JavaScript开发中,进行单元测试不仅可以提高代码质量,还可以加快开发速度,因为它们为代码更改提供了安全网。本文将详细介绍如何使用JavaSc…...

spring boot 古茶树管理系统---附源码19810
目 录 摘要 1 绪论 1.1 研究背景 1.2国内外研究现状 1.3论文结构与章节安排 2古茶树管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2经济可行性分析 2.1.3操作可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 …...
00067期 matlab中的asv文件
今天在编写代码的过程中,发现自动生成.m文件的同名文件.asv,特此发出疑问?下面是解答: 有时在存放m文件的文件夹中会出现*.asv asv 就是auto save的意思,*.asv文件的内容和相应的*.m文件内容一样,用记…...

JMeter高效管理测试数据-参数化
文章目录 1.什么是参数化2.定义变量3.CSV数据文件设置 1.什么是参数化 在JMeter中,参数化是一种常用的技术,用于使测试场景更加灵活和动态。通过参数化,你可以让JMeter在每次请求中使用不同的值,这在模拟真实用户行为或测试不同输…...
python学习之writelines
在Python中,writelines() 是一个方法,它属于文件对象,用于将字符串列表写入到文件中。这个方法接受一个序列(如列表或元组)作为参数,序列中的每个元素都是要写入的一行文本。 ### 函数定义: p…...

STM32学习笔记13-FLASH闪存
FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程读写FLASH的用途: 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 通过在…...

UIButton的UIEdgeInsetsMake属性(setTitleEdgeInsets,setImageEdgeInsets)
一.UIEdgeInsetsMake的四个属性 UIEdgeInsetsMake 有四个属性,依次是 Top,left,bottom,right [Btn setTitleEdgeInsets:UIEdgeInsetsMake( top, left, bottom, right)]; 四个属性的默认值为0,拿其中一个left属性来聊, 你可以理解为文字距离Btn左边界的“位移”是0, 如果…...

子网掩码是什么?
子网掩码(Subnet Mask)是用于划分网络的一个32位的二进制数,用于指示IP地址中哪些位用于网络标识,哪些位用于主机标识。 在IPv4网络中,IP地址由32位二进制数组成,通常表示为四个十进制数,每个数…...
SQLALchemy 数据的 CRUD 操作
SQLALchemy 数据的 CRUD 操作 导入必要的模块创建数据库引擎创建会话CRUD 操作创建(Create)读取(Read)更新(Update)删除(Delete)过滤条件使用 `filter` 方法使用 `filter_by` 方法总结聚合函数使用ORM接口使用SQL表达式语言注意关闭会话注意事项SQLAlchemy 是一个流行的…...

reactFiberLane
Lane (车道模型) 英文单词lane翻译成中文表示"车道, 航道"的意思, 所以很多文章都将Lanes模型称为车道模型 Lane模型的源码在ReactFiberLane.js, 源码中大量使用了位运算(有关位运算的讲解, 首先引入作者对Lane的解释(相应的 pr), 这里简单概括如下: Lane类型被定义…...

Hackademic.RTB1靶场实战【超详细】
靶机下载链接:https://download.vulnhub.com/hackademic/Hackademic.RTB1.zip 一、主机探测和端口扫描 nmap 192.168.121.0/24 ip:192.168.121.196 端口:22、80 二、访问80端口 发现target可点击 点击后跳转,页面提示目标是读取到 key.txt 文件 fin…...

让3岁小孩都能理解LeetCode每日一题_3148.矩阵中的最大得分
解释说明: 上面的内容的意思是为了有只移动一次的情况,而后面的grid(i,j)-grid(i,k)由于j严格大于k,所以至少移动了一次,前面可以保持不移动,不移动就是选择0。 class Solution {public int maxScore(List<List&l…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...