Unity 6.3
0 онлайн 25 гостей 3 в системе
Вход

Получение обратных вызовов при изменении связанного свойства

Версия: 2021.3+

В этом примере показано, как получать обратные вызова при изменении связанного серийного свойства.

Примерный обзор

В этом примере создается окно редактора с TextField, которое связано с именем GameObject в сцене. Если имя GameObject — это GameObject, цвет фона метки текстового поля изменяется на темно-красный.

Окно пользовательского редактора, которое отображает поле с пользовательским цветом фона, чтобы служить в качестве предупреждения.
Окно пользовательского редактора, которое отображает поле с пользовательским цветом фона, чтобы служить в качестве предупреждения.

Вы можете найти завершенные файлы для примера в этом хранилище GitHub.

Предварительные условия

Это руководство предназначено для разработчиков, знакомых со скриптами Unity Editor, UI Toolkit и C#. Перед началом работы ознакомьтесь со следующим:

Создание привязки для получения обратного вызова

Создайте скрипт C#, который:

  • вызывает метод CheckName() каждый раз, когда изменяется значение серийного свойства
  • регистрирует метод с методом расширения TrackPropertyValue()
  • Вызывает Unbind() перед повторным вызовом TrackPropertyValue() для другого свойства.

VisualElement может отслеживать только одно свойство в любой момент времени.

  1. Создайте проект в Unity с любым шаблоном.

  2. В окне Project создайте папку callback-SerializedProperty-changes для хранения ваших файлов.

  3. В папке callback-SerializedProperty-change создайте папку Editor.

  4. В течение Редактор папка, создать 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;
                }
            }
        }
    }
    

Проверка привязки

  1. В Unity выберите Окно > UIToolkitExamples > Simple Binding Property Tracking Example. Появится окно пользовательского редактора с текстовым полем.
  2. Выберите любой GameObject в вашей сцене. Имя GameObject появится в текстовом поле окна редактора.
  3. Измените имя GameObject в текстовом поле. Если имя GameObject, цвет фона метки изменится на темно-красный.

Дополнительные ресурсы