版本: 2021.3+
本示例演示了如何在 UXML 中的 BindableElement 使用 binding-path
属性将字段绑定到 SerializedObject 的嵌套属性。
本示例创建了一个自定义的 InspectorUnity 窗口,用于显示当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑值。 更多信息
参见 术语表 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表,它包含以下内容:
您可以在这个 GitHub 仓库 中找到此示例创建的完整文件。
本指南适用于熟悉 Unity 编辑器、UI 工具包和 C# 脚本的开发人员。在开始之前,请熟悉以下内容:
BindableElement
PropertyField
创建 C# 脚本以定义一个坦克类,该类具有生命值使其可破坏。
在 Unity 中使用任何模板创建一个项目。
在您的 项目窗口一个窗口,显示您的 Assets
文件夹的内容(项目选项卡)更多信息
参见 术语表 中,创建一个名为 bind-nested-properties
的文件夹来存储所有文件。
创建一个名为 DestructibleTankScript.cs
的 C# 脚本,并将它的内容替换为以下内容:
using System;
using UnityEngine;
using UnityEngine.Serialization;
[Serializable]
public struct Health
{
public int armor;
public int life;
}
[ExecuteInEditMode]
public class DestructibleTankScript : MonoBehaviour
{
public string tankName = "Tank";
public float tankSize = 1;
public Health health;
private void Update()
{
gameObject.name = tankName;
gameObject.transform.localScale = new Vector3(tankSize, tankSize, tankSize);
}
public void Reset()
{
health.armor = 100;
health.life = 10;
}
}
创建一个带有 BindableElement 的 UXML 文件。将 BindableElement 的 binding-path
设置为 health
属性,并将 BindableElement 每个子元素的 binding-path
设置为 health
的 armor
和 life
属性。
在 bind-nested-properties 文件夹中,创建一个名为 Editor
的文件夹。
在 Editor 文件夹中,创建一个名为 tank_inspector_styles.uss
的 USS 文件,并将它的内容替换为以下内容:
.container {
background-color: rgb(80, 80, 80);
flex-direction: column;
}
Label {
background-color: rgb(80, 80, 80);
}
TextField:hover {
background-color: rgb(255, 255, 0);
}
FloatField {
background-color: rgb(0, 0, 255);
}
创建一个名为 destructible_tank_editor.uxml
的 UI 文档,并将它的内容替换为以下内容:
<UXML xmlns="UnityEngine.UIElements" xmlns:ue="UnityEditor.UIElements">
<Style src="tank_inspector_styles.uss"/>
<VisualElement name="row" class="container">
<Label text="Tank Script - Custom Inspector" />
<ue:PropertyField binding-path="tankName" name="tank-name-field" />
<ue:PropertyField binding-path="tankSize" name="tank-size-field" />
<BindableElement binding-path="health">
<ue:PropertyField binding-path="armor"/>
<ue:PropertyField binding-path="life"/>
</BindableElement>
</VisualElement>
</UXML>
创建一个 C# 脚本,为 DestructibleTankScript
注册一个自定义编辑器。
创建一个名为 DestructibleTankEditor.cs
的 C# 脚本,并将它的内容替换为以下内容:
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
[CustomEditor(typeof(DestructibleTankScript))]
public class DestructibleTankEditor : Editor
{
[SerializeField]
VisualTreeAsset visualTreeAsset;
public override VisualElement CreateInspectorGUI()
{
return visualTreeAsset.CloneTree();
}
}
在项目窗口中选择 DestructibleTankEditor.cs
。
将 destructible_tank_editor.uxml
拖动到 Inspector 中的 可视树资源。
health.armor
和 health.life
属性。如果您更改 Inspector 中的值,底层属性的值也会发生改变。