Получение обратных вызовов при изменении связанного свойства
Версия: 2021.3+
В этом примере показано, как получать обратные вызова при изменении связанного серийного свойства.
Примерный обзор
В этом примере создается окно редактора с TextField, которое связано с именем GameObject в сцене. Если имя GameObject — это GameObject, цвет фона метки текстового поля изменяется на темно-красный.
Вы можете найти завершенные файлы для примера в этом хранилище GitHub.
Предварительные условия
Это руководство предназначено для разработчиков, знакомых со скриптами Unity Editor, UI Toolkit и C#. Перед началом работы ознакомьтесь со следующим:
Создание привязки для получения обратного вызова
Создайте скрипт C#, который:
- вызывает метод
CheckName()каждый раз, когда изменяется значение серийного свойства - регистрирует метод с методом расширения
TrackPropertyValue() - Вызывает
Unbind()перед повторным вызовомTrackPropertyValue()для другого свойства.
VisualElement может отслеживать только одно свойство в любой момент времени.
Создайте проект в Unity с любым шаблоном.
В окне Project создайте папку
callback-SerializedProperty-changesдля хранения ваших файлов.В папке callback-SerializedProperty-change создайте папку
Editor.-
В течение Редактор папка, создать C# скрипт назван
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; } } } }
Проверка привязки
- В Unity выберите Окно > UIToolkitExamples > Simple Binding Property Tracking Example. Появится окно пользовательского редактора с текстовым полем.
- Выберите любой GameObject в вашей сцене. Имя GameObject появится в текстовом поле окна редактора.
- Измените имя GameObject в текстовом поле. Если имя
GameObject, цвет фона метки изменится на темно-красный.