27.UGUI基础知识总结

  1. 27.总结
    1. 27.1 知识点
      1. 学习的主要内容
      2. 必须达到的水平
      3. 学会举一反三
      4. 一些和UI相关的知识
    2. 27.2 核心要点速览
      1. Canvas画布组件
      2. CanvasScaler画布缩放器组件
      3. GraphicRaycaster 图形射线投射器
      4. EventSystem 组件
      5. Standalone Input Module 组件
      6. RectTransform矩形变换组件
      7. Image图片控件
        1. Image 图片组件参数
        2. Image 图片代码控制
      8. Text
        1. Text 文本组件参数
        2. 富文本使用
        3. 边缘线和阴影
        4. Text 文本代码控制
      9. RawImage
        1. RawImage 原始图像组件参数
        2. RawImage 原始图像代码控制
      10. Toggle
        1. Toggle 开关组件参数
        2. Toggle 开关代码控制
        3. Toggle 监听事件的两种方式
      11. InputField
        1. InputField文本输入组件参数
        2. InputField监听事件的两种方式
      12. Slider
        1. Slider 滑动条组件参数
        2. Slider 监听事件的两种方式
      13. ScrollBar
        1. ScrollBar 滚动条组件参数
        2. ScrollBar 滚动条控件代码控制
        3. ScrollBar 监听事件的两种方式
      14. ScrollView滚动视图控件
        1. ScrollRect 滚动视图组件参数
        2. ScrollRect 滚动视图代码控制
        3. ScrollView 监听事件的两种方式
      15. Dropdown下拉列表控件
        1. DropDown 下拉列表组件参数
        2. DropDown 下拉列表代码控制
        3. DropDown 监听事件的两种方式
      16. 图集
        1. 打图集的原因
        2. Unity 中自带打图集功能的开启方式
        3. 代码加载图集的方法
      17. UI事件监听接口
        1. UGUI 事件接口列表
          1. 常用事件接口
          2. 不常用事件接口
          3. 导航相关接口
        2. PointerEventData 指针目标数据类参数详解
      18. UI事件监听接口(EventTrigger)
        1. 使用事件触发器的方法
      19. 屏幕坐标转UI相对坐标
      20. Mask遮罩
      21. Mask遮罩模型、粒子特效显示在UI之前
      22. 异形按钮
      23. 自动布局组件
        1. 布局元素的布局属性
        2. 常见自动布局组件
          1. HorizontalVerticalLayoutGroup 水平垂直布局组件
          2. LayoutElement 布局元素组件
          3. GridLayoutGroup 网格布局组件
          4. ContentSizeFitter 内容大小适配器
          5. AspectRatioFitter 宽高比适配器
      24. CanvasGroup画布组

27.总结


27.1 知识点

学习的主要内容

必须达到的水平

学会举一反三

一些和UI相关的知识


27.2 核心要点速览

Canvas画布组件

内容 详情
Canvas 组件作用 用于创建和管理 UI,场景中可存在多个 Canvas 对象
渲染方式 - Screen Space - Overlay 覆盖模式,UI 始终显示在场景内容前方,会挡住场景模型。
参数:
- Pixel Perfect:是否开启无锯齿精确渲染(性能换效果)
- SortOrder:排序层编号,控制多个 Canvas 渲染先后顺序,层级高的先渲染
- TargetDisplay:目标显示设备
- Additional Shader Channels:其他着色器通道,决定着色器可读取的数据
渲染方式 - Screen Space - Camera 摄像机模式,3D 物体可显示在 UI 之前。
参数:
- RenderCamera:用于渲染 UI 的摄像机,不推荐设为主摄像机,建议创建只渲染 UI 层的摄像机并关联,设置模式为仅深度,调整深度比主摄像机高,想让模型在 UI 前可创建为 UI 子物体
- Plane Distance:UI 平面在摄像机前方的距离,类似整体 Z 轴
- Sorting Layer:所在排序层
- Order in Layer:排序层的序号
渲染方式 - World Space 3D 模式,可将 UI 对象像 3D 物体一样处理,常用于 VR 或 AR。一般关联主摄像机,重置 UI 比例和长宽后,标准单位的 UI 图片大小和立方体一样。
参数:
- Event Camera:用于处理 UI 事件的摄像机,不设置则不能正常注册 UI 事件

CanvasScaler画布缩放器组件

组件作用:用于对Canvas中的UI元素进行适配,以适应不同的屏幕分辨率和设备。
三种适配模式:

  • 恒定像素模式(Constant Pixel Size):通过Scale Factor(缩放系数)和Reference Pixels Per Unit(单位参考像素)来全局缩放UI元素,单位参考像素与图片的Pixels Per Unit共同影响UI元素最终显示尺寸。
  • 缩放模式(Scale With Screen Size):最常用的模式,基于Reference Resolution(参考分辨率)进行自适应计算。当屏幕分辨率宽高比不适应参考分辨率时,通过Screen Match Mode(屏幕匹配模式)来处理,有Expand(拓展模式,保留UI,可能有黑边)、Shrink(最大程度放大UI,可能裁剪)、Match Width Or Height(宽高匹配模式,UI大小不变,可能裁剪或有黑边)三种匹配方式。
  • 恒定物理模式(Constant Physical Size):涉及DPI(每英寸点数)、Physical Unit(物理单位)、Fallback Screen DPI(备用DPI)、Default Sprite DPI(默认图片DPI)等参数,与恒定像素模式的区别在于其基于物理单位和DPI来处理UI元素的显示。
  • 3D模式(World模式):有Dynamic Pixels Per Unit(UI中动态创建位图的单位像素数)和Reference Pixels Per Unit(单位参考像素,默认一个单位为100像素)等参数,用于处理3D场景中的UI相关设置。

