【Unity3D】UI Toolkit简介
1 前言
UI Toolkit 是一种基于 Web 技术的 GUI 框架,是为了解决 UGUI 效率问题而设计的新一代 UI 系统(UGUI 的介绍详见→UGUI概述)。与 UGUI 不同,UI Toolkit 没有采用 GameObject 的方式,而是参考了 Web 技术的 XML 和 CSS 方案。这意味着它只保存变化的数据,而不是整个界面状态,这使得它具有更高的效率。
UI Toolkit 的历史可以追溯到 Unity 2018 年发布的 UIElement,起初主要用于 Editor 编辑面板中的 UI 开发,自 Unity 2019 起,它开始支持运行时 UI,并更名为 UIToolkit,它以 Package 包(com.unity.ui)的形式存在,并在 Unity 2021.2 版本中,被官方内置在 Unity 中,与 UGUI 的地位相同。
UI Toolkit 的优点:
- 跨平台
- 高性能(一个 Draw Call 绘制所有 UI)
- 自定义样式应用到任何元素
- 复用性、灵活性更好
- 配套的 UI 编辑工具(UI Builder)
- 同使支持 Editor 和 Runtime
UI Toolkit 的缺点:
- 不依赖 GameObject,难以制作放置在 3D 世界中的可互动 UI
- 不支持 Shader,难以制作特效
- 不支持 Animator 组件,无法制作实时循环动画(但有 Transition 动画系统)
UI Toolkit 内置案例见:【Window→UI Toolkit→Samples】,UI Tooolkit 容器介绍见→UI Toolkit容器 ,UI Tooolkit 元素介绍见→UI Toolkit元素,UI Tooolkit 样式选择器介绍见→UI Toolkit样式选择器。
2 UI Toolkit 简单使用
1)创建 UI Document 对象
在 Hierarchy 窗口右键,依次选择【UI Toolkit→UI Document】,创建 UI Document 对象,如下。

- Panel Settings:定义一些全局的配置,比如字体、样式等信息,在创建 UI Document 对象时,会自动创建 PanelSettings.asset 文件;
- Source Asset:待显示的页面资源
- Sort Order:排序顺序,当有多个 UIDocument 对象时,序号越小的越先显示(在底部),序号越大的越后显示(在顶部);
2)创建 uxml 资源文件
在 Assets 窗口右键,依次选择【Create→UI Toolkit→UI Document】,会生成一个 uxml 文件,重命名为 TestUXMLTemplate,并在 UIDocument 对象的 Inspector 窗口将 Source Asset 设置为 TestUXMLTemplate,如下。

3)编辑 uxml 文件
在 Assets 窗口双击 TestUXMLTemplate.uxml 文件,会打开 UI Builder 窗口,或者在菜单栏依次选择【Window→UI Toolkit→UI Builder】,也可以打开 UI Builder 窗口。将 VisualElement 拖拽到 Hierarchy 窗口,如下。

选中 Hierarchy 窗口 中的 VisualElement,在 Inspector 窗口配置 Flex 和 Background,如下,按 Ctrl + S 键保存。

4)查看效果
回到 Game 窗口,显示效果如下。中间的立方体是事先添加的 Cube 对象,半透明的黄色是 UI Document 显示的效果。

3 UI Builder 窗口介绍
在 Unity 2021.2 版本之前,需要在 Package Manager 窗口中安装 UI Builder,自 Unity 2021.2 版本开始 UI Builder 已内置在 Unity Editor 中。UI Builder 官方介绍见→UI Builder。
在 Assets 窗口双击 uxml 文件,会打开 UI Builder 窗口,或者在菜单栏依次选择【Window→UI Toolkit→UI Builder】,也可以打开 UI Builder 窗口。

- StyleSheets:样式窗口,用于管理元素样式;
- Hierarchy:元素层级窗口,用于管理元素;
- Library:容器和元素库;
- Inspector:监视器窗口,用于配置容器和元素属性。
滚动鼠标滑轮可以放大和缩小预览窗口大小;按鼠标中键拖拽,可以调整预览窗口的位置。点击 Viewport 窗口右上角的 Preview 按钮,可以查看运行态的 UI 界面。

4 样式属性介绍
每个元素(或容器)都有以下样式属性,本节将逐一讲解这些属性。

