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。
VisualElement 是一個空容器,便於組織和管理元素,官方介紹見→UXML element VisualElement。
1)屬性介紹
說明: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。
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");
}
}
1)屬性介紹
ScrollView 是一個捲動容器,官方介紹見→UXML element ScrollView。
2)新增元素
將元素拖拽到 ScrollView 上,會自動放在其 unity-content-container 元素下面,如下。
也可以通過以下程式碼新增元素。
VisualElement rootVisualElement = GetComponent<UIDocument>().rootVisualElement;
ScrollView scrollview = rootVisualElement.Q<ScrollView>();
scrollview.Add(new Label("LabelContent"));
ListView 是一個列表容器,官方介紹見→UXML element ListView。
1)屬性介紹
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,顯示如下。
列印紀錄檔如下。
GroupBox 是一個邏輯分組容器,官方介紹見→UXML element GroupBox。
1)屬性介紹
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,顯示如下。
列印紀錄檔如下。
宣告:本文轉自【Unity3D】UI Toolkit容器。