
UGUI源码解析
文章平均质量分 60
UGUI源码解析
Hello Bug.
记录一点点
展开
-
UGUI源码解析——总览
一:图像相关——UIBehaviour:UGUI源码解析——UIBehaviourUI组件的基类,负责接收一些事件——CanvasUpdateRegistry、ICanvasElement:UGUI源码解析——CanvasUpdateRegistry监听画布的布局、网格、材质的更新——LayoutRebuilder:——Graphic:显示相关的基类——MaskableGraphic:——IMaskable:——ICliappable:——IMaterialModifier:原创 2022-04-19 16:32:10 · 6056 阅读 · 1 评论 -
UGUI源码解析——RawImage
RawImage是显示图像的组件,继承自MaskableGraphic,可以显示任何类型的贴图大多应用于小地图或需要根据UV坐标实现动图的效果因为RawImage显示的图片类型是贴图类型,所以不能打图集,导致每一张RawImage渲染的图像都需要增加一个DrawCall。原创 2022-08-24 17:17:50 · 1530 阅读 · 0 评论 -
UGUI源码解析——Image
Image是显示Sprite图像的组件,继承自MaskableGraphic。原创 2022-08-24 14:42:56 · 1520 阅读 · 0 评论 -
UGUI源码解析——DataUtility
计算Sprite数据的工具类。原创 2022-08-23 16:32:03 · 774 阅读 · 0 评论 -
UGUI源码解析——StencilMaterial
StencilMaterial是一个静态类,负责管理模板材质。维护了一个MatEntry类型的列表提供一个新的材质继承IClippable接口MaskableGraphic继承了IClippable,需要实现RecalculateClipping,Cull和SetClipRect方法。RecalculateClipping在MaskUtilities中被调用,Cull和SetClipRect在RectMask2D中被调用。下载,下载时选择"Builtinshaders"从。......原创 2022-07-19 10:40:18 · 1074 阅读 · 0 评论 -
UGUI源码解析——Mask
Mask是遮罩组件,继承自UIBehaviour、ICanvasRaycastFilter、IMaterialModifier它遮罩的形状由Graphic决定,所以可以利用不同的Graphic实现不同形状的遮罩它的实现原理是利用了StencilBuffer(模板缓存)在Mask的GetModifiedMaterial方法中生成一个材质将StencilBuffer值设置为特定值在MaskableGraphic的GetModifiedMaterial方法中。...............原创 2022-07-18 18:23:46 · 1827 阅读 · 0 评论 -
UGUI源码解析——IMaskable
IMaskable是Mask遮罩接口(被遮罩者),可以在子类中实现RecalculateMasking方法去重新计算遮罩。原创 2022-07-18 18:15:09 · 856 阅读 · 0 评论 -
UGUI源码解析——IClippable
裁剪接口(被裁剪者),MaskableGraphic继承此接口。原创 2022-07-18 17:44:52 · 1331 阅读 · 0 评论 -
UGUI源码解析——IMaterialModifier
IMaterialModifier是材质处理的接口,可以在子类中实现GetModifiedMaterial方法去修改渲染的材质Mask实现了此接口。原创 2022-07-18 17:19:57 · 806 阅读 · 0 评论 -
UGUI源码解析——RectMask2D
RectMask2D是矩形遮罩组件,是通过CanvasRenderer实现的——AddClippable添加裁剪对象设置m_ShouldRecalculateClipRects为true,接着判断裁剪对象是否为MaskableGraphic,并添加到IClippable序列或MaskableGraphic序列中,最后将m_ForceClip设置为true此方法在MaskableGraphic类中的UpdateClipParent方法中被调用——RemoveClippable移除裁剪对象设置m原创 2022-07-12 16:07:27 · 1489 阅读 · 0 评论 -
UGUI源码解析——IClipper
裁剪接口,RectMask2D继承此接口接口中只有一个方法,在子类中实现PerformClipping,此方法在布局重建后图像重建前执行原创 2022-07-12 14:51:29 · 502 阅读 · 0 评论 -
UGUI源码解析——ClipperRegistry
ClipperRegistry是一个单例,它是裁剪注册器——Register将裁剪对象添加到m_Clippers序列中——Unregister将裁剪对象从m_Clippers序列中移除——Cull执行m_Clippers序列对象的PerformClipping方法进行裁剪原创 2022-07-12 20:30:00 · 619 阅读 · 0 评论 -
UGUI源码解析——MaskUtilities
遮罩相关工具类。原创 2022-07-18 18:22:44 · 772 阅读 · 0 评论 -
UGUI源码解析——MaskableGraphic
MaskableGraphic继承自Graphic类,IClippable、IMaskable、IMaterialModifier接口,继承自Graphic类表示它负责图像的显示与更新Image、RawImage、Text都继承自MaskableGraphic类MaskableGraphic继承自Graphic类,IClippable、IMaskable、IMaterialModifier接口,继承自Graphic类表示它负责图像的显示与更新Image、RawImage、Text都继承自Maskabl原创 2022-07-21 18:38:25 · 1776 阅读 · 0 评论 -
UGUI源码解析——LayoutElement
继承了ILayoutElement和ILayoutIgnorer接口,作为布局元素组件挂载了Layout Element组件的对象,布局并不会生效,它是受到实现了布局组的控制(HorizontalLayoutGroup、VerticalLayoutGroup、GridLayoutGroup)——继承自ILayoutElement的属性——Min Width:最小宽度,只要设置了值,不管布局组件怎么设置,最小宽度不能小于这个值——Min Height:最小高度,只要设置了值,不管布局组件怎么设置,最小原创 2022-06-16 18:08:29 · 976 阅读 · 1 评论 -
UGUI源码解析——LayoutUtility
布局的工具类,可以获取到对象的minWidth、preferredWidth、flexibleWidth、minHeight、preferredHeight、layoutPriority的属性值——获取对象属性值的方法以上方法可以获取到对象的minWidth、preferredWidth、flexibleWidth、minHeight、preferredHeight、layoutPriority的属性值——GetLayoutProperty遍历对象身上所有的ILayoutElement类型的组件,原创 2022-06-15 18:50:38 · 831 阅读 · 0 评论 -
UGUI源码解析——ContentSizeFitter
ContentSizeFitter继承自ILayoutSelfController,是调整对象自适应的组件,ContentSizeFitter不改变子物体的大小和位置,而是根据子物体(ILayoutElement)来改变自身的尺寸ContentSizeFitter所挂载的对象上必须挂载了实现ILayoutElement接口的组件——HandleSelfFittingAlongAxis设置对象的位置和大小与HorizontalLayoutGroup、VerticalLayoutGroup、GridLa原创 2022-06-15 18:11:47 · 960 阅读 · 0 评论 -
UGUI源码解析——ICanvasElement
每个UGUI的组件都继承自ICanvasElement接口——Rebuild:重构方法,需要在继承类中实现,Graphic和LayoutRebuilder继承了此接口UGUI源码解析——GraphicUGUI源码解析——LayoutRebuilder——transform:所有UGUI组件都继承自UIBehaviour类,UIBehaviour继承自MonoBehaviour,MonoBehaviour继承自Component,而Component类实现了transform属性,所以可以不用再实现t原创 2022-06-14 19:40:59 · 1044 阅读 · 0 评论 -
UGUI源码解析——LayoutRebuilder
LayoutRebuilder类主要负责布局的刷新(UI位置的刷新)——MarkLayoutForRebuild此方法是外界与布局系统沟通的桥梁首先向上遍历找到最上层父物体中挂载了实现ILayoutGroup的组件,之后调用MarkLayoutRootForRebuild将此物体添加到CanvasUpdateRegistry类中的布局重建序列中——Rebuild此方法的作用是调用了计算和设置布局的方法执行布局重建操作前会先将所有待重建元素的父对象数量进行升序排序,这样可以保证是从下到上进行布局原创 2022-06-14 17:00:51 · 1453 阅读 · 2 评论 -
UGUI源码解析——HorizontalLayoutGroup、VerticalLayoutGroup、GridLayoutGroup
HorizontalLayoutGroup和VerticalLayoutGroup继承自HorizontalOrVerticalLayoutGroup,分别为水平布局组件和垂直布局组件GridLayoutGroup继承自LayoutGroup,为网格布局组件,它同时实现了水平和竖直布局以上四个方法由布局系统自动调用,这三种布局组件都实现了以上四个方法,计算和设置布局CalculateLayoutInputHorizontal和CalculateLayoutInputVerticall方法实现了计算并设原创 2022-06-14 14:25:05 · 1017 阅读 · 0 评论 -
UGUI源码解析——HorizontalOrVerticalLayoutGroup
继承自LayoutGroup,顾名思义,这个类是HorizontalLayoutGroup和VerticalLayoutGroup的父类,提供了一些HorizontalLayoutGroup和VerticalLayoutGroup通用的方法——CalcAlongAxis计算minWidth、preferredWidth、flexibleWidth、minHeight、preferredHeight、flexibleHeight属性值,并通过父类LayoutGroup的SetLayoutInputForA原创 2022-06-14 13:55:25 · 616 阅读 · 0 评论 -
UGUI源码解析——LayoutGroup
LayoutGroup实现了ILayoutElement和ILayoutGroup,说明它既是一个布局元素也是一个布局控制器——CalculateLayoutInputHorizontal:实现了CalculateLayoutInputHorizontal方法,得到被布局系统所控制的所有元素——GetStartOffset:根据给定轴(axis)和对齐方式(childAlignment)计算出第一个元素的起始坐标........................原创 2022-06-14 11:17:37 · 691 阅读 · 0 评论 -
UGUI源码解析——ILayoutSelfController
继承自ILayoutController(布局控制器),用于控制自身布局元素,例如ContentSizeFitter、AspectRatioFitter原创 2022-06-13 16:12:26 · 412 阅读 · 0 评论 -
UGUI源码解析——ILayoutGroup
继承自ILayoutController(布局控制器),用于控制子布局元素,例如HorizontalOrVerticalLayoutGroup、GridLayoutGroup原创 2022-06-13 16:12:12 · 389 阅读 · 0 评论 -
UGUI源码解析——ILayoutController
ILayoutController可分为两种:控制自身和控制子布局元素。SetLayoutHorizontal、SetLayoutVertical:获取自身及子元素的布局属性值并设置布局,先设置水平后设置竖直原创 2022-06-13 16:11:51 · 405 阅读 · 0 评论 -
UGUI源码解析——ILayoutElement
挂载了实现ILayoutElement的组件被视为一个布局元素,布局元素不直接设置自身的大小,而是由布局控制器设置——CalculateLayoutInputHorizontal、CalculateLayoutInputVertical:计算水平布局和垂直布局的属性值,先计算水平后计算竖直(竖直方向可能依赖于水平方向)——minWidth、preferredWidth、flexibleWidth、minHeight、preferredHeight、flexibleHeight:一些属性值,在Calcul原创 2022-06-13 16:11:32 · 876 阅读 · 0 评论 -
UGUI源码解析——ILayoutIgnorer
挂载了实现ILayoutIgnorer的组件可以设置布局系统忽略,例如LayoutElementignoreLayout:设置为true则此物体不再受布局系统控制(物体身上所有挂载的实现ILayoutIgnorer的组件中的ignoreLayout都为true才会不受布局系统控制)..................原创 2022-06-13 16:12:38 · 502 阅读 · 0 评论 -
UGUI源码解析——Outline
一:前言Outline继承自Shadow,可以为图片或文字添加描边效果它的实现原理是将原网格数据复制四份并向指定方向移动指定像素,然后再填充到顶点数据中,也就是四个Shadow,所以顶点数和三角面数会增加4倍Outline可以理解为是4个Shadow,将Outline组件上的x偏移和y偏移调大可以看出来其实就是复制了四份原网格二:源码解析首先在ModifyMesh方法中使用vh.GetUIVertexStream把当前的顶点信息提取到一个List<UIVertex>..原创 2022-04-22 16:26:51 · 1017 阅读 · 0 评论 -
UGUI源码解析——Shadow
一:前言Shadow继承自BaseMeshEffect,可以为图片或文字添加阴影效果它的实现原理是将原网格数据复制一份并向指定方向移动指定像素,然后再填充到顶点数据中,所以顶点数和三角面数会增加1倍二:源码解析首先在ModifyMesh方法中使用vh.GetUIVertexStream把当前的顶点信息提取到一个List<UIVertex>中(UIVertex是一个结构体),之后调用ApplyShadowZeroAlloc方法,按照原顶点的顺序,从前至后,先添加一个相同的顶点,然后再原创 2022-04-22 16:27:16 · 1003 阅读 · 0 评论 -
UGUI源码解析——BaseMeshEffect
一:前言BaseMeshEffect继承了IMeshModifier,是用于修改生成的网格的特效类的抽象基类,可以在子类继承并重写ModifyMesh方法去修改顶点数据,它与IMeshModifier没有太大的区别,只不过BaseMeshEffect类中定义好了属性m_Graphic以及实现了IMeshModifier接口Outline和Shadow都继承或间接继承了BaseMeshEffect我们实现自己的网格效果时尽量也继承BaseMeshEffect类而不是继承IMeshModifier接口原创 2022-04-22 11:16:32 · 1606 阅读 · 0 评论 -
UGUI源码解析——IMeshModifier
一:前言IMeshModifier是网格处理的接口,可以在子类中实现ModifyMesh方法去修改顶点数据二:源码解析可以子类继承IMeshModifier接口实现ModifyMesh方法去修改顶点数据UGUI源码解析——Graphic在Graphic类的UpdateGeometry方法中首先调用了OnPopulateMesh方法将元素的顶点、颜色、UV等信息暂存到m_VertexHelper中,接着遍历身上继承了IMeshModifier的组件去调用ModifyMesh方法去更新m_Ver原创 2022-04-22 11:11:29 · 789 阅读 · 0 评论 -
UGUI源码解析——VertexHelper
一:前言Graphic是UGUI的核心组件,负责显示图像,是MaskableGraphic的基类,而MaskableGraphic是Text、RawImage、Image的基类二:源码解析——类头我们在UGUI的原理中说过想要显示一个UI就需要对应的Mesh信息,那么UI的Mesh信息(顶点,三角形等)是保存到了哪里呢?这个就是VertexHelper的作用,它只是一个普通的类对象,保存了生成Mesh的基本信息,如每个顶点的位置,颜色,UV,法线,切线,三角形索引及其生成Mesh的方法,而并非M原创 2022-04-21 13:45:43 · 1468 阅读 · 0 评论 -
UGUI源码解析——UIBehaviour
一:前言UIBehaviour是所有UI组件的基类,UI组件都是直接或者间接继承UIBehaviour这个抽象类的,它继承自MonoBehavior,所以拥有和Unity相同的生命周期二:源码解析除了Awake、OnEnable、Start、OnDisable、OnDestroy外,还有一些与UI变化相关的方法——OnValidate:当脚本被加载(禁用或启动)或者Inspector面板的值出现变化的时候会被调用,这个回调函数只在编辑器模式下在会被调用,所以使用的时候最好用#if UNITY_原创 2022-04-11 18:39:33 · 3274 阅读 · 0 评论 -
UGUI源码解析——CanvasUpdateRegistry
一:前言CanvasUpdateRegistry是一个单例,它监听了Canvas即将渲染的UGUI组件,并调用已注册组件的Rebuild等方法二:源码解析首先可以看到ICanvasElement这个接口,每个UGUI的组件都继承自ICanvasElement接口——Rebuild:重构方法,需要在继承类中实现——transform:因为每个UGUI组件都继承自UIBehaviour类,UIBehavior类实现了transform属性,所以可以不用再实现transform属性——Layou原创 2022-04-10 15:54:38 · 2196 阅读 · 0 评论 -
UGUI源码解析——Graphic
一:前言Graphic是UGUI的核心组件,负责显示图像,是MaskableGraphic的基类,而MaskableGraphic是Text、RawImage、Image的基类二:源码解析Graphic继承自UIBehaviour和ICanvasElement,UIBehaviour是所有UGUI组件的最基类,负责接收来自UnityEngine或者UnityEditor的事件,ICanvasElement负责接收Canvas重新渲染的事件:UGUI源码解析——CanvasUpdateRegist原创 2022-04-20 11:52:48 · 3447 阅读 · 0 评论