0 前言
最近有时间,所以学习了一下UGUI的源码(2019.4),这里做一下读书笔记。本篇是第一篇,主要是简单介绍一下源码的各个组成部分,本人能力有限,如果错漏欢迎指正。
1 文件结构
主要是EventSystem和UI两个部分,Properties是定义你程序集属性的项目属性文件夹,一般只有一个 AssemblyInfo.cs 类文件,用于保存程序集的信息,如名称,版本等,这些信息一般与项目属性面板中的数据对应,不需要手动编写,暂时不做了解。
UGUI源码文件结构1.1 EventSystem事件系统
文件结构如下,下面简单介绍一下各个部分及包含的类,命名空间默认是UnityEngine.EventSystems。
EventSystem文件夹的文件结构EventData事件数据文件名描述BaseEventData包含新 EventSystem 中所有事件类型通用的基本事件数据的类
继承自:EventSystems.AbstractEventDataAxisEventData与 Axis 事件(控制器/键盘)关联的事件数据
继承自:EventSystems.BaseEventDataPointerEventData与指针(鼠标/触摸)事件关联的事件有效负载
继承自:EventSystems.BaseEventData
定义了FramePressState(给定帧的按下状态)和InputButton(输入按下跟踪,即按钮类型)两个枚举。InputModules输入模块输入模块可用于配置和自定义事件系统的主要逻辑。系统提供了两个开箱即用的输入模块,一个用于独立平台,另一个用于触控输入(已弃用)。每个模块都会按照您在给定配置上的预期接收和分发事件。
输入模块是执行事件系统“业务逻辑”的位置。启用事件系统后,它会查看所连接的输入模块,并将更新处理传递给具体模块。
输入模块可根据您希望支持的输入系统进行扩展或修改。输入系统的目的是将特定于硬件的输入(例如触摸、游戏杆、鼠标、运动控制器)映射到通过消息系统发送的事件。
内置的输入模块可支持常见的游戏配置,如触控输入、控制器输入、键盘输入和鼠标输入。如果在 MonoBehaviour 上实现特定接口,这些输入模块会向应用程序中的控件发送各种事件。所有 UI 组件都实现了对具体组件有意义的接口。
文件名描述BaseInputBaseInputModule 使用的 Input 系统的接口。
利用此属性,您可以绕过输入系统(使用自己的输入系统),但仍然使用同一 InputModule。例如,此属性可用于将虚假输入馈送到具有不同输入系统的 UI 或接口。
继承自:EventSystems.UIBehaviourBaseInputModule用于引发事件并将其发送到 GameObjects 的基本模块。
输入模块是 EventSystem 的一个组件,负责引发事件并将其发送到 GameObjects 进行处理。BaseInputModule 是一个类,EventSystem 中所有输入模块都继承自该类。提供的模块示例为 TouchInputModule 和 StandaloneInputModule,如果这些模块不适合您的项目,您可以通过从 BaseInputModule 扩展来创建自己的模块。
继承自:EventSystems.UIBehaviourPointerInputModule指针输入的 BaseInputModule。
由 TouchInputModule 和 StandaloneInputModule 使用。
继承自:EventSystems.BaseInputModuleStandaloneInputModule专为鼠标/键盘/控制器输入设计的 BaseInputModule。
根据设计,该模块与控制器/鼠标输入具有相同的功能。响应输入时会发送按钮按压、拖拽以及类似事件。
当鼠标/输入设备移动时,该模块将指针事件发送到组件,并使用图形射线投射器 (Graphics Raycaster)和物理射线投射器 (Physics Raycaster) 来计算给定指针设备当前指向的元素。您可以配置这些射线投射器来检测或忽略场景的某些部分,从而满足您的要求。
该模块会发送 Move 事件和 Submit/Cancel 事件来响应通过 Input 窗口跟踪的输入。对于键盘和控制器输入均是如此。可在模块的检视面板中配置跟踪的轴和键。
继承自:EventSystems.PointerInputModuleTouchInputModule输入模块,用于基于触摸的输入。
继承自:EventSystems.PointerInputModule
PS:输入模块 (TouchInputModule) 已弃用。现在触摸输入的处理在 StandaloneInputModule 中进行。Raycasters射线投射器事件系统需要一种方法来检测当前输入事件需要发送到的位置,而此方法由射线投射器 (Raycaster) 提供。给定屏幕空间位置的情况下,射线投射器将收集所有潜在目标,确定它们是否在给定位置下,然后返回最接近屏幕的对象。以下是提供的几种类型的射线投射器。
文件名描述BaseRaycasterBaseInputModule 使用的 Input 系统的接口。
利用此属性,您可以绕过输入系统(使用自己的输入系统),但仍然使用同一 InputModule。例如,此属性可用于将虚假输入馈送到具有不同输入系统的 UI 或接口。
继承自:EventSystems.UIBehaviourPhysicsRaycasterRaycaster,用于针对 3D 物理组件进行投射。
射线投射器对场景中的 3D 对象进行射线投射。因此可将消息发送到实现事件接口的 3D 物理对象。
继承自:EventSystems.BaseRaycasterPhysics2DRaycasterRaycaster,用于针对 2D 物理组件进行投射。
2D 射线投射器对场景中的 2D 对象进行射线投射。因此可将消息发送到实现事件接口的 2D 物理对象。此情况下需要使用摄像机游戏对象,并会将 2D 物理射线投射器添加到摄像机游戏对象(如果未将 3D 物理射线投射器添加到摄像机游戏对象)。
继承自:EventSystems.PhysicsRaycasterGraphicRaycasterRaycaster,用于 UI 元素,位于画布上,并在画布中搜索。
图形射线投射器用于对画布进行射线投射。射线投射器查看画布上的所有图形,并确定是否有任何图形被射中。
可将图形射线投射器配置为忽略背面图形以及被其前面的 2D 或 3D 对象阻挡。如果希望将此元素的处理强制为射线投射的前面或后面,也可应用手动优先级。
继承自:EventSystems.BaseRaycaster
PS:代码在UI文件里,放在这一起讲其他文件名描述EventHandle跟踪事件状态的枚举,Unused未使用,Used已使用。EventInterfaces定义了事件系统支持的事件,由接口的方式实现。
事件系统支持许多事件,并可在用户编写的自定义输入模块中进一步自定义它们。独立输入模块和触摸输入模块支持的事件由接口提供,通过实现该接口即可在 MonoBehaviour 上实现这些事件。如果配置了有效的事件系统,则会在正确的时间调用事件。EventSystem处理输入、射线投射和发送事件。
EventSystem 负责处理 Unity 场景中的事件。一个场景应当只包含一个 EventSystem。EventSystem 与许多模块结合使用,大多时候只是将状态和委托功能保存到特定的可重写组件中。
当 EventSystem 启动时,它会搜索附加到同一 GameObject 的任何 BaseInputModule, 并将其添加到内部列表中。在更新时,每个附加模块都会收到一个 UpdateModules 调用,模块可以在其中修改内部状态。所有模块更新完成后,活动模块将执行 Process 调用。此时可以进行自定义模块处理。
继承自:EventSystems.UIBehaviourEventTrigger接收来自 EventSystem 的事件,并为每个事件调用已注册的函数。
EventTrigger 可用来指定您想为每个 EventSystem 事件调用的函数。 您可以将多个函数分配给单个事件,每当 EventTrigger 收到该事件时,都会按照这些函数的提供顺序调用它们。
注意:将此组件附加到游戏对象将导致该对象拦截所有事件,并且所有事件都不会传播到父对象。
您可以通过两种方式拦截事件:一是扩展 EventTrigger,并覆盖您想拦截的事件的函数。
继承自:MonoBehaviourEventTriggerType枚举,TriggerEvent 要拦截的事件的类型。ExecuteEvents可用于向游戏对象发送 IEventSystemHandler 的 Helper 类。MoveDirection这是一个 8 方向移动枚举。
MoveDirection 提供了一种在移动状态之间切换的方式。您必须将这些状态分配给操作,例如,处于 Up 状态时,通过向上矢量移动游戏对象。
与必须始终包含大量矢量和计算相比,具有此类状态更容易识别。相反,您只需在一个部分中定义希望状态执行的操作,并在需要时切换到相应状态即可。RaycasterManager管理射线投射器的类,可以Add、Get、Remove射线投射器。RaycastResult来自 BaseRaycaster 的命中结果。UIBehaviour具有 Unity 生命周期函数的受保护实现的基准行为。
继承自:MonoBehaviour事件系统支持的事件列表1.2 UI
文件结构如下,同样简单介绍一下各个部分及包含的类,命名空间默认是UnityEngine.UI。
UI文件夹的文件结构Animation文件夹中的CoroutineTween.cs,实现了颜色和浮点数的补间效果,命名空间是UnityEngine.UI.CoroutineTween。下面主要描述Core文件夹下的内容。
Culling裁剪文件名描述IClipRegion定义了两个接口
IClipper 可以用于接收裁剪回调(作为画布更新循环过程的一部分)的接口。
IClippable 在处于 [[IClipper] 下时可被裁剪的元素的接口。ClipperRegistry注册表类,用于跟踪场景中存在的所有 IClipper。
用于在 CanvasUpdate 循环过程中剔除可裁剪元素。裁剪操作将在布局之后,但是在 Graphic 更新之前调用。Clipping使用 IClipper 进行裁剪时提供帮助的 Utility 类。
FindCullAndClipWorldRect 查找要用于裁剪的矩形。RectangularVertexClipperRectangularVertexClipper 类只有一个方法
public Rect GetCanvasRect(RectTransform t, Canvas c)
通过调用这个方法,获取在Canvas c下的指定的RectTransform t的Rect区域范围Layout布局文件名描述ILayoutElement定义了五个接口
1. ILayoutElement
如果组件实现 ILayoutElement,则自动布局系统会将它视为布局元素。
布局系统会在查询 minWidth、preferredWidth 和 flexibleWidth 之前调用 CalculateLayoutInputHorizontal。如果在调用 CalculateLayoutInputHorizontal 时缓存这些属性或许可以改善性能,这样无需在每次查询属性时重新计算它们。
布局系统会在查询 minHeight、preferredHeight 和 flexibleHeight 之前调用 CalculateLayoutInputVertical。如果在调用 CalculateLayoutInputVertical 时缓存这些属性或许可以改善性能,这样无需在每次查询属性时重新计算它们。
minWidth、preferredWidth 和 flexibleWidth 属性不应依赖于布局元素的 RectTransform 的任何属性,否则行为会不确定。 minHeight、preferredHeight 和 flexibleHeight 属性可以依赖于 RectTransform 的水平方面,如宽度和位置的 X 分量。 可以始终依赖子布局元素上的 RectTransform 的任何属性。
2. ILayoutController
由控制 RectTransforms 布局的组件实现的基接口。
如果组件驱动自己的 RectTransform,则应实现接口 ILayoutSelfController。 如果组件驱动其子项的 RectTransform,则应实现 ILayoutGroup。
布局系统会首先调用 SetLayoutHorizontal,然后调用 SetLayoutVertical。
在 SetLayoutHorizontal 调用中,对自己或其任何子项的 RectTransform 调用 LayoutUtility.GetMinWidth、LayoutUtility.GetPreferredWidth 和 LayoutUtility.GetFlexibleWidth 是有效的。 在 SetLayoutVertical 调用中,对自己或其任何子项的 RectTransform 调用 LayoutUtility.GetMinHeight、LayoutUtility.GetPreferredHeight 和 LayoutUtility.GetFlexibleHeight 是有效的。
组件可以使用此信息确定将宽度和高度用于其自己的 RectTransform 还是子项的 RectTransform。
3. ILayoutGroup
ILayoutGroup 是应驱动其子项的 RectTransform 的 ILayoutController。
ILayoutGroup 派生自 ILayoutController,需要实现相同的成员。
4. ILayoutSelfController
ILayoutSelfController 是应驱动其自己的 RectTransform 的 ILayoutController。
iLayoutSelfController 派生自基控制器 ILayoutController,控制 RectTransform 的布局。
使用 ILayoutSelfController 可操作 GameObject 自己的 RectTransform 组件(在 Inspector 中附加)。使用 ILayoutGroup 可操作属于 GameObject 的子项的 RectTransform。
调用 ILayoutController.SetLayoutHorizontal 可处理布局的水平部分,调用 ILayoutController.SetLayoutVertical 可处理垂直部分。 可以更改 RectTransform 的高度、宽度、位置和旋转。
5. ILayoutIgnorer
如果 RectTransform 具有实现 ILayoutIgnorer 的组件,则布局系统会将其忽略。
实现 ILayoutIgnorer 的组件可以用于使父布局组组件不考虑组的这一 RectTransform 部分。RectTransform 随后可以手动定位(尽管是布局组的子 GameObject)。LayoutElement将此组件添加至 GameObject,使其进入布局元素或覆盖现有布局元素中的值。
继承自:EventSystems.UIBehaviour
实现接口:ILayoutElement, ILayoutIgnorerLayoutGroup用于布局组的抽象基类。
继承自:EventSystems.UIBehaviour
实现接口:ILayoutController, ILayoutElement, ILayoutGroupLayoutRebuilder封装器类,用于管理 CanvasElement 的布局重新构建。
实现接口:ICanvasElementLayoutUtility布局的实用程序,用于查询布局元素的最小大小、首选大小和灵活大小。HorizontalOrVerticalLayoutGroupHorizontalLayoutGroup 和 VerticalLayoutGroup 的抽象基类。
继承自:UI.LayoutGroupHorizontalLayoutGroup对子布局元素并排布局。
HorizontalLayoutGroup 组件用于对子布局元素并排布局。
继承自:UI.HorizontalOrVerticalLayoutGroupVerticalLayoutGroup将子布局元素依次向下布局。
VerticalLayoutGroup 组件用于将子布局元素依次向下布局。
继承自:UI.HorizontalOrVerticalLayoutGroup。GridLayoutGroup在网格中对子布局元素进行布局。
GridLayoutGroup 组件用于均匀网格(所有单元格都大小相同)中对子布局元素进行布局。单元格之间的大小和间距由 GridLayoutGroup 本身控制。子项对其大小没有影响。
定义了Axis(可以处于水平或垂直方向的轴)、Constraint(列数或行数方面的约束)、Corner(矩形中的四个角之一)三个枚举。
继承自:UI.LayoutGroupContentSizeFitter调整 RectTransform 大小以适应其内容大小。
ContentSizeFitter 可以用于具有一个或多个 ILayoutElement 组件(如 Text、Image、HorizontalLayoutGroup、VerticalLayoutGroup 和 GridLayoutGroup)的 GameObject。
定义了FitMode(要使用的大小适应模式)一个枚举。
继承自:EventSystems.UIBehaviour
实现接口:ILayoutController, ILayoutSelfControllerAspectRatioFitter调整 RectTransform 大小以适应指定宽高比。
定义了AspectMode(指定要用于强制实施宽高比的模式)一个枚举。
继承自:EventSystems.UIBehaviour
实现接口:ILayoutController, ILayoutSelfControllerCanvasScalerCanvas Scaler 组件用于控制画布中 UI 元素的整体缩放和像素密度。此缩放会影响画布下的所有内容,包括字体大小和图像边框。
对于设置为“Screen Space – Overlay”或“Screen Space – Camera”的画布,画布缩放器“UI Scale Mode”可以设置为“Constant Pixel Size”、“Scale With Screen Size”或“Constant Physical Size”。
使用“Constant Pixel Size”模式时,可在屏幕上按像素指定 UI 元素的位置和大小。这也是画布在未附加任何画布缩放器时的默认功能。但是,借助画布缩放器中的“Scale Factor”设置,可以向画布中的所有 UI 元素应用常量缩放。
使用“Scale With Screen Size”模式时,可以根据指定参考分辨率的像素来指定位置和大小。如果当前屏幕分辨率大于参考分辨率,则画布会保持只具有参考分辨率的分辨率,但是会放大以便适应屏幕。如果当前屏幕分辨率小于参考分辨率,则画布会相应缩小以适应屏幕。如果当前屏幕分辨率的宽高比与参考分辨率不同,则单独缩放每个轴以适应屏幕会形成非一致缩放,通常不希望发生这种情况。相反,ReferenceResolution 组件会使画布分辨率偏离参考分辨率,以便遵循屏幕的宽高比。可以使用 screenMatchMode 设置控制此偏离的行为方式。
使用“Constant Physical Size”模式时,可按物理单位(如毫米、点或派卡)指定 UI 元素的位置和大小。此模式依赖于正确报告其屏幕 DPI 的设备。对于不报告 DPI 的设备,可以指定回退 DPI。
对于设置为“World Space”的画布,画布缩放器组件可以用于控制画布中 UI 元素的像素密度。
定义了ScaleMode(确定画布中的 UI 元素的缩放方式)、ScreenMatchMode(以宽度、高度或二者的某种平均值作为参考来缩放画布区域)、Unit(用于指定物理单位的设置)三个枚举。
继承自:EventSystems.UIBehaviourMaterialModifiers材质修改器IMaterialModifier里定义了一个同名接口。此接口允许对用于渲染 Graphic 的 Material 在被传递给 CanvasRenderer 之前进行修改。在 Graphic 设置了材质的情况下,该材质将(按顺序)传递给 GameObject 上实现 IMaterialModifier 的任何组件。此组件可以修改用于渲染的材质。
SpecializedCollections专门的容器IndexedSet 是自定义的容器,结合List和Dictionary实现,特点如下。
注释优点:元素唯一,快速移除(移除时,交换对应item和末尾item,然后删除末尾item,所以就顺序会被打乱),快速插入元素到最后,顺序存取。
缺点:更多的内存,顺序不固定,对序列化不友好。
Utility实用程序文件名描述ObjectPool泛型的对象池,用栈作为存储容器,可以取出和放回对象。ListPool以泛型列表作为对象的对象池。ReflectionMethodsCache用反射的方式缓存的一些方法。VertexHelper可辅助为 UI 生成网格的 Utility 类。
此类实现 IDisposable,用以辅助内存管理。VertexModifiers顶点修改器文件名描述IMeshModifier定义了两个接口
1. IVertexModifier
此接口允许对 Graphic 中的顶点在被传递给 CanvasRenderer 之前进行修改。
当 Graphic 生成顶点列表时,这些顶点将(按顺序)传递给 GameObject 上实现 IVertexModifier 的任何组件。此组件可以修改该顶点列表。
已被弃用,功能转移到IMeshModifier中
2. IMeshModifier
此接口允许对 Graphic 中的顶点在被传递给 CanvasRenderer 之前进行修改。
当 Graphic 生成顶点列表时,这些顶点将(按顺序)传递给 GameObject 上实现 IMeshModifier 的任何组件。此组件可以修改给定的网格。BaseMeshEffect定义了两个抽象类
1. BaseVertexEffect
修改所生成顶点缓冲区的特效的基类。
已被弃用,功能转移到BaseMeshEffect中
2. BaseMeshEffect
修改所生成网格的特效的基类。
继承自:EventSystems.UIBehaviour
实现接口:IMeshModifierShadow使用 IVertexModifier向图形中添加轮廓。Outline使用 IVertexModifier向图形中添加轮廓。
修改生成的顶点,以向同级 Graphic 中添加轮廓。
继承自:UI.ShadowPositionAsUV1一个 IVertexModifier,用于在所生成顶点的 UV1 中设置原始顶点位置。
继承自:UI.BaseMeshEffect其他组件及组件相关
文件名描述Graphic所有视觉 UI 组件的基类。
创建视觉 UI 组件时,应从此类继承。
继承自:EventSystems.UIBehaviour
实现接口:ICanvasElementMaskableGraphic能够被遮罩的 Graphic。
继承自:UI.Graphic
实现接口:IClippable, IMaskable, IMaterialModifierSelectable简单的可选择对象 – 可从中派生,以创建可选择控件。
继承自:EventSystems.UIBehaviour
实现接口:IDeselectHandler, IEventSystemHandler, IMoveHandler, IPointerDownHandler, IPointerEnterHandler, IPointerExitHandler, IPointerUpHandler, ISelectHandlerButton标准按钮,可通过单击来触发事件。
继承自:UI.Selectable
实现接口:IEventSystemHandler, IPointerClickHandler, ISubmitHandler
定义了一个UnityEvent
1. ButtonClickedEvent
按钮单击事件的函数定义。Dropdown标准下拉列表,在单击时提供选项列表,可以选择其中一个选项。
下拉列表组件是 Selectable。选择某个选项时,控件的标签和/或图像会更改,以显示所选选项。
当下拉列表事件发生时,会向 onValueChanged 的所有注册监听器发送一个回调。
继承自:UI.Selectable
实现接口:ICancelHandler, IEventSystemHandler, IPointerClickHandler, ISubmitHandler
定义了三个UnityEvent和类
1. DropdownEvent
在下拉列表当前选项更改时使用的 UnityEvent 回调。
2. OptionData
用于存储下拉列表中单个选项的文本和/或图像的类。
3. OptionDataList
在内部用于存储下拉列表的选项列表的类。
此类的用法未在运行时 API 中公开。它只与绘制选项列表的 PropertyDrawer 相关。Image显示 UI 系统的 Sprite。
定义了FillMethod(Image 要使用的填充方法)、Origin180(Image.FillMethod.Radial180 的原点)、Origin360(用于 Image.FillMethod.Radial360 的弧形的一个点)、Origin90(Image.FillMethod.Radial90 的原点)、OriginHorizontal(Image.FillMethod.Horizontal 的原点)、OriginVertical(Image.FillMethod.Vertical 的原点)、Type(图像类型,控制图像的显示方式)七个枚举。
继承自:UI.MaskableGraphic
实现接口:ICanvasRaycastFilter, ILayoutElement, ISerializationCallbackReceiverInputField将简单的标签转换为可交互的输入字段。
定义了两个UnityEvent
1. OnChangeEvent
每当 Inputfield 更新时发送的回调。
2. SubmitEvent
以 inputfield 作为参数的 Unity 事件。
定义了CharacterValidation(允许添加到字符串的字符类型)、ContentType(指定输入文本内容的类型)、InputType(输入字段期望的数据类型)、LineType(用于描述 InputField 的行为)四个枚举。
继承自:UI.Selectable
实现接口:IBeginDragHandler, ICanvasElement, IDragHandler, IEndDragHandler, IEventSystemHandler, ILayoutElement, IPointerClickHandler, ISubmitHandler, IUpdateSelectedHandlerMask用于遮罩子元素的组件。
使用此元素后,对于同级 Graphic 向模板缓冲区写入 0 的位置,已启用遮罩的任何子元素都将进行遮罩。
继承自:EventSystems.UIBehaviour
实现接口:ICanvasRaycastFilter, IMaterialModifierRawImage显示 UI 系统的 Texture2D。
谨记,这会使用每个存在的 RawImage 创建一个额外的绘制调用,因此最好只将其用于背景或临时可见的图形。
继承自:UI.MaskableGraphicRectMask2D2D 矩形遮罩,可对遮罩外的区域进行裁剪/遮罩。
RectMask2D 的行为方式与 Mask 组件相似。区别在于它有一些限制。
RectMask2D: 仅适用于 2D 平面 要求遮罩中的元素共面。 不需要模板缓冲区/额外的绘制调用 需要较少的绘制调用 *剔除在遮罩区域之外的元素。
继承自:EventSystems.UIBehaviour
实现接口:ICanvasRaycastFilter, IClipperScrollbar具有大小可变控制柄的标准滚动条,可在 0 到 1 之间拖动该滚动条。
滑动条组件是一个 Selectable,它控制一个控制柄,该控制柄遵循当前的 value 并根据 size 属性确定大小。
控制柄 RectTransform 的锚点是由 Scrollbar 驱动的。可以使用 Scrollbar 将控制柄定向到 GameObject 的子级,也可以在中间放置中间 RectTransform 以进行额外控制。
当滚动条的值发生更改时,会向 onValueChanged 的所有注册的监听器发送一个回调。
定义了一个UnityEvent
1. ScrollEvent
在滚动条滚动时使用的 UnityEvent 回调。
定义了Direction(用于指示四个方向之一的设置)一个枚举。
继承自:UI.Selectable
实现接口:IBeginDragHandler, ICanvasElement, IDragHandler, IEventSystemHandler, IInitializePotentialDragHandlerScrollRect用于使子 RectTransform 滚动的组件。
ScrollRect 将不自行执行任何裁剪。在与 Mask 组件组合后,它可以变为滚动视图。
定义了一个UnityEvent
1. ScrollRectEvent
ScrollRect 使用的事件类型。
定义了MovementType(表示在内容移至其容器范围之外时使用的行为)和ScrollbarVisibility(表示用于滚动条可见性的行为)两个枚举。
继承自:EventSystems.UIBehaviour
实现接口:IBeginDragHandler, ICanvasElement, IDragHandler, IEndDragHandler, IEventSystemHandler, IInitializePotentialDragHandler, ILayoutController, ILayoutElement, ILayoutGroup, IScrollHandlerSlider标准滑动条,可在最小和最大值之间移动。
滑动条组件是一个 Selectable,它对填充、手柄或两者进行控制。填充(使用时)从最小值跨越到当前值,而手柄(使用时)遵循当前值。
填充和手柄 RectTransform 的锚点是由 Slider 驱动的。可以使用 Slider 将填充和手柄定向到 GameObject 的子级,也可以在中间放置中间 RectTransform 以进行额外控制。
当滑动条值发生更改时,会向 Slider.onValueChanged 的所有注册监听器发送一个回调。
定义了一个UnityEvent
1. SliderEvent
Slider 使用的事件类型。
定义了Direction(用于指示四个方向之一的设置)一个枚举。
继承自:UI.Selectable
实现接口:ICanvasElement, IDragHandler, IEventSystemHandler, IInitializePotentialDragHandlerText用于向屏幕绘制字体数据的默认 Graphic。
继承自:UI.MaskableGraphic
实现接口:ILayoutElementToggle具有开/关状态的标准开关。
Toggle 组件是 Selectable,它控制显示开/关状态的子图形。
当开关事件发生时,会向 Toggle.onValueChanged 的所有注册监听器发送一个回调。
定义了一个UnityEvent
1. ToggleEvent
在切换开关时使用的 UnityEvent 回调。
定义了ToggleTransition(显示在激活或停用开关时使用的设置)一个枚举。
继承自:UI.Selectable
实现接口:ICanvasElement, IEventSystemHandler, IPointerClickHandler, ISubmitHandlerToggleGroup一个代表一组 Toggle 的组件。
使用组时,从 Toggle 中引用该组。在同一时间只能有一个组成员处于活动状态。
继承自:EventSystems.UIBehaviour 其他
文件名描述AnimationTriggers用于存储 Selectable 上的动画过渡状态的结构。ColorBlock用于存储 Selectable 上的颜色过渡状态的结构。CanvasUpdateRegistryCanvasElements 可以在其中注册自己以便重新构建的位置。
定义了一个接口
1. ICanvasElement
这是可以位于画布上的元素。
定义了CanvasUpdate(在 Canvas 更新时调用的“update”的值)一个枚举。DefaultControls用于创建内置 UI 控件的默认实现的 Utility 类。
通过 UI 系统使用 UI 控件的建议工作流程是为每种类型的控件都创建预制件,并且在需要时实例化这些预制件。这样,对预制件的更改将对所有使用的实例立即生效。
但是在某些情况下,可能需要完全通过代码创建 UI 控件。DefaultControls 类提供用于创建每个内置 UI 控件的方法。生成的对象与使用编辑器 GameObject 菜单中对应 UI 菜单条目获取的对象相同。
这种方法的一种示例用法是为模仿 Unity 内置 UI 控件的自定义新 UI 控件创建菜单项。某些此类 UI 控件可能包含其他 UI 控件。例如,一个滚动视图包含滚动条。通过使用 DefaultControls 方法创建这些部件,可确保它们在外观和设置方面与 Unity 内置菜单项提供的部件相同。
请注意,此类中的方法所创建的 UI 控件的设置细节可能会随 UI 系统后续修订而变化。因此,它们不保证 100% 向后兼容。建议不要依赖于这些方法所创建的 GameObject 的特定层级视图,将代码限制为仅与每个方法所创建的根 GameObject 形成接口。
定义了一个结构体
1. Resources
对象,用于传递要用于默认控件的资源。FontData用于存储 Text 生成设置的结构。
实现接口:ISerializationCallbackReceiverFontUpdateTracker用于帮助进行 Text 更新的 Utility 类。
当 Unity 重新构建字体图集时,会向字体发送回调。使用此类可以将文本注册为需要重新构建(如果更新字体图集)。GraphicRebuildTracker用于跟踪所有图形的 EditorOnly 类。
在将源资源重新导入编辑器时用于确保 Graphics 按预期进行更新。GraphicRegistry将 Graphic 映射到它所属的画布的注册表。IGraphicEnabledDisabled不再支持IMask不再支持IMaskable接口,此元素可以被遮罩。MaskUtilities与遮罩相关的 Utility 类。
此类提供特定于遮罩的实用函数。Misc提供Destroy和DestroyImmediate UnityEngine.Object的函数的工具类Navigation用于存储与导航有关的详细信息的结构。
定义了Mode(导航模式)一个枚举。SetPropertyUtility设置属性的Utility类,用来设置颜色、结构体和类。SpriteState用于存储 Selectable 中的精灵过渡状态的结构。StencilMaterial动态材质类,可以在每个图形的基础上动态创建自定义材质,并且能够正确地清理它们。