首页 > 其他分享 >【Unity3D】UI Toolkit容器

【Unity3D】UI Toolkit容器

时间:2023-10-18 21:45:15浏览次数:52  
标签:Unity3D rootVisualElement VisualElement 容器 Toolkit private item UI 鼠标

1 前言

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

2 VisualElement(空容器)

​ VisualElement 是一个空容器,便于组织和管理元素,官方介绍见→UXML element VisualElement

1)属性介绍

img

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

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

2)获取根 VisualElement 容器

VisualElement rootVisualElement = GetComponent<UIDocument>().rootVisualElement;

3)注册事件回调(RegisterCallback)

​ RegisterCallbackDemo.cs

using UnityEngine;
using UnityEngine.UIElements;

public class RegisterCallbackDemo : MonoBehaviour {
    private void Awake() {
        VisualElement rootVisualElement = GetComponent<UIDocument>().rootVisualElement;
        rootVisualElement.RegisterCallback<MouseDownEvent>(OnClickDown);
        rootVisualElement.RegisterCallback<ClickEvent>(OnClick);
    }

    private void OnClickDown(MouseDownEvent e) { // 鼠标按下时事件回调
        Debug.Log("mousePosition=" + e.mousePosition + ", pressedButtons=" + e.pressedButtons); // 1:左键, 2:右键, 4:中键
    }

    private void OnClick(ClickEvent e) { // 鼠标左键点击时事件回调
        Debug.Log("target=" + e.target);
    }
}

​ 说明:注册的事件主要有以下几种,官方介绍见→Event reference

  • MouseDownEvent:鼠标按下时触发的事件。
  • MouseUpEvent:鼠标抬起时触发的事件。
  • ClickEvent:鼠标左键点击时触发的事件。
  • MouseOverEvent:鼠标进入元素时触发的事件。
  • MouseOutEvent:鼠标离开元素时触发的事件。
  • MouseMoveEvent:鼠标移动时触发的事件。
  • MouseEnterEvent:鼠标进入元素或其子元素时触发的事件。
  • MouseLeaveEvent:鼠标离开元素和其所有子元素时触发的事件。
  • MouseCaptureEvent:处理器开始捕获鼠标后触发的事件。
  • MouseCaptureOutEvent:处理器停止捕获鼠标后触发的事件。
  • MouseEnterWindowEvent:鼠标进入窗口时触发的事件。
  • MouseLeaveWindowEvent:鼠标离开窗口时触发的事件。
  • WheelEvent:鼠标滑轮滚动时触发的事件。

4)添加事件操作器(AddManipulator)

​ ManipulatorDemo.cs

using UnityEngine;
using UnityEngine.UIElements;

public class ManipulatorDemo : MonoBehaviour {
    private VisualElement rootVisualElement;

    private void Awake() {
        rootVisualElement = GetComponent<UIDocument>().rootVisualElement;
        Clickable leftClickManipulator = new Clickable(OnCtrlDoubleClicked);
        leftClickManipulator.activators.Clear();
        leftClickManipulator.activators.Add(new ManipulatorActivationFilter() {
            button = MouseButton.LeftMouse, // 鼠标左键
            clickCount = 2, // 点击次数
            modifiers = EventModifiers.Control // 按键
        });
        rootVisualElement.AddManipulator(leftClickManipulator);
    }

    private void OnCtrlDoubleClicked(EventBase e) { // Ctrl+Double Click事件回调
        Debug.Log("OnCtrlDoubleClicked");
    }
}

3 ScrollView(滚动容器)

1)属性介绍

​ ScrollView 是一个滚动容器,官方介绍见→UXML element ScrollView

