当前位置: 首页 > news >正文

【Unity3D】UI Toolkit元素

1 前言

        UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery、Debugger,UI Toolkit容器 中介绍了 VisualElement、ScrollView、ListView、GroupBox 等容器,UI Toolkit样式选择器 中介绍了简单选择器、复杂选择器、伪类选择器等样式选择器,本文将介绍 UI Toolkit 中的元素,主要包含 Label、Button、TextField、Toggle、Radio Button、Slider、Progress Bar、Dropdown、Foldout 等,官方介绍详见→UXML elements reference。

2 Label(标签)

        Label 官方介绍见→UXML element Label。

        1)属性介绍

  • View Data Key:用于视图数据持久化(如:树展开状态、滚动位置、缩放级别),作为视图数据保存 / 加载的键,如果不设置此键将禁用该元素的持久性。
  • Picking Mode:判断是否可以在 mouseEvents 期间选择此容器。
  • Tooltip:鼠标悬停到该容器上时弹出的提示文字。
  • Usage Hints:预期使用模式,便于系统加速某些操作。
  • Tab Index:用于对焦点环中的焦点对象进行排序。
  • Focusable:容器是否能获得焦点。 
  • BindingPath:目标属性绑定的路径。
  • Text:标签的文本内容。
  • Enable Rich Text:是否支持富文本。
  • Display Tooltip When Elided:悬停提示是否显示省略文本的完整版本。

        说明:View Data Key、Picking Mode、Tooltip、Usage Hints、Tab Index、Focusable、BindingPath 都是基类属性,后文若出现这些属性将不再赘述。 

        2)富文本应用

        当支持富文本时,在 text 中输入以下富文本,显示如下。

<b>Hello</b> <color=green>World</color>

3 Button(按钮)

        Button 官方介绍见→UXML element Button。

        1)属性介绍

  • Text:按钮的文本内容。
  • Enable Rich Text:是否支持富文本。
  • Display Tooltip When Elided:悬停提示是否显示省略文本的完整版本。

        2)事件响应

        ButtonDemo.cs

using UnityEngine;
using UnityEngine.UIElements;public class ButtonDemo : MonoBehaviour {private void Awake() {VisualElement root = GetComponent<UIDocument>().rootVisualElement;Button button = root.Q<Button>();button.clicked += OnClick;}private void OnClick() {Debug.Log("Clicked");}
}

4 TextField(输入文本)

        TextField 官方介绍见→UXML element TextField。

        1)属性介绍

  • Label:标签。
  • Value:输入文本,修改此值不会触发事件。
  • Max Length:输入文本最大长度,-1 表示长度不受限。
  • Password:是否为密码,如果是密码,将使用 Mask Character 中的字符显示,默认使用 "*" 显示。
  • Mask Character:当输入的文本是密码时,替换显示的字符。
  • Text:输入文本,修改此值会触发事件,并且会将文本同步到 value 中。
  • Readonly:输入文本是否是只读的。
  • Is Delayed:是否延时更新 value,如果延时更新,则在用户按 Enter 或输入文本失焦后才更新 value 属性。
  • Multiline:是否允许多行输入。

        2)事件响应

        TextFieldDemo.cs

using UnityEngine;
using UnityEngine.UIElements;public class TextFieldDemo : MonoBehaviour {private void Awake() {VisualElement root = GetComponent<UIDocument>().rootVisualElement;TextField textField = root.Q<TextField>();textField.isDelayed = true; // 延时更新value, 在用户按Enter或输入文本失焦后才更新value属性textField.RegisterValueChangedCallback(OnValueChanged);}private void OnValueChanged(ChangeEvent<string> e) { // 输入回调事件Debug.Log("previousValue=" + e.previousValue + ", newValue=" + e.newValue);}
}

5 Toggle(复选框)

        Toggle 官方介绍见→UXML element Toggle。

         1)属性介绍

  • Label:复选框标签。
  • Value:复选框的选中状态。
  • Text:复选框后面的文本。

        2)事件响应

        ToggleDemo.cs

