【Unity3D】UI Toolkit简介

news2025/1/23 4:47:25

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】。

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 中。

        在 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 方法用于查找第一个符合条件的子元素(或子容器)。

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 窗口拾取元素信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习应用-WeNet语音识别实战01

概括 本文对WeNet声音识别网络的Python API上介绍的Non-Streaming Usage和 Streaming-Usage分别做了测试&#xff0c;两者本质相同。API对应采样的声音帧率、声道都做了限制。效果还可以&#xff0c;但是部分吐字不清晰、有歧义的地方仍然不能识别清晰。 项目地址&#xff1a; …

内部类总结

内部类 1、内部类介绍&#xff1a; 外 2、成员内部类&#xff1a; 3、静态内部类 4、局部内部类&#xff1a; 5、匿名内部类&#xff1a;

说说TIME_WAIT和CLOSE_WAIT区别

分析&回答 TCP协议规定&#xff0c;对于已经建立的连接&#xff0c;网络双方要进行四次握手才能成功断开连接&#xff0c;如果缺少了其中某个步骤&#xff0c;将会使连接处于假死状态&#xff0c;连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接&#xf…

使用 Hue 玩转 Amazon EMR(SparkSQL, Phoenix) 和 Amazon Redshift

现状 Apache Hue 是一个基于 Web 的交互式 SQL 助手&#xff0c;通过它可以帮助大数据从业人员&#xff08;数仓工程师&#xff0c;数据分析师等&#xff09;与数据仓库进行 SQL 交互。在 Amazon EMR 集群启动时&#xff0c;通过勾选 Hue 进行安装。在 Hue 启用以后&#xff0…

Scratch 画画的技巧

前言 美术是一种艺术&#xff0c;且不局限于纸张&#xff0c;就像电脑绘图也属于美术。我至今已有三年多的画龄&#xff0c;经验丰富&#xff0c;尤其擅长在scratch造型编辑器上画矢量图。今天给大家分享一些实用的技巧。 1.讲解 用橡皮工具给一个圆擦出“橡皮洞” 橡皮工具&a…

2511. 最多可以摧毁的敌人城堡数目

文章目录 Tag题目来源题目解读解题思路复杂度分析写在最后 Tag 【数组】 题目来源 2511. 最多可以摧毁的敌人城堡数目 题目解读 在数组 forts 中&#xff0c;forts[i] 有三种数值&#xff1a; -1&#xff1a; 表示第 i 个位置没有城堡&#xff0c;是空地&#xff1b;0&…

【计算机知识】Base64 编码说明

一、理论 Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法&#xff0c;由于 2^664&#xff0c;所以每 6 个比特为一个单元&#xff0c;对应某个可打印字符。 Base64 常用于在通常处理文本数据的场合&#xff0c;表示、传输、存储一些二进制数据&#xff0c;包括…

程序员自由创业周记#2:前期准备

感恩 上次公开了创业的决定后&#xff0c;得到了很多亲朋好友和陌生朋友的鼓励或支持&#xff0c;以不同的形式&#xff0c;感动之情溢于言表。这些都会记在心里&#xff0c;大恩不言谢~ 创业方向 笔者是一名资质平平的iOS开发程序猿&#xff0c;创业项目也就是开发App卖&am…

图的深度优先与广度优先遍历

上篇博客介绍了图的概念与图的存储(邻接矩阵、邻接表)&#xff1a; 接下来就是介绍图的遍历。 图的遍历 给定一个图G和其中任意一个顶点v0&#xff0c;从v0出发&#xff0c;沿着途中各边访问图中的所有顶点&#xff0c;且每个顶点仅被遍历一次。"遍历"即对结点进行…

读SQL学习指南(第3版)笔记09_条件逻辑与事务

1. 条件逻辑 1.1. SQL逻辑根据特定列或表达式转向不同的分支来处理 1.2. 在程序执行时从多个路径中选取一个路径的能力 1.3. case表达式 1.3.1. 所有的主流数据库服务器都提供了旨在模拟大多数编程语言中if-then-else 语句的内建函数 1.3.1.1. Oracle的decode()函数 1.3.…