img

  • Mode:控制用户滚动内容的方式,取值有 Vertical(垂直滚动)、Horizontal(水平滚动)、Vertical And Horizontal(垂直和水平滚动)。
  • Nested Interaction Kind:滑动到边界后的行为,取值有 default(反弹)、Stop Scrolling(停止滑动)、Forward Scrolling(继续向前滑动)。
  • Horizontal Scroller Visibility:水平滚动条的可见性,取值有 Auto(仅在内容显示不下时才显示滑动条)、Always Visible(一直可见)、Hidden(一直隐藏)。
  • Vertical Scroller Visibility:垂直滚动条的可见性,取值有 Auto(仅在内容显示不下时才显示滑动条)、Always Visible(一直可见)、Hidden(一直隐藏)。
  • Horizontal Page Size:控制水平滑动的速度。
  • Vertical Page Size:控制垂直滑动的速度。
  • Touch Scroll Type:触摸滑动类型,Unrestricted(不受约束的)、Elastic(弹性的)、Clamped(夹紧的)。
  • Scroll Deceleration Rate:滑动停止时的减速度(速度的导数,为 0 时立刻停止滑动)。
  • Elasticity:滑动到边界时的弹性值。

2)添加元素

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

img

​ 也可以通过以下代码添加元素。

VisualElement rootVisualElement = GetComponent<UIDocument>().rootVisualElement;
ScrollView scrollview = rootVisualElement.Q<ScrollView>();
scrollview.Add(new Label("LabelContent"));

4 ListView(列表)

​ ListView 是一个列表容器,官方介绍见→UXML element ListView

1)属性介绍

img

  • BindingPath:目标属性绑定的路径。
  • Fixed Item Height:列表中 item 的高度,以像素为单位。
  • Virtualization Method:设置 item 高度是固定的还是动态的,取值有 Fixed Height(固定高度)、Dynamic Height(动态高度)。
  • Show Border:是否显示边框。
  • Selection Type:选择类型,取值有 None(禁止选中)、Single(只能选中单个 item)、Multiple(可以选中多个 item)。
  • Show Alternation Row Backgrounds:显示交替行背景,取值有 None(不显示交替行背景)、Content Only(有内容时才显示交替行背景)、All(一直显示交替行背景)。
  • Show Foldout Header:是否显示折叠页眉。
  • Header Title:页眉标题。
  • Show Add Remove Footer:是否显示添加 / 删除页脚,如果显示,在页脚会出现 "+" 和 "-" 按钮。
  • Reorderable:是否允许 item 重排序。
  • Reorder Mode:重排序模式,取值有 Simple(在重排序时显示标准的蓝线拖动器)、Animated(在每个 item 之前添加拖拽句柄,可以用来拖拽单个 item)。
  • Show Bound Collection Size:是否显示 item 数。
  • Horizontal Scrolling:是否可以水平滑动。

2)ListView 的使用

​ ListViewDemo.cs

using UnityEngine;
using UnityEngine.UIElements;
using System.Collections.Generic;

public class ListViewDemo : MonoBehaviour {
    private VisualElement root; // 根容器
    private ListView listView; // 列表
    private string[] itemsTitle = new string[] {"First", "Second", "Third", "Fourth"}; // item的标题
    private int[] itemsData = new int[]{0, 1, 2, 3}; // item的数值

    private void Awake() {
        root = GetComponent<UIDocument>().rootVisualElement;
        listView = root.Q<ListView>();
        listView.fixedItemHeight = 60;
        listView.itemsSource = itemsData;
        listView.makeItem += MakeItem;
        listView.bindItem += BindItem;
        listView.onSelectionChange += OnSelectionChange;
    }

    private VisualElement MakeItem() { // 创建item元素, 这里以Label元素呈现item
        Label label = new Label();
        label.style.fontSize = 50;
        label.style.unityTextAlign = TextAnchor.MiddleLeft;
        return label;
    }

    private void BindItem(VisualElement visualElement, int index) { // 绑定item
        Label label = visualElement as Label;
        label.text = itemsTitle[index];
    }

    private void OnSelectionChange(IEnumerable<object> objs) { // 选中事件回调
        foreach (object item in objs) {
            int data = (int) item;
            Debug.Log(data);
        }
    }
}

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

img

​ 打印日志如下。

img

5 GroupBox(分组盒子)

​ GroupBox 是一个逻辑分组容器,官方介绍见→UXML element GroupBox

1)属性介绍

img

  • Text: 分组标题。

2)GroupBox 的使用

​ GroupBoxDemo.cs

using UnityEngine;
using UnityEngine.UIElements;

public class GroupBoxDemo : 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 = "GroupBoxDemo";
        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,显示如下。

img

​ 打印日志如下。

img

​ 声明:本文转自【Unity3D】UI Toolkit容器

