包含此页的版本:
不含此页的版本:
版本: 2021.3+
此示例演示如何在绑定序列化属性更改时接收回调。
此示例创建一个自定义编辑器窗口,其中包含一个 TextField,该 TextField 绑定到游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表在场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表.如果游戏对象的名称为GameObject时,文本字段标签的背景颜色将变为深红色。
您可以在此 GitHub 存储库中找到该示例的已完成文件。
本指南适用于熟悉 Unity 编辑器、UI 工具包和 C# 脚本的开发人员。在开始之前,请熟悉以下内容:
创建一个 C# 脚本,该脚本:
CheckName()每当序列化属性的值发生变化时,方法TrackPropertyValue()扩展方法Unbind()在调用TrackPropertyValue()再次在另一处房产上。一个VisualElement在任何给定时间只能跟踪一个属性。
使用任何模板在 Unity 中创建项目。
在您的项目窗口一个窗口,显示您的内容Assets文件夹(项目选项卡)更多信息
在术语表中查看,创建一个名为callback-SerializedProperty-changes以存储您的文件。
在 callback-SerializedProperty-change 文件夹中,创建一个名为Editor.
在 Editor 文件夹中,创建一个名为SimpleBindingPropertyTrackingExample.cs并将其内容替换为以下内容:
using UnityEditor;
using UnityEngine;
using UnityEditor.UIElements;
using UnityEngine.UIElements;
namespace UIToolkitExamples
{
public class SimpleBindingPropertyTrackingExample : EditorWindow
{
TextField m_ObjectNameBinding;
[MenuItem("Window/UIToolkitExamples/Simple Binding Property Tracking Example")]
public static void ShowDefaultWindow()
{
var wnd = GetWindow<SimpleBindingPropertyTrackingExample>();
wnd.titleContent = new GUIContent("Simple Binding Property Tracking");
}
public void CreateGUI()
{
m_ObjectNameBinding = new TextField("Object Name Binding");
rootVisualElement.Add(m_ObjectNameBinding);
OnSelectionChange();
}
public void OnSelectionChange()
{
GameObject selectedObject = Selection.activeObject as GameObject;
if (selectedObject != null)
{
// Create the SerializedObject from the current selection
SerializedObject so = new SerializedObject(selectedObject);
// Note: the "name" property of a GameObject is actually named "m_Name" in serialization.
SerializedProperty property = so.FindProperty("m_Name");
// Ensure to use Unbind() before tracking a new property
m_ObjectNameBinding.Unbind();
m_ObjectNameBinding.TrackPropertyValue(property, CheckName);
// Bind the property to the field directly
m_ObjectNameBinding.BindProperty(property);
CheckName(property);
}
else
{
// Unbind any binding from the field
m_ObjectNameBinding.Unbind();
}
}
void CheckName(SerializedProperty property)
{
if (property.stringValue == "GameObject")
{
m_ObjectNameBinding.style.backgroundColor = Color.red * 0.5f;
}
else
{
m_ObjectNameBinding.style.backgroundColor = StyleKeyword.Null;
}
}
}
}
GameObject,标签的背景颜色将变为深红色。