4.1 StyleSheet(样式表)
样式表模块中,可以添加和导出样式,并查看匹配到的样式选择器。样式选择器官方介绍详见→USS selectors。

4.2 Inlined Styles(内部样式)
内部样式官方介绍详见→USS common properties,样式属性官方介绍详见→USS properties reference,Box model 如下。

4.2.1 Display(显示)

- Opacity:不透明度,取值为 0 ~ 100。0 表示透明的,100 表示完全不透明。
- Display:占位显示,取值有 flex、none。flex 表示尽可能占用剩余空间;none 表示不占用空间,其他元素(或容器)会挤占该元素(或容器)空间,导致该元素(或容器)不可见。
- Visibility:可见性,取值有 visible、hidden。visible 表示元素(或容器)可见;hidden 表示元素(或容器)不可见,但该元素(或容器)的空间仍然占用着,其他元素不会挤占该元素(或容器)的空间。
- Overflow:裁剪时的边距策略,取值有 visible、hidden。在子元素(或容器)边框超过当前容器的场景下,visible 表示当前容器的 Margin & Padding 不会约束超出部分的容器;hidden 表示当前容器的 Margin & Padding 会约束超出部分的容器。
如下,容器的 overflow 属性设置为 visible,边距没有对文本生效。

4.2.2 Position(位置)

- Position:取值有 Relative、Absolute,它们的区别是:Relative 表示在平铺排列后相对于自己的偏移;Absolute 表示相对于父容器的偏移,官方释义见→Relative and absolute positioning。
- Left:元素(或容器)左侧的位置。
- Top:元素(或容器)顶部的位置。
- Right:元素(或容器)右侧的位置。
- Bottom:元素(或容器)左侧的位置。
Position 的取值类型有:px、%、auto、initial,含义如下:
- px:取值单位是像素。
- %:取值单位是百分比。
- auto:自动的,取值受 Flex、Align、样式选择器等影响。
- initial:取值受 Flex、Align 等影响,不受样式选择器影响。
4.2.3 Flex(拉伸)

- Basis:元素(或容器)的基础空间,取值类型有 px、%、auto、initial,含义同 4.2.2 节。
- Shrink:如果水平方向有空余空间,元素(或容器)占用水平方向剩余空间的比例,取值有比例值、initial(不占用剩余空间)。
- Grow:如果竖直方向有空余空间,元素(或容器)占用竖直方向剩余空间的比例,取值有比例值、initial(不占用剩余空间)。
- Direction:子元素(或容器)排列的方向,取值有:column(从上往下)、column-reserve(从下往上)、row(从左往右)、row-reserve(从右往左)。
- Wrap:子元素(或容器)的排列超过一行(或一列)后的排列策略,取值有 nowrap(不换行,截断显示)、wrap、wrap-reverse,
4.2.4 Align(对齐)

- Align Items:auto、flex-start、flex-end、center、stretch
- Justify Content:flex-start、flex-end、center、space-between、space-around
说明:Align 的属性受 Flex 的 Direction 影响。
4.2.5 Size(尺寸)

- Width:元素(或容器)的宽度,取值类型有 px、%、auto、initial,含义同 4.2.2 节。
- Height:元素(或容器)的高度,取值类型有 px、%、auto、initial,含义同 4.2.2 节。
- Max:元素(或容器)的最大宽度和高度,取值类型有 px、%、none(不限)、initial,含义同 4.2.2 节。
- Min:元素(或容器)的最小宽度和高度,取值类型有 px、%、auto、initial,含义同 4.2.2 节。
4.2.6 Margin & Padding(外边距和内边距)

- Margin:外边距,取值类型有 px、%、auto、initial,含义同 4.2.2 节。
- Padding:内边距,取值类型有 px、%、auto、initial,含义同 4.2.2 节。
4.2.7 Text (文本)

- Font:字体类型。
- Font Asset:字体资源。
- Font Style:字体样式,取值有 bold(粗体)、italic(斜体)。
- Size:字体大小。
- Color:字体颜色。
- Align:字体对齐方式,取值有 left(居左)、center(水平居中)、right(居右)、upper(居上)、middle(竖直居中)、lower(居下)。
- Wrap:字体包裹方式,即文字超过一行后的显示方式,取值有 normal(自动换行)、nowrap(截断显示)。
- Outline Width:描边宽度。
- Outline Color:描边颜色。
- Text Shadow:文本阴影。
- Letter Spacing:字符间隔,取值类型有 px、initial,含义同 4.2.2 节。
- World Spacing:单词间隔,取值类型有 px、initial,含义同 4.2.2 节。
- Paragraph Spacing:段落间隔,取值类型有 px、initial,含义同 4.2.2 节。
4.2.8 Background(背景)