using UnityEngine;
using UnityEngine.UIElements;public class ToggleDemo : MonoBehaviour {private VisualElement root; // 根容器private GroupBox groupBox; // 分组盒子private string[] toggleLabel = new string[] {"First", "Second", "Third", "Fourth"}; // toggle的标签private void Awake() {root = GetComponent<UIDocument>().rootVisualElement;groupBox = root.Q<GroupBox>();groupBox.text = "ToggleDemo";groupBox.style.fontSize = 50;root.Add(groupBox);for (int i = 0; i < toggleLabel.Length; i++) {AddToggle(i);}}private void AddToggle(int index) { // 添加单选项Toggle toggle = new Toggle();toggle.text = toggleLabel[index];toggle.style.fontSize = 50;VisualElement ve = toggle.Query<VisualElement>().AtIndex(2);ve.style.marginRight = 10;toggle.RegisterValueChangedCallback(e => OnValueChanged(index, e));groupBox.Add(toggle);}private void OnValueChanged(int index, ChangeEvent<bool> e) { // value变化回调函数Debug.Log("index=" + index + ", previousValue=" + e.previousValue + ", newValue=" + e.newValue);}
}

        运行后,点击 Second、Third,显示如下。  

        打印日志如下。

6 RadioButton(单选框)

        RadioButton 官方介绍见→UXML element RadioButton。

        1)属性介绍

  • Label:单选框标签。
  • Value:单选框的选中状态。
  • Text:单选框后面的文本。

        2)事件响应

        RadioButtonDemo.cs

using UnityEngine;
using UnityEngine.UIElements;public class RadioButtonDemo : MonoBehaviour {private VisualElement root; // 根容器private GroupBox groupBox; // 分组盒子private string[] choiceLabel = new string[] {"First", "Second", "Third", "Fourth"}; // choice的标签private void Awake() {root = GetComponent<UIDocument>().rootVisualElement;groupBox = root.Q<GroupBox>();groupBox.text = "RadioButtonDemo";groupBox.style.fontSize = 50;root.Add(groupBox);for (int i = 0; i < choiceLabel.Length; i++) {AddChoice(i);}}private void AddChoice(int index) { // 添加单选项RadioButton choice = new RadioButton();choice.text = choiceLabel[index];choice.style.fontSize = 50;VisualElement ve = choice.Query<VisualElement>().AtIndex(2);ve.style.marginRight = 10;choice.RegisterValueChangedCallback(e => OnValueChanged(index, e));groupBox.Add(choice);}private void OnValueChanged(int index, ChangeEvent<bool> e) { // 选项变化回调函数Debug.Log("index=" + index + ", previousValue=" + e.previousValue + ", newValue=" + e.newValue);}
}

        运行后,点击 Second,显示如下。 

        打印日志如下。

7 RadioButtonGroup(单选按钮组)

        RadioButtonGroup 官方介绍见→UXML element RadioButtonGroup。

        1)属性介绍

  • Label:单选按钮组标签。
  • Value:当前选中的单选按钮索引。
  • Choices:单选按钮后面的文本,通过 "," 隔开的字符串数组。

        2)配置单选按钮组

        配置 RadioButtonGroup 如下。

        展开 RadioButtonGroup,发现其下自动添加了 4 个 RadioButton,如下。 

        显示如下。

        3)事件响应

        RadioButtonGroupDemo.cs

using UnityEngine;
using UnityEngine.UIElements;public class RadioButtonGroupDemo : MonoBehaviour {private VisualElement root; // 根容器private string[] choices = new string[] {"First", "Second", "Third", "Fourth"}; // choices的标签private void Awake() {root = GetComponent<UIDocument>().rootVisualElement;RadioButtonGroup group = root.Q<RadioButtonGroup>();group.label = "";group.choices = choices;group.style.fontSize = 50;group.RegisterValueChangedCallback(OnValueChanged);}private void OnValueChanged(ChangeEvent<int> e) { // value变化回调函数Debug.Log("previousValue=" + e.previousValue + ", newValue=" + e.newValue);}
}

        运行后,点击 Second,显示如下。 

        打印日志如下。