GraphicRaycaster 图形射线投射器

主要作用:GraphicRaycaster 用于处理 UI 元素的射线检测,确定鼠标点击或触摸事件是否发生在 UI 元素上。

参数说明

参数 说明
Ignore Reversed Graphics 是否忽略反转图形。若勾选,当对象旋转了 x 轴或 y 轴时,点击该对象无效;若不勾选,点击始终有效。
Blocking Objects 射线被哪些类型的碰撞器阻挡,但在覆盖渲染模式下此设置无效。可选择能阻挡射线的碰撞器类型。
Blocking Mask 射线被哪些层级的碰撞器阻挡,同样在覆盖渲染模式下无效。需配合阻塞对象使用,只有对象处于勾选的层级,并且符合阻塞对象的类型,才能阻挡射线。

覆盖模式特性:在覆盖模式下,由于 UI 始终显示在最前面,Blocking Objects 和 Blocking Mask 参数无效。

EventSystem 组件

参数 说明
First Selected 可设置游戏开始时默认选中的游戏对象,关联对象后,运行游戏该对象会被默认选中。
Send Navigation Events 决定是否允许导航事件(如移动、按下、取消等)。勾选后,可通过 wasd 或上下左右键切换选择的对象。
Drag Threshold 定义了拖拽操作的阈值,即鼠标移动多少像素后会进入拖拽状态。

Standalone Input Module 组件

参数 说明
Horizontal Axis 水平轴按钮对应的热键名,该名字需对应 Input 管理器中的设置。
Vertical Axis 垂直轴按钮对应的热键名,对应 Input 管理器中的设置。
Submit Button 提交(确定)按钮对应的热键名,对应 Input 管理器中的设置。
Cancel Button 取消按钮对应的热键名,对应 Input 管理器中的设置。
Input Actions Per Second 每秒允许键盘或控制器输入的数量。
Repeat Delay 每秒输入操作重复率生效前的延迟时间。
ForceModule Active 决定是否强制该模块处于激活状态。一般情况下,不会对该组件的参数进行修改。

RectTransform矩形变换组件

参数 说明
Pivot(轴心点) 取值范围为 0 - 1,以左下角为原点 (0, 0),右上角为 (1, 1)。
是旋转的中心点,与锚点共同用于位置计算。
影响宽高扩大或缩小时的伸缩方向。
Anchors(相对父矩形锚点) Min 是矩形锚点范围 X 和 Y 的最小值,Max 是最大值,取值范围 0 - 1。
当 Min 和 Max 对应的 xy 值完全贴合时,锚点以点的形式存在,根据锚点位置建立坐标系,结合轴心点计算 UI 对象位置。
当 Min 和 Max 对应的 xy 值分开时,根据锚点的四条边和 UI 对象的四条边计算位置,适用于背景图或需要子对象随父对象变化而变化的情况。
Pos(X, Y, Z) 轴心点(中心点)相对锚点的位置。
Width/Height 矩形的宽高。
Left/Top/Right/Bottom 矩形边缘相对于锚点的位置,当锚点分离时出现。
Rotation 围绕轴心点旋转的角度。
Scale 缩放大小。
Blueprint Mode(蓝图模式) 启用后,编辑旋转和缩放不会影响矩形,只会影响显示内容,一般不勾选。
Raw Edit Mode(原始编辑模式) 启用后,改变轴心和锚点值不会改变矩形位置,即改变轴心位置,图片显示位置改变,但 UI 对象的 Pos 位置数值不变。
不启用时,改变轴心位置,UI 对象的 Pos 位置也会改变。

Image图片控件

Image 图片组件参数

参数 说明
Source Image(源图形) 图片来源,图片类型必须是“精灵”类型。
Color(颜色) 图像的颜色,会在原图基础上叠加。
Material(材质) 图像的材质,一般使用 UI 的默认材质,不做修改。
Raycast Target(射线目标) 是否作为射线检测的目标,不勾选则不会响应射线检测,可穿透当前控件点击到后面的控件。
Maskable 是否能被遮罩,后续结合遮罩相关知识点讲解。
Image Type(图片类型) Simple(普通模式):均匀缩放整个图片。
Sliced(切片模式):9 宫格拉伸,只拉伸中央十字区域,需打开精灵编辑开启设置九宫格;Pixels Per Unit Multiplier 一般不修改;Fill Center 不勾选图片会中间空心。
Tiled(平铺模式):重复平铺中央部分。
Filled(填充模式):可用于做血条、cd 进度条等,有 Fill Method(填充方式)、Fill Origin(填充原点)、Fill Amount(填充量)、Clockwise(顺时针方向)等参数。
Use Sprite Mesh(使用精灵网格) 勾选后 Unity 会帮我们生成图片网格。
Preserve Aspect(保持长宽比) 确保图像保持其现有尺寸。
Set Native Size(设置原生大小) 设置为图片资源的原始大小。

