欢迎来到皮皮网网首页

【古龙源码】【微视会员源码搭建】【如何做好源码】ugui源码 版本

来源:Cipher加密解密源码 时间:2024-11-24 17:15:47

1.UGUI源码介绍
2.UGUI源码之VertexHelper操作手册
3.Unity源码学习遮罩:Mask与Mask2D
4.想详细了解unityugui的源码渲染流程,但是感觉没有专业文献,如
5.unity 动态图集
6.UGUI源码阅读之Mask

ugui源码 版本

UGUI源码介绍

       本文提供对Unity UI系统(UGUI)源码的概览,内容主要来自官方文档。版本

       UGUI主要由EventSystem和UI两部分构成。源码

       EventSystem部分包含输入模块和射线投射器。版本输入模块用于配置事件系统的源码主要逻辑,提供不同平台的版本古龙源码开箱即用选项,支持各类输入系统如触控、源码控制器、版本键盘和鼠标,源码并将事件分发至对应组件。版本射线投射器则用于检测事件位置,源码决定事件传递至的版本UI元素。

       UI部分结构相对复杂,源码包含多个类和接口,版本如IMaterialModifier和IndexedSet等。源码IMaterialModifier接口允许修改用于渲染的Material,IndexedSet是一种结合List和Dictionary实现的自定义容器,提供快速移除和插入元素的功能,但牺牲了顺序和序列化的友好性。

       总之,UGUI源码通过模块化设计和接口定义,为开发者提供了丰富的UI构建和事件处理能力。

UGUI源码之VertexHelper操作手册

       以下内容是对UGUI中VertexHelper操作的总结与解释,旨在清晰地说明其使用方法,但如有理解或解释上的不足,请您指正。

       VertexHelper在Unity的UGUI中被引入用于管理UI组件的Mesh网格信息,以避免直接修改Mesh带来的问题。其主要功能是通过顶点流、缓冲区和索引数组三个概念进行网格信息的存储与操作,从而支持UI组件中各种复杂的视觉效果的实现。

       网格信息主要包括顶点位置、纹理坐标和法线等属性,以及基于这些顶点所组成的微视会员源码搭建三角形结构。Mesh就是这些顶点和结构的集合,它定义了UI元素的外观。VertexHelper提供了操作这些信息的接口,让开发者能够灵活地调整UI元素的外观和动态效果。

       顶点流可以理解为网格顶点的集合,而缓冲区则是包含顶点流与索引数组的数据结构,索引数组则指示了如何将顶点用于构成三角形。将顶点流和索引数组组合起来,便构成了一个完整的Mesh网格。

       文本和的网格由于顶点顺序和三角形构成方式的差异,展示出不同的视觉效果。在处理整段文本时,通常会有四个顶点用于构成四个三角形,以达到文字的正确显示。而的网格则仅由四个顶点和两个三角形构成,以确保图像的完整性。

       VertexHelper类提供了多种方法来处理网格信息,包括添加三角形、四边形、顶点流与索引数组等,以支持各种UI特效的实现。每种方法都有其特定用途,例如,添加一个四边形需要先添加四个顶点,再指定构成三角形的顺序。

       当前VertexHelper中包括几个关键变量,如`currentVertCount`表示顶点流中的当前顶点数量,`currentIndexCount`表示索引数组中的当前索引数量,用于记录网格中已添加元素的进度。

       此外,VertexHelper提供了多种公共函数来操作网格信息,这些函数通过灵活地管理顶点流与索引数组,使开发者能够轻松地构建复杂且高质量的如何做好源码UI效果。例如,可以添加和获取在三角形中的顶点流,以冗余的方式存储顶点信息,提高操作效率。

       需要注意的是,使用VertexHelper处理网格信息时,要确保顶点流与索引数组中对应的信息完全一致。例如,在添加三角形之前,顶点流中必须包含构成该三角形的三个顶点信息。若不满足这一条件,将无法正确生成网格。

       在实际应用中,VertexHelper提供了多种添加和修改网格的方法,支持开发者根据需要创建各种动态的UI效果。例如,通过动态调整顶点位置、法线和纹理坐标,可以实现UI元素的动画、阴影及材质变化等效果。同时,针对顶点流中的单个顶点的操作函数,也使得细节调整变得更为灵活。

       VertexHelper在提供丰富功能的同时,对顶点流的数量进行了限制,以避免内存溢出等潜在问题,进一步保障应用的稳定性和效率。最后,提供了一系列针对顶点流的获取与操作方法,让开发者能够以高效方式访问和修改网格数据,从而实现多样化且高质量的UI设计。