8 Slider 和 SliderInt(滑动条)

        Slider 官方介绍见→UXML element Slider,SliderInt 官方介绍见→UXML element SliderInt。

        1)属性介绍

  • Label:滑动条标签。
  • Value:滑动条的数值。
  • Low Value:滑动条的最小值。
  • High Value:滑动条的最大值。
  • Page Size:单击滑动条时,Value 的变化量;Page Size取 0 时,单击滑动条,value 取鼠标位置的滑动数值。
  • Show Input Field:显示滑动条的数值。
  • Direction:滑动条的方向,取值有 Horizontal(水平的)、Vertical(垂直的)。
  • Inverted:随 value 值的增大,滑动条反向增长。

        2)事件响应

        SliderDemo.cs

using UnityEngine;
using UnityEngine.UIElements;public class SliderDemo : MonoBehaviour {private VisualElement root; // 根容器private void Awake() {root = GetComponent<UIDocument>().rootVisualElement;Slider slider = root.Q<Slider>();slider.style.width = 500;slider.RegisterValueChangedCallback(OnValueChanged);}private void OnValueChanged(ChangeEvent<float> e) { // value变化回调函数Debug.Log("previousValue=" + e.previousValue + ", newValue=" + e.newValue);}
}

         运行后,滑动滑块,打印日志如下。 

9 ProgressBar(进度条)

        ProgressBar 官方介绍见→UXML element ProgressBar。

         1)属性介绍

  • Low Value:进度条的最小值。
  • High Value:进度条的最大值。
  • Title:进度条中间的标题。

        2)事件响应

        ProgressBarDemo.cs


using System.Collections;
using UnityEngine;
using UnityEngine.UIElements;public class ProgressBarDemo : MonoBehaviour {private VisualElement root; // 根容器private ProgressBar progressBar; // 进度条private void Awake() {root = GetComponent<UIDocument>().rootVisualElement;progressBar = root.Q<ProgressBar>();progressBar.style.width = 500;progressBar.value = progressBar.lowValue;progressBar.Query<VisualElement>().AtIndex(2).style.backgroundColor = Color.grey; // 进度条背景色progressBar.Query<VisualElement>().AtIndex(3).style.backgroundColor = Color.green; // 进度条颜色progressBar.RegisterValueChangedCallback(OnValueChanged);StartCoroutine(Progress());}private IEnumerator Progress() { // 更新进度条while (progressBar.value < progressBar.highValue) {progressBar.value += 0.2f;yield return null;}}private void OnValueChanged(ChangeEvent<float> e) { // value变化回调函数Debug.Log("previousValue=" + e.previousValue + ", newValue=" + e.newValue);}
}

        说明:这里通过协程更新进度条(协程的介绍详见→协同程序),在 OnValueChanged 中打印进度条的进度。

        运行效果如下。  

10 Dropdown(下拉列表)

        Dropdown 官方介绍见→UXML element DropdownField。

         1)属性介绍

  • Label:下拉列表标签。
  • Index:选中的选项的索引。
  • Choices:选项的文本,通过 "," 隔开的字符串数组。

        2)配置下拉列表

        配置 Dropdown 如下。

         显示如下。

        3)事件响应

        DropdownDemo.cs

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;public class DropdownDemo : MonoBehaviour {private VisualElement root; // 根容器private List<string> choices = new List<string> {"First", "Second", "Third", "Fourth"}; // choices的标签private void Awake() {root = GetComponent<UIDocument>().rootVisualElement;DropdownField dropdown = root.Q<DropdownField>();dropdown.style.width = 600;dropdown.choices = choices;dropdown.RegisterValueChangedCallback(OnValueChanged);}private void OnValueChanged(ChangeEvent<string> e) { // value变化回调函数Debug.Log("previousValue=" + e.previousValue + ", newValue=" + e.newValue);}
}

        运行后,点击 Second,显示如下。  

        打印日志如下。

11 Foldout(折叠列表)

        Foldout 官方介绍见→UXML element Foldout。

        1)属性介绍

  • Text:折叠列表文本。
  • Value:折叠列表的展开状态,true 表示展开,false 表示收缩。

        2)添加元素

        将元素拖拽到 Foldout 上,会自动放在其 unity-content 元素下面,如下。 

        显示如下。

        3)事件响应