Image 图片代码控制

操作 代码示例 说明
获取 Image 组件 Image image = this.GetComponent<Image>(); 获取当前脚本所附加的 GameObject 上的 Image 组件。
设置显示图像 image.sprite = Resources.Load<Sprite>("ui_TY_fanhui_01"); 从资源文件夹中加载名为 “ui_TY_fanhui_01” 的 Sprite,并将其设置为 Image 的显示图像。
设置宽高 (transform as RectTransform).sizeDelta = new Vector2(200, 200); 将当前 GameObject 的 Transform 转换为 RectTransform,然后修改其尺寸为宽度 200、高度 200。
设置是否进行射线检测 image.raycastTarget = false; 禁用该 Image 组件的射线检测,使其不响应用户的点击事件。
设置颜色 image.color = Color.red; 将该 Image 组件的颜色设置为红色。

Text

Text 文本组件参数

参数 说明
Text(文本) 文本显示内容。
Font(字体) 文本所使用的字体。
FontStyle(字体样式) 包括 Normal(普通)、Bold(加粗)、Italic(斜体)、Bold And Italic(加粗 + 斜体)。
Font Size(字体大小) 文本字体的大小。
Line Spacing(行间距) 行之间的垂直间距。
Rich Text(富文本) 是否开启富文本功能。
Alignment(对齐方式) 文本的对齐方式。
Align By Geometry(几何对齐) 使用字形集合形状范围进行水平对齐,而非字形指标,一般不勾选。
Horizontal Overflow(水平溢出) 处理文本太宽无法放入矩形范围的方式,有 Wrap(包裹模式,自动换行)和 Overflow(溢出模式,可溢出矩形框)。
Vertical Overflow(垂直溢出) 处理文本太高无法放入矩形范围的方式,有 Truncate(截断模式,超出部分裁剪)和 Overflow(溢出模式,可溢出矩形框)。
Best Fit(最佳适应) 忽略字体大小,自动调整使内容完全显示在矩形框中,可设置 MinSize(最小字体大小)和 MaxSize(最大字体大小)。

富文本使用

需开启富文本选项才能生效,示例如下:

  • 加粗:<b>文本内容</b>
  • 斜体:<i>文本内容</i>
  • 大小:<size=50>文本内容</size>
  • 颜色:<color=#ff0000ff>文本内容</color><color=red>文本内容</color>

边缘线和阴影

若要添加边缘线和阴影效果,需自行添加对应的组件,如 Outline(边缘线组件)和 Shadow(阴影组件)。

Text 文本代码控制

操作 代码示例 说明
获取 Text 组件 Text text = this.GetComponent<Text>(); 获取当前脚本所附加的 GameObject 上的 Text 组件。
设置文本显示内容 text.text = "哈哈哈哈哈"; 通过 text.text 变量设置文本显示内容。

RawImage

RawImage 原始图像组件参数

参数 说明
Texture(图像纹理) 可以拖拽任何类型的图进行关联。
UV Rect(UV 矩形) 表示图像在 UI 矩形内的偏移和大小。位置偏移 X 和 Y 取值范围是 0 - 1,大小偏移 W 和 H 取值范围也是 0 - 1。改变这些值,图像边缘会进行拉伸来填充 UV 矩形周围的空间,一般情况下不会改变此参数。

RawImage 原始图像代码控制

操作 代码示例 说明
获取 RawImage 组件 RawImage rawImage = this.GetComponent<RawImage>(); 获取当前脚本所附加的 GameObject 上的 RawImage 组件。
设置纹理 rawImage.texture = Resources.Load<Texture>("ui_TY_lvseshuzi_08"); 从资源文件夹中加载名为 “ui_TY_lvseshuzi_08” 的 Texture,并将其设置为 RawImage 组件的显示纹理。
设置 UV 矩形 rawImage.uvRect = new Rect(0, 0, 1, 1); 设置 RawImage 组件的纹理坐标矩形,创建一个左下角坐标为 (0, 0),宽度和高度都为 1 的 Rect 对象。

Toggle

Toggle 开关组件参数

参数 说明
Interactable 决定是否接受输入。
Transition 响应用户输入的过渡效果。
Navigation 导航模式,设置 UI 元素在播放模式中控制器导航的方式。
IsOn 表示当前是否处于打开状态。
Toggle Transition 开关值变化时的过渡方式,有 None(无过渡,直接显示隐藏)和 Fade(淡入淡出)两种。
Graphic 用于表示选中状态的图片,默认关联创建 Toggle 时自动生成的勾形状选中图对象。
Group 关联的 ToggleGroup 单选框分组组件。创建一个空物体添加 ToggleGroup 组件作为管理组对象,将需管理的 Toggle 放在其下,并将每个 Toggle 的 Group 关联该 ToggleGroup 对象可实现单选框功能。Allow Switch Off 属性决定是否允许不选中任何一个单选框。
OnValueChanged 开关状态变化时执行的函数列表。

