版本:2021.3+
此示例演示了如何在自定义检视面板、自定义编辑器和序列化对象之间创建绑定。
此示例创建了以下内容:
InspectorElement 中创建相同绑定的自定义 Editor 窗口。
您可以在此 GitHub 代码仓库中找到此示例创建的完整文件。
本指南适用于熟悉 Unity 编辑器、UI 工具包和 C# 脚本的开发者。在开始之前,请熟悉以下内容:
定义一个名为 TankScript 的自定义 Inspector UI 类,使用 USS 对其进行样式设置,并在 UXML 中设置视觉元素和绑定路径。
在项目 (Project) 窗口中,创建一个名为 create-a-binding-inspector 的文件夹来存储所有文件。
创建一个名为 TankScript.cs 的 C# 脚本,并将其内容替换为以下内容:
using UnityEngine;
[ExecuteInEditMode]
public class TankScript : MonoBehaviour
{
public string tankName = "Tank";
public float tankSize = 1;
private void Update()
{
gameObject.name = tankName;
gameObject.transform.localScale = new Vector3(tankSize, tankSize, tankSize);
}
}
在 create-a-binding-inspector 文件夹中,创建一个名为 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);
}
创建一个名为 tank_inspector_uxml.uxml 的 UXML 文件,并将其内容替换为以下内容:
<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" />
</VisualElement>
</UXML>
创建一个 C# 脚本来注册 TankScript 的自定义检视面板。无需调用 Bind() 方法,因为 Inspector 窗口中的绑定是隐式的。
创建一个名为 TankEditor.cs 的 C# 脚本,并将其内容替换为以下代码:
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
[CustomEditor(typeof(TankScript))]
public class TankEditor : Editor
{
[SerializeField]
VisualTreeAsset visualTree;
public override VisualElement CreateInspectorGUI()
{
var uxmlVE = visualTree.CloneTree();
return uxmlVE;
}
}
在项目 (Project) 窗口中,选择 TankEditor.cs。
将 tank_inspector_uxml.uxml 拖动到检视面板 (Inspector) 中的视觉树 (Visual Tree)。
在检视面板 (Inspector) 中将 tank_inspector_styles.uss 拖动到样式表。
TankScript.cs 拖动到检视面板 (Inspector) 中的添加组件 (Add Component)。这会在检视面板 (Inspector) 中生成 Tank Script 组件。InspectorElement 绑定创建一个自定义 Editor 窗口,其中包含两个绑定到 TankScript 对象的字段。创建一个调用 InspectorElement 构造函数的 C# 脚本。InspectorElement 会创建 UI 并将 UI 自动绑定到对象。
创建一个名为 SimpleBindingExampleInspectorElement.cs 的 C# 文件,并将其内容替换为以下内容:
using UnityEditor;
using UnityEngine;
using UnityEditor.UIElements;
namespace UIToolkitExamples
{
public class SimpleBindingExampleInspectorElement : EditorWindow
{
[MenuItem("Window/UIToolkitExamples/Simple Binding Example Inspector Element")]
public static void ShowDefaultWindow()
{
var wnd = GetWindow<SimpleBindingExampleInspectorElement>();
wnd.titleContent = new GUIContent("Simple Binding with Inspector Element");
}
TankScript m_Tank;
public void OnEnable()
{
m_Tank = FindObjectOfType<TankScript>();
if (m_Tank == null)
return;
var inspector = new InspectorElement(m_Tank);
rootVisualElement.Add(inspector);
}
}
}