using UnityEngine;
using UnityEngine.UIElements;public class FoldoutDemo : MonoBehaviour {private VisualElement root; // 根容器private Foldout foldout; // 折叠列表private string[] items = new string[] {"First", "Second", "Third", "Fourth"}; // items的标签private void Awake() {root = GetComponent<UIDocument>().rootVisualElement;foldout = root.Q<Foldout>();for(int i = 0; i < items.Length; i++) {AddItems(items[i]);}foldout.RegisterValueChangedCallback(OnValueChanged);}private void AddItems(string text) {Label label = new Label(text);foldout.Add(label);}private void OnValueChanged(ChangeEvent<bool> e) { // value变化回调函数Debug.Log("previousValue=" + e.previousValue + ", newValue=" + e.newValue);}
}

        运行后,点击折叠三角形,打印日志如下。  

相关文章:

【Unity3D】UI Toolkit元素

1 前言 UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery、Debugger&#xff0c;UI Toolkit容器 中介绍了 VisualElement、ScrollView、ListView、GroupBox 等容器&#xff0c;UI Toolkit样式选择器 中介绍了简单选择器、复杂选择器、伪类选择器等样式选择器&#xff0c;…...

Task :app:compileDebugKotlin FAILED

gradle.properties 里面加上 android.enableJetifiertrue...

Android——数据存储(一)(二十一)

1. 数据存储 1.1 知识点 &#xff08;1&#xff09;掌握Android数据存储的分类&#xff1b; &#xff08;2&#xff09;可以使用SharedPreferences存储数据。 1.2 具体内容 对于我们数据的存储而言&#xff0c;Android一共提供了5个数据存储的方式&#xff1a;SharedPrefe…...

机器学习课后习题 ---数学基础回顾

