
UGUI源码解析
Unity的UI源码阅读笔记
鹅厂程序小哥
与你一起写程序 | 知乎:鹅厂程序小哥 | 微信公众号:鹅厂程序小哥
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
UGUI源码实战--自定义Graphic
在日常开发过程当中,类似于HUD或者是弹幕之类大量的体积小但是不断在移动的UI,在不断的重建的过程当中会产生大量的GC,导致游戏卡顿到不能玩。今天就研究一下Unity中UGUI的绘制方法以及规则:UGUI的源码地址(C#部分):下载地址利用底层API进行绘制首先我们要搞清楚,到底UGUI是如何对UI进行绘制的。我们首先从最稀疏平常的Image开始。Image源码...转载 2019-03-06 10:51:48 · 1532 阅读 · 1 评论 -
UGUI源码解析(二十七)总结篇
1、渲染细节当使用Unity UI 制作用户界面时,记住,所有的被canvas绘制的图形都是被放在透明渲染队列。这意味着,Unity UI产生的图形都会使用透明混合(alpha blending)从后向前渲染。有一个重要的性能点要注意:图形上的每一个像素都会被采样,即使它被另一个不透明的图形完全覆盖。在移动设备上,大量的的过度绘制(overdraw)可以快速超出GPU填充率的上限。2...原创 2019-03-06 10:50:00 · 2023 阅读 · 0 评论 -
UGUI源码解析(二十六)TweenRunner & ColorTween & FloatTween
1、TweenRunner<T>继承自ITweenValue接口,在Graphic和DropDown里被调用到,分别用于实现颜色和透明度渐变效果。Init方法传入MonoBehaviour类型参数,作为m_CoroutineContainer。StartTween方法使用m_CoroutineContainer启动协程,执行Start方法Start方法如果忽...原创 2019-03-06 10:49:54 · 730 阅读 · 0 评论 -
UGUI源码解析(二十五)Shadow & Outline & PositionAsUV1
1、ShadowShadow继承自BaseMeshEffect,BaseMeshEffect继承自UIBehaviour, IMeshModifier。Shadow通过为图像或者文字的Mesh添加顶点来实现阴影效果,而Outline是在对象四角上各添加了一个Shadow。由此我们可以得知,Outline的(额外)消耗是Shadow的四倍,所以还是需要谨慎使用。BaseMeshEffect类...原创 2019-03-06 10:49:47 · 923 阅读 · 0 评论 -
UGUI源码解析(二十四)LayoutGroup
LayoutGroup类LayoutGroup是一个抽象类,继承了UIBehaviour, ILayoutElement, ILayoutGroup。HorizontalOrVerticalLayoutGroup和GridLayoutGroup继承自它。继承自ILayoutController的方法,LayoutGroup的SetLayoutHorizontal和SetLayoutVert...原创 2019-03-06 10:49:42 · 975 阅读 · 0 评论 -
UGUI源码解析(二十三)AspectRatioFitter
AspectRatioFitter类调整RectTransform大小,以适应指定的宽高比。继承了UIBehaviour, ILayoutSelfController。属性:aspectMode 执行宽高比的模式aspectRatio 应用的宽高比,宽度除以高度OnEnable方法调用SetDirty(true),启动协程延时更新,延时后调用UpdateRectOnDi...原创 2019-03-06 10:49:36 · 481 阅读 · 0 评论 -
UGUI源码解析(二十二)ContentSizeFitter
ContentSizeFitter类继承了UIBehaviour, ILayoutSelfController,继承ILayoutSelfController,需要重写SetLayoutHorizontal和SetLayoutVertical方法。SetLayoutHorizontal方法清空DrivenRectTransformTracker,调用HandleSelfFittingA...原创 2019-03-06 10:49:29 · 1204 阅读 · 0 评论 -
UGUI源码解析(二十一)LayoutRebuilder
LayoutRebuilderGraphic是通过MarkLayoutForRebuild这个静态方法标记自己需要重建的。MarkLayoutForRebuild方法找到父对象中最近的ILayoutGroup类型的组件layoutRoot,并为其创建LayoutRebuilder。 从s_Rebuilders栈中Pop出一个LayoutRebuilder,s_Rebuilders是一...原创 2019-03-06 10:48:57 · 2902 阅读 · 1 评论 -
UGUI源码解析(二十)Text
TextText继承了MaskableGraphic, ILayoutElement。OnPopulateMesh方法重写Graphic的OnPopulateMesh方法,会在Graphic的Rebuild方法被调用,为CanvasRenderer的Mesh提供了顶点位置、顶点颜色、UV和三角形信息。 根据用户设置生成了一个TextGenerationSettings文本生成设置,...原创 2019-03-05 10:33:25 · 2313 阅读 · 0 评论 -
UGUI源码解析(十九)Image
ImageImage继承了MaskableGraphic, ISerializationCallbackReceiver, ILayoutElement, ICanvasRaycastFilter,提供了四种ImageType:Simple(普通)、Sliced(切割)、Tiled(平铺)、Filled(填充)。继承了ILayoutElement是一个布局元素,可以被各种布局组(ILayout...原创 2019-03-05 10:33:18 · 983 阅读 · 0 评论 -
UGUI源码解析(十八)RawImage
RawImageRawImage继承了MaskableGraphic,顾名思义,就是未经处理的图片,每个RawImage都会创建一个DrawCall,所以最好用在背景图片或是临时图形。RawImage只继承了MaskableGraphic抽象类。重写了Graphic的SetNativeSize方法,具体实现设置RectTransform的sizeDelta跟纹理Texture的大小尺寸一致...原创 2019-03-05 10:33:12 · 607 阅读 · 0 评论 -
UGUI源码解析(十七)Mask
MaskMask继承了UIBehaviour, ICanvasRaycastFilter,IMaterialModifier。OnEnable方法如果含有Graphic组件,设置graphic.canvasRenderer.hasPopInstruction为true,调用graphic.SetMaterialDirty()方法。然后调用MaskUtilities.NotifySten...原创 2019-03-05 10:33:05 · 762 阅读 · 0 评论 -
UGUI源码解析(十六)RectMask2D
RectMask2DRectMask2D继承了UIBehaviour, IClipper, ICanvasRaycastFilter维护了一个IClippable类型的列表:private HashSet<IClippable> m_ClipTargets = new HashSet<IClippable>();AddClippable方法设置m_Sho...原创 2019-03-05 10:32:58 · 1588 阅读 · 0 评论 -
UGUI源码解析(十五)MaskableGraphic
MaskableGraphicMaskableGraphic是一个抽象类,继承了Graphic, IClippable, IMaskable, IMaterialModifier接口,派生了RawImage,Image和Text。OnEnable方法设置重新计算模板m_ShouldRecalculateStencil为true,更新裁剪的父对象UpdateClipParent,设置Ma...原创 2019-03-05 10:32:51 · 2184 阅读 · 0 评论 -
UGUI源码解析(十四)Grahic
GrahicGrahic是UGUI的核心组件,负责显示图像,继承了UIBehaviour,ICanvasElement。它是一个抽象类,是MaskableGraphic(可遮罩图像)的基类,而后者是RawImage,Image和Text的基类。继承自UIBehaviour的方法:OnEnable方法调用了CacheCanvas方法,从父节点中获取Canvas列表,取得第一个激...原创 2019-03-05 10:32:42 · 1853 阅读 · 0 评论 -
UGUI源码解析(十三)InputField
InputFieldInputField可以提供文本输入功能,是与用户交互的一个重要手段。我们可以在编辑器里,为OnValueChanged和OnEndEdit两个事件添加监听,这样就可以获得用户输入的文本。public class InputField : Selectable,IUpdateSelectedHandler,IBeginDragHandler,IDragHandler...原创 2019-03-05 10:32:36 · 2646 阅读 · 0 评论 -
UGUI源码解析(十二)Dropdown
Dropdown内部类DropdownItem,继承自MonoBehaviour和IPointerEnterHandler, ICancelHandler两个接口。OnPointerEnter(当鼠标进入)方法继承自IPointerEnterHandler,调用EventSystem的SetSelectedGameObject将本对象设置为选中的对象,表现就是Item对象的背景颜色变了。...原创 2019-03-05 10:32:27 · 1030 阅读 · 0 评论 -
UGUI源码解析(十一)Slider
SliderSlider继承了Selectable, IDragHandler, IInitializePotentialDragHandler, ICanvasElement。Set方法ClampValue把value限制在minValue和maxValue之间,如果value改变,且sendCallback为true,便会发送m_OnValueChanged事件。同时会调用Upda...原创 2019-03-04 21:13:20 · 950 阅读 · 0 评论 -
UGUI源码解析(十)ScrollRect
ScrollRectScrollRect继承自UIBehaviour,另外还继承了IInitializePotentialDragHandler, IBeginDragHandler, IEndDragHandler, IDragHandler, IScrollHandler, ICanvasElement, ILayoutElement, ILayoutGroup这些接口。OnEnabl...原创 2019-03-04 21:11:30 · 3067 阅读 · 0 评论 -
UGUI源码解析(九)Scrollbar
ScrollbarScrollbar,它继承自Selectable,还继承了 IBeginDragHandler, IDragHandler, IInitializePotentialDragHandler, ICanvasElementt四个接口。Scrollbar有一个float变量m_Value表示当前Scrollbar的值,变化范围在[0, 1]之间,还添加了一个UnityEven...原创 2019-03-04 21:06:28 · 1094 阅读 · 0 评论 -
UGUI源码解析(八)Toggle和ToggleGroup
ToggleToggle继承了Selectable, IPointerClickHandler, ISubmitHandler, ICanvasElement,(ICanvasElement,是Canvas渲染的时候调用的接口),Toggle有个重要的bool变量m_IsOn(对应成员属性IsOn),表示是否被勾选。还添加了一个UnityEvent<bool>类型的事件onValu...原创 2019-03-04 21:04:57 · 1624 阅读 · 0 评论 -
UGUI源码解析(七)Selectable与Button
1、SelectableSelectable是UGUI的核心组件,除了最常用的Button,它还是Scrollbar、Dropdown、Slider、Toggle、InputField这些组件的基类。在Selectable之前,我们看到,它被添加了四个属性:[AddComponentMenu("UI/Selectable", 70)][ExecuteInEditMode] 运行在编...原创 2019-03-05 10:32:03 · 913 阅读 · 0 评论 -
UGUI源码解析(六)Raycast
6、Raycast编程小技巧:Mathf.Approximately(0.0f, projectionDirection); 比较两个float值,如果他们在很小的相差(Epsilon)内,返回true。浮点不精确使得使用等号运算符比较浮点数不准确。例如,(1.0 == 10.0 / 10.0)每次都可能不会返回true。BaseRaycaster是其他Raycaster的抽...原创 2019-03-04 20:59:20 · 1120 阅读 · 0 评论 -
UGUI源码解析(五)CanvasUpdateRegistry
5、CanvasUpdateRegistryCanvasUpdateRegistry(画布更新注册处)是一个单例,它是UGUI与Canvas之间的中介,继承了ICanvasElement接口的组件都可以注册到它,它监听了Canvas即将渲染的事件,并调用已注册组件的Rebuild等方法。CanvasUpdateRegistry维护了两个索引集(不会存放相同的元素)://布局重建序列索引...原创 2019-03-04 20:58:38 · 1047 阅读 · 0 评论 -
UGUI源码解析(四)输入模块
输入模块在第一部分EventSystem我们探究了事件系统,在第二部分执行事件中我们介绍了事件是如何执行的。那么事件是如何产生的呢?这就涉及到BaseInputModule、PointerInputModule、StandaloneInputModule、TouchInputModule这些类。我们就探究一下输入模块的原理。比如处理触摸事件时,EventSystem在OnUpdate()方...原创 2019-03-04 20:56:50 · 834 阅读 · 0 评论 -
UGUI源码解析(三)截取事件
截取事件有两种截取事件的方法:第一种,你可以扩展EventTrigger,并覆盖你感兴趣截取的事件的函数(简单常用);第二种,指定单个的委托事件。第一种方式:public class EventTriggerExample : EventTrigger{ public override void OnBeginDrag(PointerEventData data)...原创 2019-03-04 20:55:43 · 922 阅读 · 0 评论 -
UGUI源码解析(二)执行事件
执行事件在上面的事件系统,其中我们讲到EventSystem可以通过ExecuteEvents这个类来执行事件,那么事件是如何执行的呢?这里涉及到了两个文件EventInterface和ExecuteEvents。EventInterface类EventInterface定义了一系列的跟输入有关的接口。例如IPointerEnterHandler(指针进入事件接口)。一个组件添加...原创 2019-03-04 20:55:26 · 1082 阅读 · 0 评论 -
UGUI源码解析(一)EventSystem系统
EventSystem系统看似名字很大,其实EventSystem处理和管理的是点击、触摸、键盘输入等事件,叫做InputEventSystem更为合适。//系统输入模块private List<BaseInputModule> m_SystemInputModules = new List<BaseInputModule>();//当前输入模块pri...原创 2019-03-04 20:46:47 · 2579 阅读 · 0 评论