Unity源码学习遮罩:Mask与Mask2D

       Unity源码学习遮罩详解:Mask与Mask2D

       UGUI裁切功能主要有两种方式:Mask和Mask2D。它们各自有独特的神雕奇侠传源码原理和适用场景。

       1. Mask原理与实现

       Mask利用IMaskable和IMaterialModifier功能,通过指定一张裁切图,如圆形,限定子元素的显示区域。GPU通过StencilBuffer(一个用于保存像素标记的缓存)来控制渲染,当子元素像素位于Mask指定区域时,才会被渲染。

       StencilBuffer像一个画板,每个像素有一个1字节的内存区域,记录是否被遮盖。当多个UI元素叠加时,通过stencil buffer传递信息,实现精确裁切。

       2. Mask2D原理

       RectMask2D则基于IClippable接口,其裁剪基于RectTransform的大小。在C#层,它找出所有RectMask2D的交集并设置剪裁区域,然后Shader层依据这些区域判断像素是否在内,不满足则透明度设为0。

       RectMask2D的性能优化在于无需依赖Image组件,直接使用RectTransform的大小作为裁剪区域。

       3. 性能区别

       Mask需要Image组件,裁剪区域受限于Image,而RectMask2D独立于Image,裁剪灵活。因此,Mask2D在不需要复杂裁剪时更高效。

       总结:虽然Mask和Mask2D各有优势,选择哪种遮罩取决于具体需求,合理使用能提高性能和用户体验。

想详细了解unityugui的渲染流程,但是感觉没有专业文献,如

       理解Unity UI系统的渲染流程,对Unity开发者来说至关重要。本文将详细解析Unity UI (UGUI) 的股票各种指标源码渲染与事件处理机制,帮助开发者更好地掌握其工作原理。首先,我们来了解整个流程的关键环节。

       在游戏运行过程中,UI元素的显示、用户输入的捕获与响应,构成了UGUI的核心功能。这一过程涉及到显示、事件检测、事件调度与事件处理等多个步骤。下图展示了从用户点击事件到系统响应的完整流程。

       UGUI通过输入模块如 StandaloneInputModule 或 TouchInputModule 来检测用户输入,并根据事件类型调用相应事件处理逻辑。输入模块对事件的处理逻辑和细节在源码中较为复杂,但关键在于它们能够识别不同类型的事件(如点击、拖动)并通知相应的游戏对象进行响应。

       在事件处理过程中,BaseEventData、AxisEventData 和 PointerEventData 是关键的数据类,它们分别记录事件的基本信息,如事件发生的上下文、位置、方向等。当用户执行操作时,这些数据被收集并用于后续的事件处理。

       射线碰撞检测是另一重要环节,它帮助系统确定事件应该分配给哪个UI元素进行处理。通过从摄像机屏幕位置发射射线并检测碰撞结果,系统能够精准地将事件传递给目标UI对象,实现交互的无缝衔接。

       整个事件处理流程的中枢位于 EventSystem 类中。EventSystem 通过调用输入事件检测模块和射线碰撞检测模块来构建其逻辑框架。EventSystem 类不仅负责事件的调度与执行,还通过 EventInterfaces、EventTrigger 和 EventTriggerType 等类定义事件回调函数,确保正确的UI元素能够响应特定事件。

       综上所述,理解UGUI的渲染流程不仅能帮助开发者更高效地构建游戏UI,还能提供宝贵的设计思路。尽管在实际项目中可能无需深入掌握这些底层细节,但对架构的理解对于提升开发效率和解决问题能力至关重要。未来,我们还将探讨具体UI组件的实现细节,例如Button和Image组件,以提供更全面的学习资源。

unity 动态图集

       动态图集,是为了解决图集在制作过程和运行时合并批次问题而产生的解决方案。在NGUI和UGUI中,图集通常在制作期间就生成,运行时则是一张大图。这种方法的优势在于可以在一定程度上合并批次,但同时也存在一些局限性。例如,图集在制作过程中会分为commonatlas和系统atlas两类。一个界面prefab至少会使用两张图集,这会导致ABA的图集穿插打断合批的情况。此外,随着游戏内容的增加,各种也会增多,如图标、commonatlas这类图集,一张x可能已经装不下,此时,两张x图集又会出现ABA的情况,同时,内存消耗也随之上升。

       为解决这些问题,动态图集应运而生。动态图集在打包阶段是零散的,但在运行时自动生成一张空白大,并将界面上使用的零散绘制到这张大图上。仅将这个大图传入GPU中,以实现合批效果。对于手机界面的制作,通常采用的标准分辨率低于,因此一张的动态图集足以解决一个界面的绘制工作。然而,动态图集也有其缺点,主要是图集生成过程被延迟到游戏运行时,增加了图集生成的成本。此外,目前尚未出现公开支持压缩的动态图集解决方案,动态图集通常只能以RGBA格式呈现。静态图集在生成过程中是确定的,可以优化分配算法,提高图集利用率。动态图集由于在运行过程中动态生成和变化,图集会存在碎片问题,利用率难以达到很高。

       动态图集的威力,通过下面的demo可以一窥究竟。这个demo仅为动态图集主要思路的简单演示,分配算法将大划分为x的分区,并使用引用计数来控制是否在使用。这套算法适用于UI系统的维护,对于图标等固定尺寸的元素来说,特别合适。下面提供源码进行参考。