T113-S3-ov5640摄像头调试

目录 前言 一、ov5640模组介绍 1. 图像传感器特性 2. 接口和控制 3. 图像处理能力 4. 应用领域 二、原理图连接 三、设备树配置 四、驱动配置 五、ov5640使用 六、异常记录 总结 前言 摄像头模块是嵌入式系统中常见的外设&#xff0c;用于捕获图像和视频。在本篇文章…

一不留神就掉坑

乘除顺序问题 在据卡特兰数[1]公式,解决leetcode-96 不同的二叉搜索树[2]时,遇到一个非常诡异的问题, package mainimport "fmt"func main() { for i : 0; i < 40; i { fmt.Printf("第%d个卡特兰数为:%d\n", i, numTrees(i)) }}func numTrees(n int) i…

【超详细~KVM】KVM概述、安装及简单操作-------从小白到大神之路之学习运维第91天

第四阶段提升 时 间&#xff1a;2023年8月30日 参加人&#xff1a;全班人员 内 容&#xff1a; KVM概述、安装及简单操作 目录 一、KVM 概述 二、KVM工作原理 三、KVM应用场景 四、centos7 下安装部署 五、新建虚拟机步骤 1、创建存储池并创建存储卷 2、点击号创建…

MPI之通信模式(标准,缓存,同步,就绪)

MPI缓冲区 由MPI自行维护的一块内存区域&#xff0c;也可由用户(MPI_Bsend)自行维护&#xff1b;发送方 维护一块发送缓冲区&#xff1b; 接收方 维护一块接收缓冲区。 数据收发过程&#xff1a; 当发送端将数据拷贝到自身的数据缓冲区后(注意这里是拷贝&#xff0c;即数据到…

Redis——认识Redis

简单介绍 Redis诞生于2009年&#xff0c;全称是Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 特征 键值&#xff08;Key-value&#xff09;型&#xff0c;value支持多种不同数据结构&#xff0c;功能丰富单线程&…

多线程专栏------多线程的实现方式(三)

目录 1、使用线程池1.1、什么是线程池1.2、使用线程池的优点1.3、线程池的核心工作流程1.3、线程池的五种状态生命周期1.3.1、RUNNING1.3.2、SHUTDOWN1.3.3、STOP1.3.4、TIDYING1.3.5、TERMINATED 1.4、创建线程池的方式1.4.1、通过 ThreadPoolExecutor 创建1.4.1.1、线程池的核…

类的静态成员变量 static member

C自学精简教程 目录(必读) 类的静态成员 static member 变量全局只有一份副本&#xff0c;不会随着类对象的创建而产生副本。 static 静态成员 在类的成员变量前面增加static关键字&#xff0c;表示这个成员变量是类的静态成员变量。 #include <iostream> using name…

kaggle赛后总结

1. 宽表 2.缺失值的处理方法 最简单粗暴的就是删除&#xff0c;这种情况是凡是有缺失值行数很少。均值替代。缺失值的行数比较多一点儿的时候&#xff0c;直接删除会影响样本数量&#xff0c;那就均值替代&#xff0c;或者中位数替代等方法。还有复杂的方法&#xff0c;把有缺…

NMS(非极大值抑制)的 Python 实现

文章目录 1. NMS的步骤2. Python代码 非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;NMS&#xff09;是一种在目标检测中常用的技术。 NMS的目的是消除重叠区域中冗余的边界框&#xff0c;并选择最具代表性的目标作为最终结果。通过调整重叠阈值&#xff0c;可…

400电话号码怎么开通

开通400电话是企业提供客户服务的重要步骤。下面是一些步骤和注意事项&#xff0c;帮助您顺利开通400电话。 第一步&#xff1a;选择400电话服务提供商 选择一家可靠的400电话服务提供商非常重要。您可以通过搜索引擎、咨询行业内人士或者参考其他企业的经验来选择合适的服务提…