Toggle 开关代码控制

操作 代码示例 说明
获取 Toggle 组件 Toggle toggle = this.GetComponent<Toggle>(); 获取当前脚本所附加 GameObject 上的 Toggle 组件。
设置 Toggle 状态 toggle.isOn = true; 将 Toggle 状态设置为打开。
获取 ToggleGroup 组件 ToggleGroup toggleGroup = this.GetComponent<ToggleGroup>(); 获取当前脚本所附加 GameObject 上的 ToggleGroup 组件。
设置 ToggleGroup 属性 toggleGroup.allowSwitchOff = false; 禁止取消选中所有 Toggle。
获取 ToggleGroup 中选中的 Toggle foreach (Toggle item in toggleGroup.ActiveToggles()) { print(item.name + " " + item.isOn); } 遍历 ToggleGroup 中处于选中状态的 Toggle 并打印其名称和状态。

Toggle 监听事件的两种方式

拖脚本添加事件监听
点击 Button 组件下 OnClick 下面的添加按钮,选择关联对象及该对象上脚本的公共方法进行点击事件监听,可关联多个函数。示例方法如下:

public void ChangValue(bool isOn)
{
    print("状态改变" + isOn);
}

代码添加事件监听
使用 toggle.onValueChanged.AddListener 添加值改变事件监听。示例代码如下:

private void ChangeValue2(bool v)
{
    print("代码监听 状态改变" + v);
}

// 监听 toggle 的值改变事件,当值改变时调用 ChangeValue2 方法
toggle.onValueChanged.AddListener(ChangeValue2);

// 使用 lambda 表达式定义一个匿名方法并监听 toggle 的值改变事件
toggle.onValueChanged.AddListener((b) =>
{
    print("代码监听lambda表达式 状态改变" + b);
});

InputField

InputField文本输入组件参数

参数名称 描述
Interactable 是否接受输入
Transition 响应用户输入的过渡效果
Navigation 导航模式,设置UI元素在播放模式中控制器导航的方式
TextComponent 用于关联显示输入内容的文本组件
Text 输入框的起始默认值,也是当前文本输入的内容
Character Limit 可以输入字符长度的最大值
Content Type 输入的字符类型限制,包括Standard(标准模式)、Autocorrected(自动更正模式)、Integer Number(整数模式)、Decimal Number(十进制数模式)、Alphanumeric(字母数字模式)、Name(名字模式)、Email Address(邮箱地址模式)、Password(密码模式)、Pin(别针模式)、Custom(自定义模式)等
Line Type 定义文本格式,有Single Line(单行显示)、Multi Line Submit(多行提交)、Multi Line NewLine(多行换行)三种模式
Placeholder 关联用于显示初始内容文本控件
Caret Blink Rate 光标闪烁速率
Caret Width 光标宽度
Custom Caret Color 自定义光标颜色
Selection Color 批量选中的背景颜色
Hide Mobile Input 隐藏移动设备屏幕上键盘,仅适用于iOS
Read Only 设置为只读,用户无法修改,输入无作用
OnValueChanged 内容改变时执行的函数列表
OnEndEdit 结束输入时执行的函数列表

InputField监听事件的两种方式

拖脚本监听事件
函数需有一个string类型的参数,选择动态的函数。对文本输入框的任何输入都会调用值改变时的事件,焦点不在文本输入框上就会调用结束编辑时的事件。示例代码如下:

public void ChangeInput(string str)
{
    print("改变的输入内容" + str);
}

public void EndInput(string str)
{
    print("结束输入时内容" + str);
}

代码添加监听事件
通过InputField.onValueChanged.AddListener添加值改变事件监听,InputField.onEndEdit.AddListener添加结束编辑事件监听。示例代码如下:

// 给inputField的onValueChanged事件添加监听器,当输入框文本内容改变时触发
inputField.onValueChanged.AddListener((str) =>
{
    print("代码监听 改变" + str);
});

// 给inputField的onEndEdit事件添加监听器,当输入框结束编辑时触发
inputField.onEndEdit.AddListener((str) =>
{
    print("代码监听 结束输入" + str);
});

Slider

Slider 滑动条组件参数

参数名称 描述
FillRect 关联的用于填充的进度条图形对象
Handle Rect 关联的用于滑动的滑动块图形对象
Direction 滑动条值增加的方向,包含:
- Left To Right:从左到右
- Right To Left:从右到左
- Bottom To Top:从下到上
- Top To Bottom:从上到下
Min Value 和 Max Value 最小值和最大值,滑动滚动条时值在最小到最大之间变化(左右、上下极值)
Whole Numbers 是否约束为整数值变化
Value 当前滑动条代表的数值
OnValueChanged 滑动条值改变时执行的函数列表

