Целью привязок является синхронизация свойств внутри объектов с видимым 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
Привязка выполняется с помощью следующих шагов при использовании элемента управления из одного из перечисленных выше пространств имен.
- В элементе управления укажите bindingPath из интерфейса IBindable, чтобы пользовательский интерфейс знал, какое свойство нужно привязать. Вы можете сделать это в C# или в UXML. Пример каждого приведен ниже в этом разделе.
- Создайте SerializedObject для связываемого объекта.
- Привяжите этот объект к элементу управления или одному из его родителей.
Связывание с 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 |