- Color:背景颜色。
- Image:背景图片。
- Image Tint:背景图片颜色。
- Scale Mode:图片缩放模式,取值有 stretch-to-fill(宽度和高度都铺满,会破坏图片的原始宽高比)、scale-and-crop(宽度和高度都铺满,保持图片的原始宽高比,可能会裁剪图片)、scale-to-fit(宽度或高度铺满,保持图片的原始宽高比)。
- Slice:切片比例,将图片划分为 9 宫格,4 个角的图片保持原始尺寸不变,可以用于对话框背景。
4.2.9 Border(边框)

- Color:边框颜色。
- Width:边框宽度,取值类型有 px、initial,含义同 4.2.2 节。
- Radius:边框圆角,取值类型有 px、%、initial,含义同 4.2.2 节。
4.2.10 Transform(变换)
Transform 官方介绍见→USS transform。

- Pivot Origin:变换作用的中心,取值类型有 px、%,含义同 4.2.2 节。
- Translate:平移偏移量,取值类型有 px、%,含义同 4.2.2 节。
- Scale:缩放偏移量,取值类型有比例数值、none、initial,含义同 4.2.2 节。
- Rotate:旋转角度,取值单位有 deg(角度)、grad(梯度,100 grad = 90 deg)、rad(弧度)、turn(圈,1 turn = 360 deg)。
4.2.11 Cursor(光标)

- Cursor Image:鼠标图片。
4.2.12 Transition Animations(过渡动画)
Transition Animations 官方介绍见→USS transition。

- Property:动画作用的属性。
- Duration:过渡动画执行的时间,取值类型有 s(秒)、ms(毫秒)、initial。
- Easing:属性随时间的变化函数,类似于插值器。
- Delay:动画延时执行时间,取值类型有 s(秒)、ms(毫秒)、initial。
5 UQuery
UQuery 主要用于查找子元素(或子容器),可以通过 type 和 name 查找。元素(或容器)的 Query 方法用于查找所有符合条件的子元素(或子容器),元素(或容器)的 Q 方法用于查找第一个符合条件的子元素(或子容器)。UQuery 官方介绍见→Find visual elements with UQuery。
5.1 UQuery 多元素查找(Query 方法)
1)通过 type 查找
rootVisualElement.Query<Label>().ForEach(OnSelectedMultipleElements);
private void OnSelectedMultipleElements(Label obj) {
obj.text = "xxx";
}
rootVisualElement 是根 VisualElement 容器,获取方式如下,下同。
VisualElement rootVisualElement = GetComponent<UIDocument>().rootVisualElement;
2)通过 name 查找
rootVisualElement.Query("VisualElementName").ForEach(OnSelectedMultipleElements);
private void OnSelectedMultipleElements(VisualElement obj) {
obj.style.backgroundColor = Color.black;
}
3)通过 type 和 name 查找
rootVisualElement.Query<Label>("LabelName").ForEach(OnSelectedMultipleElements);
rootVisualElement.Query<Label>("LabelName").AtIndex(1).text = "yyy";
private void OnSelectedMultipleElements(Label obj) {
obj.text = "xxx";
}
5.2 UQuery 单元素查找(Q 方法)
1)通过 type 查找
Label label = rootVisualElement.Q<Label>();
label.text = "xxx";
2)通过 name 查找
VisualElement visualElement = rootVisualElement.Q("VisualElementName");
visualElement.style.backgroundColor = Color.black;
3)通过 type 和 name 查找
Label label = rootVisualElement.Q<Label>("LabelName");
label.text = "xxx";
6 UI Toolkit Debugger(调试器)
1)打开 UI Toolkit Debugger
在 UI Builder 窗口的右上角点击更多,展开后点击 UI Toolkit Debugger 即可打开调试窗口,也可以通过【Window→UI Toolkit→Debugger】打开调试窗口。

2)查看 Box model
点击 Show Layout 按钮,可以看到画布的元素布局边界,如下。

选中元素(或容器),在 Debugger 窗口可以看到 Box model 等信息,如下。点击 Pick Element 按钮,可以在 Viewport 窗口拾取元素信息。