Slider 监听事件的两种方式

拖脚本监听事件
关联的函数要有一个 float 类型的参数,要选择动态的函数。若选择静态,值改变时会只打印右边输入框的值。示例函数如下:

public void ChangeValue(float v)
{
    print(v);
}

代码添加监听事件

slider.onValueChanged.AddListener(ChangeValue);
slider.onValueChanged.AddListener((v) => { print("代码添加的监听" + v); });

ScrollBar

ScrollBar 滚动条组件参数

参数名称 描述
Handle Rect 关联滚动块图形对象。
Direction 滑动条值增加的方向,包括:
Left To Right:从左到右
Right To Left:从右到左
Bottom To Top:从下到上
Top To Bottom:从上到下
Value 滚动条初始位置值,范围是 0 到 1。
Size 滚动块在条中的比例大小,范围是 0 到 1,为 1 时填满,代表不能拖动。
Number Of Steps 允许可以滚动的次数(不同滚动位置的数量),即可以一格一格变化时分成的格数。
OnValueChanged 滚动条值改变时执行的函数列表。

ScrollBar 滚动条控件代码控制

  1. 通过 GetComponent() 得到 Scrollbar 组件,如 Scrollbar scrollbar = this.GetComponent<Scrollbar>();
  2. 使用 Scrollbar.value 获取滚动条当前值,例如 print(scrollbar.value);
  3. 使用 Scrollbar.size 获取滚动条大小,例如 print(scrollbar.size);

ScrollBar 监听事件的两种方式

拖脚本监听事件
函数需要一个 float 参数,代表滚动条的值。示例代码如下:

public void ChangeValue(float v)
{
    print(v);
}

代码添加监听事件
通过 scrollbar.onValueChanged.AddListener 添加滑动条值变化的监听。示例代码如下:

// 注册监听滑动条值变化的事件,当滑动条的值发生变化时,执行下面的函数
scrollbar.onValueChanged.AddListener((v) => {
    print("代码监听的函数" + v);
});

ScrollView滚动视图控件

ScrollRect 滚动视图组件参数

参数名称 描述
Content 控制滚动视图显示内容的父对象,其尺寸决定滚动视图的拖动范围,默认关联 Viewport 的子对象 Content
Horizontal 启用水平滚动
Vertical 启用垂直滚动
Movement Type 滚动视图元素的运动类型,控制拖动时的反馈效果:
- Unrestricted:不受限制,随意拖动
- Elastic:回弹效果,滚出边缘后会弹回边界,Elasticity 为回弹系数,值越大回弹越慢
- Clamped:夹紧效果,始终限制在范围内,无回弹效果
Inertia 移动惯性,开启后松开鼠标有一定移动惯性
Deceleration Rate 减速率,范围 0 - 1,0 表示无惯性,1 表示不会停止
Scroll Sensitivity 滚轮和触摸板的滚动事件敏感性,增大值可加快滚轮滚动速度
Viewport 关联滚动视图内容视口对象,决定可视范围
Horizontal Scrollbar 关联水平滚动条
Visibility 设置滚动条的可视性模式:
- Permanent:一直显示滚动条
- Auto Hide:自动隐藏滚动条,不自动扩展视口范围
- Auto Hide And Expand Viewport:自动隐藏滚动条,并自动扩展内容 Viewport 视口范围
Spacing 滚动条和视口之间的间隔空间,控制间隙大小
OnValueChanged 滚动视图位置改变时执行的函数列表

ScrollRect 滚动视图代码控制

操作 代码示例 说明
获取 ScrollRect 组件 ScrollRect scrollRect = this.GetComponent<ScrollRect>(); 获取当前游戏对象上的 ScrollRect 组件
改变内容对象大小 scrollRect.content.sizeDelta = new Vector2(1000, 1000); 改变内容的大小,决定具体可拖动范围
设置滑动面板归一化位置 scrollRect.normalizedPosition = new Vector2(0, 1f); 重置 content 位置到左上,x 表示水平方向归一化值(0 - 1),y 表示垂直方向归一化值(0 - 1)

ScrollView 监听事件的两种方式

拖脚本监听事件

public void ChangeValue(Vector2 v)
{
    print(v);
}

代码添加监听事件

scrollRect.onValueChanged.AddListener((vec) =>
{
    print(vec);
});
参数名称 描述
Template 关联下拉列表对象
Caption Text 关联显示当前选择内容的文本组件
Caption Image 关联显示当前选择内容的图片组件,可能需手动创建 Image
Item Text 关联下拉列表选项用的文本控件
Item Image 关联下拉列表选项用的图片控件,可能需手动创建 Image
Value 当前所选选项的索引值
Alpha Fade Speed 下拉列表窗口淡入淡出的速度,越小显示越快
Options 存在的选项列表
OnValueChanged 下拉列表选项改变时执行的函数列表
操作 代码示例 说明
获取 DropDown 组件 Dropdown dropdown = GetComponent<Dropdown>(); 获取当前脚本所附加游戏对象上的 DropDown 组件
获取当前选中项索引 print(dropdown.value); 打印下拉菜单当前选中项的索引
获取当前选中项文本内容 print(dropdown.options[dropdown.value].text); 打印下拉菜单当前选中项的文本内容
添加新选项 dropdown.options.Add(new Dropdown.OptionData("123123123")); 在下拉菜单的选项列表末尾添加一个新选项

