Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Целью привязок является синхронизация свойств внутри объектов с видимым UI(пользовательский интерфейс) Позволяет пользователю взаимодействовать с ваше приложение. Подробнее
См. в Словарь
. Привязка относится к связи между свойством и визуальным элементом управления, который его изменяет.

Связывание выполняется между объектом и любым UIElement, который либо является производным от BindableElement, либо реализует интерфейс IBindable.

Из пространства имен UnityEditor.UIElements:

Базовый класс:

  • BaseCompositeField
  • BasePopupField
  • CompoundFields
  • TextValueField

Элементы управления:

  • InspectorElement
  • ProgressBar
  • BoundsField
  • BoundsIntField
  • ColorField
  • CurveField
  • DoubleField
  • EnumField
  • FloatField
  • GradientField
  • IntegerField
  • LayerField
  • LayerMaskField
  • LongField
  • MaskField
  • ObjectField
  • PopupField
  • PropertyControl
  • RectField
  • RectIntField
  • TagField
  • Vector2Field
  • Vector2IntField
  • Vector3Field
  • Vector3IntField
  • Vector4Field

Из пространства имен UnityEngine.UIElements:

Базовый класс

  • BaseField
  • BaseSlider
  • TextInputBaseField
  • TemplateContainer

Элементы управления

  • Foldout
  • MinMaxSlider
  • Slider
  • SliderInt
  • TextField
  • Toggle

Привязка выполняется с помощью следующих шагов при использовании элемента управления из одного из перечисленных выше пространств имен.

  1. В элементе управления укажите bindingPath из интерфейса IBindable, чтобы пользовательский интерфейс знал, какое свойство нужно привязать. Вы можете сделать это в C# или в UXML. Пример каждого приведен ниже в этом разделе.
  2. Создайте SerializedObject для связываемого объекта.
  3. Привяжите этот объект к элементу управления или одному из его родителей.

Связывание с C#

В следующем фрагменте кода показано, как создать привязку с помощью кода C#. Чтобы использовать этот фрагмент, сохраните этот пример как файл C# в папке редактора в вашем проекте. Назовите файл C# SimpleBindingExample.cs.

Содержимое файла SimpleBindingExample.cs:

using UnityEditor; using UnityEngine; using UnityEditor.UIElements; using UnityEngine.UIElements; namespace UIElementsExamples { public class SimpleBindingExample : EditorWindow { TextField m_ObjectNameBinding; [MenuItem("Window/UIElementsExamples/Simple Binding Example")] public static void ShowDefaultWindow() { var wnd = GetWindow<SimpleBindingExample>(); wnd.titleContent = new GUIContent("Simple Binding"); } public void OnEnable() { var root = this.rootVisualElement; m_ObjectNameBinding = new TextField("Object Name Binding"); m_ObjectNameBinding.bindingPath = "m_Name"; root.Add(m_ObjectNameBinding); OnSelectionChange(); } public void OnSelectionChange() { GameObject selectedObject = Selection.activeObject as GameObject; if (selectedObject != null) { // Create serialization object SerializedObject so = new SerializedObject(selectedObject); // Bind it to the root of the hierarchy. It will find the right object to bind to... rootVisualElement.Bind(so); // ... or alternatively you can also bind it to the TextField itself. // m_ObjectNameBinding.Bind(so); } else { // Unbind the object from the actual visual element rootVisualElement.Unbind(); // m_ObjectNameBinding.Unbind(); // Clear the TextField after the binding is removed m_ObjectNameBinding.value = ""; } } } }

В Unity выберите Окно > UIElementExamples > Простой пример привязки. Вы можете использовать это окно, чтобы выбрать любой игровой объект в вашей сцене и изменить его имя с отображаемым текстовым полем.

Связывание с UXML

В этом разделе показано, как использовать привязку через настройку иерархии UXML.

В UXML атрибут binding-path определяется в элементе управления TextFieldЭлемент управления TextField отображает неинтерактивный фрагмент текста для пользователя, например заголовок, метку для других элементов управления графического интерфейса или инструкцию. Подробнее
См. в Словарь
. Это то, что связывает элемент управления с эффективным свойством объекта.

Содержимое файла SimpleBindingExample.uxml:

<UXML xmlns:ui="UnityEngine.UIElements"> <ui:VisualElement name="top-element"> <ui:Label name="top-label" text="UXML-Defined Simple Binding"/> <ui:TextField name="GameObjectName" label="Name" text="" binding-path="m_Name"/> </ui:VisualElement> </UXML>

Содержимое файла SimpleBindingExample.cs:

using UnityEditor; using UnityEngine; using UnityEditor.UIElements; using UnityEngine.UIElements; namespace UIElementsExamples { public class SimpleBindingExampleUXML : EditorWindow { [MenuItem("Window/UIElementsExamples/Simple Binding Example UXML")] public static void ShowDefaultWindow() { var wnd = GetWindow<SimpleBindingExampleUXML>(); wnd.titleContent = new GUIContent("Simple Binding UXML"); } public void OnEnable() { var root = this.rootVisualElement; var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/SimpleBindingExample.uxml"); visualTree.CloneTree(root); OnSelectionChange(); } public void OnSelectionChange() { GameObject selectedObject = Selection.activeObject as GameObject; if (selectedObject != null) { // Create serialization object SerializedObject so = new SerializedObject(selectedObject); // Bind it to the root of the hierarchy. It will find the right object to bind to... rootVisualElement.Bind(so); } else { // Unbind the object from the actual visual element rootVisualElement.Unbind(); // Clear the TextField after the binding is removed // (this code is not safe if the Q() returns null) rootVisualElement.Q<TextField>("GameObjectName").value = ""; } } } }

Использование привязок в InspectorElement

InspectorElement — это UIElement-аналог инспектораокна Unity. который отображает информацию о текущем выбранном игровом объекте, активе или настройках проекта, позволяя вам проверять и редактировать значения. Дополнительная информация
Посмотрите в Словарь
, что имеется в виду определенный тип объекта Unity. Использование InspectorElement для проверки объектов дает следующие преимущества:

  • Создает пользовательский интерфейс.
  • Автоматически связывает объекты и пользовательский интерфейс.

Еще один пример простой привязки, который можно найти в разделе Assets/Editor/SimpleBindingExample.cs, содержит пример использования и обзор процесса.

Содержимое файла Assets/Editor/SimpleBindingExample.cs:

using UnityEditor; using UnityEngine; using UnityEditor.UIElements; namespace UIElementsExamples { public class SimpleBindingExampleUXML : EditorWindow { [MenuItem("Window/UIElementsExamples/Simple Binding Example UXML")] public static void ShowDefaultWindow() { var wnd = GetWindow<SimpleBindingExampleUXML>(); wnd.titleContent = new GUIContent("Simple Binding UXML"); } TankScript m_Tank; public void OnEnable() { m_Tank = GameObject.FindObjectOfType<TankScript>(); if (m_Tank == null) return; var inspector = new InspectorElement(m_Tank); rootVisualElement.Add(inspector); } } }

Этот код ссылается на скрипт TankScript и использует InspectorElement. Сценарий TankScript является примером MonoBehaviour, назначенного GameObjectфундаментальному объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь
.

Содержимое Assets/TankScript.cs:

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); } }

InspectorElement настраивается с помощью определенного пользовательского интерфейса. Это делается с помощью скрипта TankEditor. Сценарий TankEditor определяет пользовательский редактор для типа TankScript. Сценарий TankEditor также использует файл UXML для иерархии и файл USS для оформления инспектора.

Содержимое файла Assets/Editor/TankEditor.cs:

using UnityEditor; using UnityEngine; using UnityEngine.UIElements; [CustomEditor(typeof(TankScript))] public class TankEditor : Editor { public override VisualElement CreateInspectorGUI() { var visualTree = Resources.Load("tank_inspector_uxml") as VisualTreeAsset; var uxmlVE = visualTree.CloneTree(); uxmlVE.styleSheets.Add(AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Resources/tank_inspector_styles.uss")); return uxmlVE; } }

Содержимое файла Assets/Resources/tank_Included_uxml.uxml:

<UXML xmlns:ui="UnityEngine.UIElements" xmlns:ue="UnityEditor.UIElements"> <ui:VisualElement name="row" class="container"> <ui:Label text="Tank Script - Custom Inspector" /> <ue:PropertyField binding-path="tankName" name="tank-name-field" /> <ue:PropertyField binding-path="tankSize" name="tank-size-field" /> </ui:VisualElement> </UXML>

Файл UXML, tank_инспекционный_uxml.uxml определяет привязку. В частности, каждый атрибут binding-path для каждого тега PropertyFields задается свойством для привязки. Какой элемент отображается в пользовательском интерфейсе, зависит от типа каждого связанного свойства.

Содержимое файла Assets/Resources/tank_Included_styles.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); }

Файл USS, tank_Included_styles.uss, определяет стиль каждого элемента.

В следующей таблице перечислены поля, поддерживаемые PropertyField. Каждое поле включает свой тип данных.

Поле Тип
BoundsField Bounds
BoundsIntField BoundsInt
ColorField Color
CurveField AnimationCurve
FloatField float
GradientField Gradient
IntegerField int
IntegerField int, for the ArraySize
LayerMaskField unit
ObjectField UnityEngine.Object
PopupField<string> Enum
RectField Rect
RectIntField RecInt
TextField string
TextField, with a maxLength=1 char
Toggle bool
Vector2Field Vector2
Vector2IntField Vector2Int
Vector3Field Vector3
Vector3IntField Vector3Int
Vector4Field Vector4
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3