声明:本文转自【Unity3D】UI Toolkit简介。
【Unity3D】UI Toolkit简介的更多相关文章
- amaze ui使用简介
amaze ui使用简介 amaze UI 类似于bootstrap 不过比bootstrap更加轻量级 可以用来开发响应式网站,并且是移动优先的,针对移动设备开发的网站可以考虑使用这个框架 css中 ...
- FairyGUI编辑器制作Unity3D UI值得借鉴
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- Unity3d:UI面板管理整合进ToLua
本文基于 https://github.com/chiuan/TTUIFramework https://github.com/jarjin/LuaFramework_UGUI 进行的二次开发,Tha ...
- GJM : Unity3D - UI - UI边缘流光特效小技巧 [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- Android 程序目录及UI的简介
Android程序的目录结构 src:源码的组织管理目录. gen:自动生成的目录,会生成一些重要的文件,如R.java,该目录一般不需要我们编写. assets:该目录文件不会被编译成二进制编码,多 ...
- Android ActivityThread(主线程或UI线程)简介
1. ActivityThread功能 它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),并根据AMS的要求(通过IApplicationThread接口,AMS为Client ...
- UI Automation 简介
转载,源地址: http://blog.csdn.net/ffeiffei/article/details/6637418 MS UI Automation(Microsoft User Interf ...
- Android UI -- 内容简介
Android UI(User Interface) 是android学习的必要课程,在接下来的内容我们将主要介绍 Android UI 的基础知识.
- UI自动化测试简介及Selenium工具的介绍和环境搭建
自动化测试简介 1.1何为自动化测试? 是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程.换言之,就是以程序实现的方式来代替手工测试. 1.2自动化测试分类 分为功能自动化测 ...
- 课堂笔记及知识点----UI框架简介(2018/10/25)
UI框架学习目标: 要知道怎样套用的! 框架里面的基本执行流程 怎样开始执行(配置文件) 怎么套用 最主要的三个脚本: (也是多态的体现之一) 1).BaseUI: 作用-->提供UI能够使用的 ...
随机推荐
- AMBA Bus介绍_01
AMBA总线概述 系统总线简介 AMBA 2.0 AHB - 高性能Bus APB - 外设Bus AHB ASB APB AHB 组成部分 APB组成部分 AMBA协议其他有关问题 DMA DMA ...
- DC逻辑综合工具简介-Design Compiler
逻辑综合简介 逻辑综合:代码转变为网表 FPGA:代码转变为FPGA内部的数字单元 在进行综合的时候往往会使用一些脚本工具 需要学会看综合之后的报告 1.目标 进行综合需要读入RTL设计,还需要用到f ...
- css - 伪元素清除浮动
.clearfix:after{ content:""; /*设置内容为空*/ height:0; /*高度为0*/ line-height:0; /*行高为0*/ display ...
- JMS微服务开发示例(六)安全退出进程
默认情况下,如果在linux,需要关闭微服务进程,请务必使用 kill -15 进程id 命令,其他命令可能会直接关闭进程,造成数据丢失. 例如,有个后台任务,执行了一半,这时候进程突然关闭了,会形成 ...
- CPU算力提升与实际性能提升的关系
关于SPEC2006CPU和RedisBenchmark的理解 最近研究过硬件CPU的性能和Redis这样单线程重IO服务 突然想对比一下CPU算力提升占Redis性能提升的比率情况 性能很大程度由C ...
- [转帖] 常见的Socket网络异常场景分析
https://www.cnblogs.com/codelogs/p/16001770.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 在目前微服务的 ...
- [转帖]Cgroups资源限制
https://cloud.tencent.com/developer/article/2108816?areaSource=105001.13&traceId=QzVtWN5jGl8zeYZ ...
- DashBoard in k8s 简单使用
DashBoard in k8s 简单使用 第一部分 拉取分发镜像 没办法的事情,公司网络实在是太垃圾了, dockerhub 又不让多次docker pull 找一台网络表好的机器 执行如下命令: ...
- js文件下载blob
使用axios文件下载 if (tableDataSource.selectedRowKeys.length > 0) { //本次请求你携带token axios.defaults.heade ...
- ant-design-vue 表单验证详解
表单验证详解 <template> <!-- 第一个坑 :model="formState.youForm" 一定要写成这样 不要写成:model="f ...