拖脚本监听事件
需要一个 Int 类型的参数,代表下拉列表的索引值。示例代码如下:

public void ChangeValue(int value)
{
    print(value);
}

代码添加监听事件

dropdown.onValueChanged.AddListener((index) =>
{
    print(index);
});

图集

打图集的原因

在 Unity 的 UI 系统中,UGUI 和 NGUI 在使用图集上存在差异,NGUI 使用前就需要打图集,而 UGUI 可在之后进行打图集操作。打图集的核心目的是减少 DrawCall 从而提高性能。

DrawCall(DC)是 CPU 通知 GPU 进行一次渲染的命令,当 DC 次数过多时会导致游戏卡顿。通过打图集,能够将多个小图合并成一张大图,原本需要 n 次的 DC 渲染操作可变为 1 次,以此提升游戏性能。

Unity 中自带打图集功能的开启方式

可在工程设置面板中选择 Edit -> Project Setting -> Editor 来打开 Sprite Packer,其包含以下几种设置模式:

设置模式 描述 是否在编辑模式下打包 是否在构建时打包 特殊选项
Disabled 默认设置,若创建的不是 2D 项目,很可能是此选项,该模式下不会进行图集打包操作
Enabled For Builds(Legacy Sprite Packer) Unity 仅在构建项目时打包图集 有 Padding Power 选项,用于设置图片间隔距离,数字代表 2 的 n 次方
Always Enabled(Legacy Sprite Packer) Unity 在构建项目时会打包图集,并且在编辑模式下运行项目前也会进行图集打包 是(运行项目前) 有 Padding Power 选项,用于设置图片间隔距离,数字代表 2 的 n 次方
Enabled For Build Unity 仅在构建项目时打包图集,在编辑器模式下不会进行打包
Always Enabled Unity 在构建项目时打包图集,且在编辑模式下运行前会进行打包操作 是(运行前)

注意:在使用 UGUI 打图集时,建议取消勾选“允许旋转”和“紧密包装”这两个选项。

代码加载图集的方法

  1. 加载图集(需引用相应命名空间):SpriteAtlas spriteAtlas = Resources.Load<SpriteAtlas>("MyAlas");
  2. 从图集中加载指定名字的小图:spriteAtlas.GetSprite("bk");

UI事件监听接口

UGUI 事件接口列表

常用事件接口
接口名 接口函数名 解释说明
IPointerEnterHandler OnPointerEnter 鼠标指针进入对象时调用
IPointerExitHandler OnPointerExit 鼠标指针退出对象时调用
IPointerDownHandler OnPointerDown 在对象上按下鼠标指针时调用
IPointerUpHandler OnPointerUp 松开鼠标指针时(在指针点击的对象上)调用
IPointerClickHandler OnPointerClick 在同一对象上按下再松开鼠标指针时调用
IBeginDragHandler OnBeginDrag 即将开始拖拽时在拖拽对象上调用
IDragHandler OnDrag 发生拖拽时在拖拽对象上调用
IEndDragHandler OnEndDrag 拖拽完成时在拖拽对象上调用
不常用事件接口
接口名 接口函数名 解释说明
IInitializePotentialDragHandler OnInitializePotentialDrag 找到拖动目标时调用,可用于初始化值
IDropHandler OnDrop 在拖动目标对象上调用
IScrollHandler OnScroll 鼠标滚轮滚动时调用
IUpdateSelectedHandler OnUpdateSelected 每次勾选时在选定对象上调用
ISelectHandler OnSelect 对象成为选定对象时调用
IDeselectHandler OnDeselect 取消选择选定对象时调用
导航相关接口
接口名 接口函数名 解释说明
IMoveHandler OnMove 发生移动事件(上、下、左、右等)时调用
ISubmitHandler OnSubmit 按下 Submit 按钮时调用
ICancelHandler OnCancel 按下 Cancel 按钮时调用

PointerEventData 指针目标数据类参数详解

PointerEventData 类继承自 BaseEventData 类,是 UGUI 事件系统中存储用户输入设备交互信息的重要参数,包含以下关键属性:

属性名 描述
pointerId 代表用户操作中不同按键的唯一标识,用于识别触发事件的按键
position 当前指针在屏幕坐标系中的实时位置,拖拽时持续更新
pressPosition 指针按下那一刻在屏幕上的初始位置
Delta 从上一次事件到当前事件期间,指针在屏幕上的位移变化量
clickCount 连续点击的次数,用于区分单击和连击行为
clickTime 最后一次点击发生的时间戳,用于根据点击间隔执行不同逻辑
pressEventCamera 最后一次触发按下事件时所关联的摄像机实例
enterEventCamera 最后一次触发进入事件时所关联的摄像机实例

UI事件监听接口(EventTrigger)

