【Unity3D】UI Toolkit元素

news2024/12/24 21:50:12

1 前言

        UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery、Debugger,UI Toolkit容器 中介绍了 VisualElement、ScrollView、ListView、GroupBox 等容器,本文将介绍 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);
    }
}

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

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

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

相关文章

Nerd Font 字体安装

一、Nerd Font 是什么&#xff1f; Nerd Font 是为开发人员准备的&#xff0c;具有大量字形&#xff08;图标&#xff09;的字体。特别是从流行的“标志性字体”中添加大量额外的字形&#xff0c;如Font Awesome、Devicons、Octicons等。 二、安装步骤 1.克隆仓库 git clon…

【上海迪士尼度假区】技术解决方案

开源平台地址Giteehttps://gitee.com/issavior/disney 技术解决方案 1. 背景2. 技术架构3. 业务架构3.1 架构图3.2 说明 4. 技术能力4.1 自研中间件4.2 定制化中间件 5. 领域模型6. 数据模型7. 交易链路8. 状态机8. 接口文档 1. 背景 上海迪士尼度假区已运营近10年&#xff0c…

【微服务部署】四、Jenkins一键打包部署NodeJS(Vue)前端项目步骤详解

本文介绍使用Jenkins一键将NodeJS&#xff08;Vue&#xff09;前端项目打包并上传到生产环境服务器&#xff0c;这里使用的是直接打包静态页面&#xff0c;发送到远程服务器Nginx配置目录的方式&#xff0c;首先确保服务器环境配置好&#xff0c;安装Nginx&#xff0c;运行目录…

微软拼音输入法配置小鹤双拼

实现微软拼音能够使用小鹤双拼&#xff0c;再也不用下载搜狗输入法了 winR输入regedit&#xff0c;打开注册表 计算机\HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHS新建字符串值&#xff1a; 名字为&#xff1a;UserDefinedDoublePinyinScheme0值为 &#…

加杠杆平台怎么样_哪个平台可以给股票加杠杆?配先查

加杠杆是一种投资策略&#xff0c;以小额的资金进行更大规模的投资交易。这种策略通常在金融市场中使用&#xff0c;包括股票市场。然而&#xff0c;加杠杆投资并非适合所有人&#xff0c;因为它带有更高的风险和潜在的损失。那么哪个平台可以给股票加杠杆&#xff1f; 通过配先…

手写Mybatis:第12章-完善ORM框架,增删改查操作

文章目录 一、目标&#xff1a;完善增删改查二、设计&#xff1a;完善增删改查三、实现&#xff1a;完善增删改查3.1 工程结构3.2 完善增删改查类图3.3 扩展解析元素3.4 新增执行方法3.4.1 执行器接口添加update3.4.2 执行器抽象基类3.4.3 简单执行器 3.5 语句处理器实现3.5.1 …

CS420 课程笔记 P7 - 虚拟内存 多级指针寻址

文章目录 IntroPointersMemory leaksPointer pathPointer scanningExample! Intro 上节课我们学习了静态地址&#xff0c;这节课我们将着手关注动态地址&#xff0c;我们需要了解一个叫做指针的东西 Pointers 简单地说&#xff0c;指针是对象之间的单向连接 Pointers are co…

【 BlockChain 】零知识证明

【 BlockChain 】零知识证明 一、零知识证明起源 “零知识”的概念最早在80年代由麻省理工学院的研究人员 Shafi Goldwasser&#xff0c;Silvio Micali 和 Charles Rackoff 所提出。当时这些人正在研究与交互证明系统相关的问题——即一种理论系统&#xff0c;使得甲方&#…

QT6删除旧的编译文件,编译会出错,可以选择重新选择编译

QT6工程文件和编译文件的路径关系 下面是显示的工程情况 可能编译文件全部被删除&#xff0c;或者部分缺失 编译问题出现后的处理办法 删去编译工程时添加的内容&#xff0c;其中主要修改CMakeLists.txt中添加的内容&#xff0c;例如添加的路径或resource内容&#xff0c;可…