(一)选择题 1.函数y=1/(x+1)是 A.偶函数 B.奇函数 C.单调函数 D.无界函数 2.设f(sin(x/2)=cosx+1,则f(x)为() A.2x-2 B.2-2x C.1+2 …...

CS420 课程笔记 P4 - 以16进制形态编辑游戏文件

文章目录 IntroductionFinding save filesStringsUnicodeExample!Value searchHealth searchConclusion Introduction 这节课我们将学习编辑十六进制&#xff0c;主要用于编辑保存文件&#xff0c;但十六进制编辑涉及的技能可以很好地转移到&#xff1a; Save file editingRe…...

计算机毕设之Python的高校成绩分析(含文档+源码+部署)

本系统阐述的是一个高校成绩分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。…...

【Sentinel】核心API-Entry与Context

文章目录 一、Entry1、Entry的声明2、使用API自定义资源3、基于SentinelResource注解标记资源 二、Context1、Context介绍2、Context的初始化3、AbstractSentinelInterceptor4、ContextUtil 一、Entry 1、Entry的声明 默认情况下&#xff0c;Sentinel会将controller中的方法作…...

HashMap源码阅读解惑

HashMap的hash函数&#xff08;1.8&#xff09; 首先1.7的是四次扰动&#xff0c;1.8做了优化。 简单的说就是对key做hashCode操作&#xff0c;然后将得到的32为散列值向右位移16位&#xff0c;再与hashCode做异或计算。实质上是把一个数的低16位与他的高16位做异或运算。 st…...

如何解决前端传递数据给后端时精度丢失问题

解决精度丢失 有时候我们在进行修改操作时&#xff0c;发现修改既不报错也不生效。我们进行排查后发现服务器端将数据返回给前端时没有出错&#xff0c;但是前端js将数据进行处理时却出错了&#xff0c;因为id是Long类型的&#xff0c;而js在处理后端返回给前端的Long类型数据…...

使用Maven创建父子工程

&#x1f4da;目录 创建父工程创建子模块创建子模块示例创建认证模块(auth) 结束 创建父工程 选择空项目&#xff1a; 设置&#xff1a;项目名称&#xff0c;组件名称&#xff0c;版本号等 创建完成后的工程 因为我们需要设置这个工程为父工程所以不需要src下的所有文件 在pom…...

Vue+elementUI 导出word打印

import JSZipUtils from "jszip-utils"; import JSZip from "pizzip"; import Docxtemplater from "docxtemplater"; npm安装以上依赖 首先维护个word模板 导出方法 //导出wordskipOutWord(row) {var printData rowconst data JSON.parse(JS…...

数学建模-点评笔记 9月3日

1.摘要&#xff1a;关键方法和结论&#xff08;精炼的语言&#xff09;要说明&#xff0c;方法的合理性和意义也可以说明。 评委先通过摘要筛选&#xff08;第一轮&#xff09; 2.时间序列找异常值除了3西格玛还有针对时间序列更合适寻找的方法 3.模型的优缺点要写的详细一点…...

使用Spring来管理对象关系映射(ORM)

简介 对象关系映射&#xff08;Object-Relational Mapping&#xff0c;简称ORM&#xff09;是一种技术&#xff0c;用于在面向对象程序和关系型数据库之间进行数据的映射。Spring框架提供了强大的支持来简化和优化ORM开发过程。本文将介绍如何使用Spring来管理对象关系映射。 …...

【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka

作者简介 前言 博主之前写过一个完整的MQ系列&#xff0c;包含RabbitMQ、RocketMQ、Kafka&#xff0c;从安装使用到底层机制、原理。专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12142400.html?spm1001.2014.3001.5482 本文是该系列的清单综述&#xf…...

算法:删除有序数组中的重复项---双指针[3]

1、题目&#xff1a; 对给定的有序数组 nums 删除重复元素&#xff0c;在删除重复元素之后&#xff0c;每个元素只出现一次&#xff0c;并返回新的长度&#xff0c;上述操作必须通过原地修改数组的方法&#xff0c;使用 O(1) 的空间复杂度完成。 2、分析特点&#xff1a; 题目…...

AR产业变革中的“关键先生”和“关键力量”

今年6月的WWDC大会上&#xff0c;苹果发布了头显产品Vision Pro&#xff0c;苹果CEO库克形容它&#xff1a; 开启了空间计算时代。 AR产业曾红极一时&#xff0c;但因为一些技术硬伤又减弱了声量&#xff0c;整个产业在起伏中前行。必须承认&#xff0c;这次苹果发布Vision P…...

通过 Blob 对二进制流文件下载实现文件保存下载

原理&#xff1a;前端将二进制文件做转换实现下载: 请求后端接口->接收后端返回的二进制流(通过二进制流&#xff08;Blob&#xff09;下载,把后端返回的二进制文件放在 Blob 里面)->再通过file-saver插件保存 页面上使用&#xff1a; <span click"downloadFil…...

微信小程序使用lime-echart踩坑记录

一、使用echarts包 微信小程序项目使用的是uni-app&#xff0c;插件是lime-echart&#xff0c;版本一开始安装的是lime-echart-0.7.9&#xff1b;在项目分包之后&#xff0c;为了避免主包过大&#xff0c;就将这个插件也一并搬到了分包中&#xff0c;在微信开发者工具中表现出…...

Unity 编辑器资源导入处理函数 OnPostprocessTexture :深入解析与实用案例

Unity 编辑器资源导入处理函数 OnPostprocessTexture 用法 点击封面跳转下载页面 简介 在Unity中&#xff0c;我们可以使用编辑器资源导入处理函数&#xff08;OnPostprocessTexture&#xff09;来自定义处理纹理资源的导入过程。这个函数是继承自AssetPostprocessor类的&…...

stable diffusion实践操作-宽高设置以及高清修复

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、SD宽高怎么设置&#xff1f;1.1 宽高历史 二、高清修复1. 文生图中的高清修复1.按钮Hires.fix2.不同放大算法对比1.第一类2.第二类3.第三类4.第四类5.第五类6.第六类7.第七类8.第八类9.第九类10.第十类11…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...

Go 并发编程基础:select 多路复用

select 是 Go 并发编程中非常强大的语法结构&#xff0c;它允许程序同时等待多个通道操作的完成&#xff0c;从而实现多路复用机制&#xff0c;是协程调度、超时控制、通道竞争等场景的核心工具。 一、什么是 select select 类似于 switch 语句&#xff0c;但它用于监听多个通…...