使用事件触发器的方法

(1)拖曳脚本进行关联事件
关联的函数需要有一个 BaseEventData 参数。以下是示例代码:

public void TestPointerEnter(BaseEventData data)
{
    // 可以转换成子类 PointerEventData
    PointerEventData eventData = data as PointerEventData;
    print("鼠标进入 " + eventData.position);
}

通常的操作是将面板对象拖拽进来,然后选择面板脚本上的函数进行关联。

(2)代码添加

// 申明一个希望监听的事件对象 EventTrigger.Entry
// EventTrigger.Entry包含一个事件的类型ID eventID
// 和一个事件回调 callback
EventTrigger.Entry entry = new EventTrigger.Entry();

// 申明事件的类型为 PointerUp 拖拽事件
entry.eventID = EventTriggerType.PointerUp;

// 监听函数关联,当拖拽事件被触发时,打印"抬起"
entry.callback.AddListener((data) =>
{
    print("抬起");
});

// 把申明好的事件对象加入到 EventTrigger 当中叫triggers的entry列表中
eventTrigger.triggers.Add(entry);

屏幕坐标转UI相对坐标

RectTransformUtility类:是 RectTransform 的辅助类,主要用于坐标转换等操作。当前重要的函数是将屏幕空间上的点转换成 UI 本地坐标下的点。

坐标转换方法:RectTransformUtility.ScreenPointToLocalPointInRectangle 方法可将屏幕坐标点转换为父对象的本地坐标系中的点。该方法有四个参数:相对父对象、屏幕点坐标、摄像机、最终得到的点坐标。一般配合拖拽事件使用。

示例代码:

public class Lesson21_UGUI进阶_屏幕坐标转UI相对坐标 : MonoBehaviour, IDragHandler
{    
    public RectTransform parent; // 父对象

    public void OnDrag(PointerEventData eventData)
    {
        Vector2 nowPos; // 当前位置
        // 执行完这个函数后,会把屏幕坐标转换成 UI 本地坐标系下的值赋值给 nowPos
        RectTransformUtility.ScreenPointToLocalPointInRectangle(
            parent, // 相对父对象
            eventData.position, // 屏幕点坐标
            eventData.enterEventCamera, // 摄像机
            out nowPos); // 最终得到的点坐标

        this.transform.localPosition = nowPos; // 将当前对象的本地位置设置为转换后的坐标
    }
}

Mask遮罩

遮罩定义:遮罩是一种在不改变图片的情况下,让图片在游戏中只显示其中一部分的组件。ScrollView 滚动视图中的 ViewPort 就包含遮罩组件,使得滚动视图中只有在可见范围内才能看到组件。

遮罩使用方法:关键组件是 Mask 组件,在父对象上添加 Mask 组件即可遮罩其子对象。需要注意的是,想要被遮罩的 Image 需要勾选 Maskable;只要父对象添加了 Mask 组件,所有的 UI 子对象都会被遮罩;遮罩父对象图片不透明的地方显示,透明的地方被遮罩。

Mask遮罩模型、粒子特效显示在UI之前

  1. 直接用摄像机渲染 3D 物体:当 Canvas 的渲染模式不是覆盖模式(摄像机模式和世界(3D)模式)时,只要模型的 Z 轴在 UI 元素之前,模型就可以显示在 UI 之前。建议使用专门的摄像机渲染 UI 相关内容,UI 面板上的 3D 物体也用 UI 摄像机进行渲染。实现方法是设置一个专门渲染 UI 层的摄像机,让主摄像机不渲染 UI 层,UI 摄像机关联 Canvas,并将 Canvas 的渲染模式设置成摄像机模式,然后在 Canvas 上创建 Cube,调整缩放尺寸,层级设置为 UI 层,通过调整 Z 轴控制其显示位置。
  2. 将 3D 物体渲染在图片上,通过图片显示:专门使用一个摄像机渲染 3D 模型,将其渲染内容输出到 Render Texture 上,再将渲染的图显示在 UI 上。这种方式不受 Canvas 渲染模式的限制。实现步骤为创建一个模型层,创建一个专门渲染模型层的摄像机并改成纯色模式,创建一个立方体并设置为模型层,创建 RenderTexture 渲染器纹理并关联模型摄像机,在 Canvas 下创建 RawImage 并关联 RenderTexture 渲染器纹理。
  3. 粒子特效显示在 UI 之前:粒子特效的显示和 3D 物体类似。在摄像机模式下,可以在粒子组件的 Renderer 相关参数中改变排序层,让粒子特效始终显示在 UI 之前,不受 Z 轴影响。

异形按钮

异形按钮定义:形状不是传统矩形的按钮,例如只有独角兽区域能够被点击响应的按钮。

实现准确点击的方法:

  1. 添加子对象的形式:按钮根据图片矩形范围判断点击响应,范围判断自下而上,有子对象图片时,子对象图片范围也算可点击范围。可以用多个透明图拼凑不规则图形作为按钮子对象进行射线检测。
  2. 代码改变图片的透明度响应阈值:创建 Image 变量外部关联按钮的 Image 组件,通过设置 image.alphaHitTestMinimumThreshold 变量来改变透明度命中测试的最小阈值。只有当物体的不透明度大于等于该阈值时,才会进行命中测试。