两个非递减顺序表合并成一个非递减顺序表

两个非递减顺序表合并成一个非递减顺序表 引入 以下这个例题的描述是关于合并两个有序的数组&#xff0c;然后合并之后同样也是一个非递减的顺序排列 但是我名这里讲的不是顺序表&#xff0c;而是封装成一个顺序表&#xff0c;但是我们这里的顺序表其实底层同样是一个数组&a…

复盘|攻防实战中面对“谍影重重”,如何出奇制胜?

随着“数字孪生”概念的深入人心&#xff0c;数字化转型的进展也是一日千里。与此同时&#xff0c;在网络世界中的攻防对抗热度有增无减&#xff0c;甚至连最顶级的安全团队一不小心也会中招。在攻防演练中发生过好几次这种情况&#xff1a;腾讯安全一线的分析人员在前方为攻击…

ATSHA204A国产替代新选择:LCSHA204

ATSHA204A是一款用于固件版权保护&#xff0c;防抄板仿克隆的加密芯片。包含多达16个密钥存储区用于安全存储密钥。同时提供OTP区用于存储用户固定信息。因推出时间早以及芯片本身的安全性在中国市场的使用量非常大。 受当前全球经济和大环境的影响造成该芯片供货严重不足&…

基于Python+DenseNet121算法模型实现一个图像分类识别系统案例

目录 介绍在TensorFlow中的应用实战案例最后 一、介绍 DenseNet&#xff08;Densely Connected Convolutional Networks&#xff09;是一种卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;2017年由Gao Huang等人提出。该网络的核心思想是密集连接&#xff0c;即每…

正中优配:怎样开通创业板交易权限?

创业板是我国证券商场的一种特别板块&#xff0c;主要面向创业型企业和高科技企业&#xff0c;至今已成为我国股票商场中较为热门的板块之一。关于投资者来说&#xff0c;能够在创业板中买卖不仅可以发掘到更多有潜力的企业&#xff0c;还可能带来更高的收益。那么&#xff0c;…

关于DC电源模块的过流保护功能说明

BOSHIDA 关于DC电源模块的过流保护功能说明 DC电源模块是一种常见的电源供应模块&#xff0c;广泛应用于各种电子设备和系统中。为了确保电源模块的安全和可靠性&#xff0c;通常会设置过流保护功能。 过流保护功能是指当电源模块输出电流超过额定电流时&#xff0c;会自动切…

CountDownLatch原理-(主线程等待子线程结束再执行)

CountDownLatch是共享锁的一种实现,它默认构造 AQS 的 state 值为 count。当线程使用countDown方法时,其实使用了tryReleaseShared方法以CAS的操作来减少state,直至state为0就代表所有的线程都调用了countDown方法。当调用await方法的时候&#xff0c;如果state不为0&#xff0…

zabbix监控实战

1 zabbix监控平台部署 更改的密码为HLThlt123 创建zabbix数据库 配置zabbix server 配置zabbix前端 启动服务 访问 更改成中文 修改字体文件 2 zabbix添加监控节点 在客户端 在server端 手动添加 自动添加 03 zabbix api 自动注册 停掉自动发现 删掉server3 自动注册 3 zab…

通讯软件015——分分钟学会Kepware OPC HDA Server仿真配置

本文介绍如何使Kepware软件仿真OPC HAD Server配置。相关软件可登录网信智汇&#xff08;wangxinzhihui.com&#xff09;下载。 1、创建1个数据源&#xff1a;本案例采用“Graybox.Simulator.1”作为数据源。连接OPC Server数据源“Graybox.Simulator.1”。 右键点击“连通性”…

Ubuntu下Python3与Python2相互切换

参考文章&#xff1a;https://blog.csdn.net/Nicolas_shen/article/details/124144931 设置优先级 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 200