标签:Unity3D,rootVisualElement,VisualElement,容器,Toolkit,private,item,UI,鼠标
From: https://www.cnblogs.com/zhyan8/p/17760976.html

相关文章

  • 无涯教程-Arduino - 程序结构
    在本章中,我们将深入研究Arduino程序的结构,并学习Arduino世界中使用的更多新术语,Arduino软件是开源的,Java环境的源代码在GPL下发布,而C/C++微控制器库在LGPL下。Structure结构Arduino程序可分为三个主要部分:结构,值(变量和常量)和函数,在本教程中,我们将了解Arduino软件程序,以及......
  • 如何修复 macOS 系统 UI 突然卡死的 bug All In One
    如何修复macOS系统UI突然卡死的bugAllInOne逻辑蓝牙鼠标对系统UI界面操作无任何反应问题排查蓝牙鼠标电量不足,导致信号混乱了❌解决方案给蓝牙鼠标更换一个新电池✅demos(......
  • RunnerGo 支持UI自动化的测试平台
    RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块,覆盖了整个产品测试周期。RunnerGoUI自动化基于Selenium浏览器自动化方案构建,内嵌高度可复用的测试脚本,测试团队无需复杂的代码编写即可开展低代码的自动化测试。以一条简单的搜索场景为例,本文介绍Runn......
  • 无涯教程-Arduino - 主板描述
    在本章中,我们将学习Arduino板上的不同组件,我们将研究ArduinoUNO板,因为它是Arduino板家族中最受欢迎的板,此外,它是入门电子和编码的最佳板,有些开发板看起来与下面给出的开发板有些不同,但是大多数Arduino在这些组件中大多数都是相同的。电源USBArduino板可使用计算机的USB电缆......
  • RunnerGo 支持UI自动化的测试平台
    RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块,覆盖了整个产品测试周期。RunnerGoUI自动化基于Selenium浏览器自动化方案构建,内嵌高度可复用的测试脚本,测试团队无需复杂的代码编写即可开展低代码的自动化测试。 以一条简单的搜索场景为例,本文......
  • 无涯教程-Arduino - 简介
    Arduino是基于易于使用的硬件和软件的开源平台。它由一块可进行编程的电路板(称为微控制器)和一个称为ArduinoIDE(集成开发环境)的现成软件组成,该软件用于将计算机代码编写并上传到物理板上。关键特征是-Arduino板能够读取来自不同传感器的模拟或数字输入信号,并将其转换为输......
  • 使用 LF Edge eKuiper 将物联网流处理数据写入 Databend
    作者:韩山杰DatabendCloud研发工程师https://github.com/hantmacLFEdgeeKuiper是Golang实现的轻量级物联网边缘分析、流式处理开源软件,可以运行在各类资源受限的边缘设备上。eKuiper的主要目标是在边缘端提供一个流媒体软件框架(类似于ApacheFlink(opensnewwindo......
  • [MAUI]深入了解.NET MAUI Blazor与Vue的混合开发
    @目录Vue在混合开发中的特点创建MAUI项目创建Vue应用使用element-ui组件库JavaScript和原生代码的交互传递根组件参数从设备调用Javascript代码从Vue页面调用原生代码读取设备信息项目地址.NETMAUI结合Vue的混合开发可以使用更加熟悉的Vue的语法代替Blazor语法,你现有项目不必重......
  • Burp Suite Extend APIs Notes
    Brup插件的开发,大体流程就是通过在自己创建的BurpExtender类上实现不同功能接口。所以,你想要开发出什么功能,就去找一下Burp上能提供什么接口,然后实现这个接口所需的方法即可。想要快速的开发的Burp插件、了解一下它的APIs是有必要的。下面我将梳理一下它提供出来的APIs。todoA......
  • Burp Suite 插件开发之UI界面——以Button举例
    Guide不管是什么软件,大多是需要UI界面的。BurpSuite的插件开发也不例外,某些场景下也需要配合UI界面才能更好操作插件的功能。UI界面的开发,无法是学习各种组件的使用方法,根据它们的使用特点去编写特定的事件函数。由于组件都是前人都写好的,我们只管拿过来使用即可,主要是熟悉组......