自动布局组件

布局元素的布局属性

要参与自动布局,布局元素必须包含布局属性,主要有以下 6 条:

属性名称 描述
Minmum width 该布局元素应具有的最小宽度
Minmum height 该布局元素应具有的最小高度
Preferred width 在分配额外可用宽度之前,此布局元素应具有的宽度
Preferred height 在分配额外可用高度之前,此布局元素应具有的高度
Flexible width 此布局元素应相对于其同级而填充的额外可用宽度的相对量
Flexible height 此布局元素应相对于其同级而填充的额外可用高度的相对量

布局时,布局元素大小设置遵循以下规则:

  1. 首先分配最小大小(Minmum width 和 Minmum height)。
  2. 若父容器有足够可用空间,则分配 Preferred width 和 Preferred height。
  3. 若上述分配完成后仍有额外空间,则分配 Flexible width 和 Flexible height。

一般情况下,布局元素的这些属性值为 0,但特定 UI 组件(如 Image 和 Text)依附对象的布局属性可能会改变。通常无需手动修改这些属性,若有需要,可手动添加 LayoutElement 组件进行修改。

常见自动布局组件

HorizontalVerticalLayoutGroup 水平垂直布局组件

可将子对象并排或竖直放置,一般将该布局组件放到父对象上,子对象为被布局对象。其参数如下:

参数名称 描述
Padding 左右上下边缘的偏移位置
Spacing 子对象之间的间距
ChildAlignment 九宫格对齐方式
Control Child Size 是否控制子对象的宽高
Use Child Scale 在设置子对象大小和布局时,是否考虑子对象的缩放
Child Force Expand 是否强制子对象扩展以填充额外可用空间
LayoutElement 布局元素组件

可给子对象添加该组件,例如设置布局属性最小宽和最小高为 100,即便父对象很小,子对象最小也会保持宽高 100。

GridLayoutGroup 网格布局组件

可将子对象当成格子,并设置它们的大小和位置,一般在滚动容器添加到 content 上,和 ContentSizeFitter 内容大小适配器一起使用。其参数如下:

参数名称 描述
Padding 左右上下边缘的偏移位置
Cell Size 每个格子的大小
Spacing 格子之间的间隔
Start Corner 第一个元素所在的位置(四个角)
Start Axis 沿着哪个轴放置元素,Horizontal 水平放置并换行,Vertical 竖直放置并换列
Child Alignment 格子的对齐方式(九宫格)
Constraint 行列约束,有 Flexible(灵活模式,根据容器大小自动适应)、Fixed Column Count(固定列数)、Fixed Row Count(固定行数)三种模式
ContentSizeFitter 内容大小适配器

可自动调整 RectTransform 的宽度和高度,使组件自动设置大小,常用于 Text 组件,或与其他布局组件一起使用。其参数如下:

参数名称 描述
Horizontal Fit 控制宽度的方式
Vertical Fit 控制高度的方式

可选参数包括:

  • Unconstrained:不根据布局元素伸展宽度或高度。
  • Min Size:根据布局元素的最小宽度或高度伸展。
  • Preferred Size:根据布局元素的首选宽度或高度伸展宽度。

若滚动视图中的元素动态添加,滚动视图不会自动改变大小,可给滚动视图添加自动布局组件和内容大小适配器组件,使其动态添加时自动更改宽高。

AspectRatioFitter 宽高比适配器

可让布局元素按一定比例调整自身大小,并在父对象内部根据父对象大小进行适配。其参数如下:

参数名称 描述
Aspect Mode 适配模式,用于调整矩形大小以实现宽高比
Aspect Ratio 宽度除以高度的比值,即宽高比

Aspect Mode 的可选值及含义:

  • None:不对矩形进行宽高比适配。
  • Width Controls Height:根据宽度自动调整高度。
  • Height Controls Width:根据高度自动调整宽度。
  • Fit In Parent:自动调整宽度、高度、位置和锚点,使矩形适应父项的矩形,同时保持宽高比,可能会出现“黑边”。
  • Envelope Parent:自动调整宽度、高度、位置和锚点,使矩形覆盖父项的整个区域,同时保持宽高比,可能会出现“裁剪”。

CanvasGroup画布组

参数名称 描述
Alpha 用于整体控制面板的透明度,通过调整该值可实现面板的淡入淡出效果
Interactable 控制面板整体的启用和禁用状态。设置为 true 时,面板及其子对象可与用户交互;设置为 false 时,面板及其子对象无法与用户交互
Blocks Raycasts 用于设置面板是否阻挡射线检测。设置为 true 时,面板会阻挡射线;设置为 false 时,射线可穿过面板
Ignore Parent Groups 决定是否忽略父级 CanvasGroup 的作用。设置为 true 时,该面板不受父级 CanvasGroup 相关设置的影响;设置为 false 时,会受到父级 CanvasGroup 的影响


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