UGUI源码阅读之Mask

       Mask主要基于模版测试来进行裁剪,因此先来了解一下unity中的模版测试。

       Unity Shader中的模版测试配置代码大致如上

       模版测试的伪代码大概如上

       传统的渲染管线中,模版测试和深度测试一般发生在片元着色器(Fragment Shader)之后,但是现在又出现了Early Fragment Test,可以在片元着色器之前进行。

       Mask直接继承了UIBehaviour类,同时继承了ICanvasRaycastFilter和IMaterialModifier接口。

       Mask主要通过GetModifiedMaterial修改graphic的Material。大致流程:

       1.获取当前Mask的层stencilDepth

       2.StencilMaterial.Add修改baseMaterial的模板测试相关配置,并将其缓存

       3.StencilMaterial.Add设置一个unmaskMaterial,用于最后将模板值还原

       MaskableGraphic通过MaskUtilities.GetStencilDepth计算父节点的Mask层数,然后StencilMaterial.Add修改模板测试的配置。

       通过Frame Debugger看看具体每个batch都做了什么。先看第一个,是Mask1的m_MaskMaterial,关注Stencil相关的数值,白色圆内的stencil buffer的值设置为1

       这个是Mask2的m_MaskMaterial,根据stencil的计算公式,Ref & ReadMask=1,Comp=Equal,只有stencil buffer & ReadMask=1的像素可以通过模板测试,即第一个白色圆内的像素,然后Pass=Replace,会将通过的像素写入模板值(Ref & WriteMask=3),即两圆相交部分模板值为3

       这个是RawImage的Material,只有模板值等于3的像素可以通过模板测试,所以只有两个圆相交的部分可以写入buffer,其他部分舍弃,通过或者失败都不改变模板值

       这是Mask2的unmaskMaterial,将两个圆相交部分的模板值设置为1,也就是还原Mask2之前的stencil buffer

       这是Mask1的unmaskMaterial,将第一个圆内的模板值设置为0,还有成最初的stencil buffer

       可以看到Mask会产生比较严重的overdraw。

       2.drawcall和合批

       每添加一个mask,一般会增加2个drawcall(加上mask会阻断mask外和mask内的合批造成的额外drawcall),一个用于设置遮罩用的stencil buffer,一个用于还原stencil buffer。

       如图,同一个Mask下放置两个使用相同的RawImage,通过Profiler可以看到两个RawImage可以进行合批

       如图,两个RawImage使用相同的,它们处于不同的Mask之下,但是只要m_StencilValue相等,两个RawImage还是可以进行合批。同时可以看到Mask1和Mask1 (1),Mask2和Mask2 (1)也进行了合批,说明stencilDepth相等的Mask符合合批规则也可以进行合批。

       StencilMaterial.Add会将修改后的材质球缓存在m_List中,因此调用StencilMaterial.Add在相同参数情况下将获得同一个材质球。

UGUI源码导读

       对于想了解UGUI C#源码阅读顺序的同学,我有些建议。首先,要知道UI组件的渲染需要顶点、材质和Layout数据,这与模型相似但多了Layout。组件脚本继承自MonoBehaviour,当数据改变或组件启用时,会自动加入CanvasUpdateRegistry的更新列表。

       源码大致可以分为几个部分:基础组件如Image、Text,它们包含自身数据;CanvasUpdateRegistry负责组件更新,当Canvas更新时会调用组件的方法;辅助工具如LayoutRebuilder、FontData和动画工具CoroutineTween;数据结构工具,如ListPool、ObjectPool等,虽非业务核心,但价值不容忽视;Mask与Mask2D的实现;以及EventSystem的事件处理机制,这部分我已经详细阐述过。

       从基础组件开始,Graphic脚本是起点。OnEnable时会调用SetAllDirty,这里包含了组件的三个更新数据:Layout、顶点和材质。SetLayoutDirty等方法负责实际的更新,其中LayoutRebuilder是一个关键的辅助类。当Canvas更新时,会遍历并执行需要更新的LayoutGroup的Rebuild方法。

       Image的Filled模式生成Mesh的过程是另一个看点。至于RectMask2D,其工作流程涉及挂载、子物体处理和Canvas重建后的Clip方法。Mask则通过Stencil材质实现子物体的遮罩效果。

       最后,推荐关注几个实用的工具脚本,如ObjectPool用于对象管理和CoroutineTween用于动画效果。整体来看,阅读源码时,理解这些结构和流程会让你事半功倍,但需做好心理准备,因为源码可能并不包含详细的DC(详细内容)或Text的文字网格计算等具体实现。