Tujuan mengikat adalah untuk menyinkronkan sifat dalam objek ke UI(User Interface) Memungkinkan pengguna untuk berinteraksi dengan aplikasi Anda. Unity saat ini mendukung tiga sistem UI. More info
Lihat di Glossary yang terlihat. A binding mengacu pada tautan antara properti dan kontrol visual yang mengubahnya.
Mengikat dilakukan antara objek dan UIElement mana pun yang berasal dari BindableElement atau mengimplementasikan antarmuka IBindable.
Dari ruang nama UnityEditor.UIElements
:
Base Class:
Controls:
Dari ruang nama UnityEngine.UIElements
:
Base Class
Controls
Mengikat dilakukan dengan mengikuti langkah-langkah ini sambil menggunakan Kontrol dari salah satu ruang nama yang tercantum di atas.
Potongan kode berikut menunjukkan cara membuat mengikat dengan kode C #. Untuk menggunakan cuplikan ini, simpan contoh ini sebagai file C# dalam folder editor, dalam proyek Anda. Nama file C# SimpleBindingExample.cs
.
Kandungan 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 = "";
}
}
}
}
Di Unity, pilih Window > UIElementsExamples > Simple Binding Example. Anda dapat menggunakan jendela ini untuk memilih GameObject di tempat kejadian Anda dan memodifikasi namanya dengan gambar yang ditampilkan.
Bagian ini menunjukkan cara menggunakan mengikat melalui set-up hierarki UXML.
Di UXML, atribut binding-path
didefinisikan dalam TextField controlKontrol TextField menampilkan bagian teks non-interaktif ke pengguna, seperti pembatasan, label untuk kontrol GUI lainnya, atau instruksi. More info
Lihat di Glossary. Ini adalah apa yang mengikat kontrol terhadap sifat objek yang efektif.
Kandungan 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>
Kandungan 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 = "";
}
}
}
}
Sebuah InspectorElement
adalah mitra UIElement dari inspectorJendela Unity yang menampilkan informasi tentang Pengaturan GameObject yang dipilih saat ini, aset atau proyek, memungkinkan Anda untuk memeriksa dan mengedit nilai. More info
Lihat di Glossary yang berarti jenis objek Unity tertentu. Menggunakan objek InspectorElement
untuk memeriksa memberikan keuntungan berikut:
Contoh mengikat sederhana lainnya, ditemukan di bawah Assets/Editor/SimpleBindingExample.cs
, menyediakan contoh penggunaan dan ikhtisar proses.
Kandungan 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);
}
}
}
Kode ini merujuk script TankScript
dan menggunakan InspectorElement
. Skrip TankScript
adalah contoh MonoBehaviour yang ditugaskan ke GameObjectObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary.
Kandungan 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);
}
}
Inspektur disesuaikan dengan UI tertentu. Ini dilakukan dengan script TankEditor
. TankEditor
script mendefinisikan editor kustom untuk tipe TankScript
. TankEditor
script juga menggunakan file UXML untuk hirarki dan file USS untuk memaksa inspektur.
Kandungan 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;
}
}
Ketika menulis inspektur kustom Anda tidak perlu mengikat objek serial ke pohon visual seperti di jendela editor contoh di atas. Langkah ini dilakukan secara implicit setelah selesai metode CreateInspectorGUI
. Langkah mengikat otomatis ini hanya dilakukan pada saat itu. Jika Anda menambahkan bidang di luar callback ke metode CreateInspectorGUI
, Anda harus mengikatnya secara manual. Jika tidak mungkin gagal untuk membuat atau menghasilkan hasil visual yang tidak ditentukan.
Kandungan Assets/Resources/tank_inspector_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>
File UXML, tank_inspector_uxml.uxml
menentukan mengikat. Secara khusus, setiap atribut binding-path
, untuk setiap tag PropertyFields
, ditetapkan ke properti untuk mengikat. Elemen apa yang ditunjukkan dalam UI didasarkan pada jenis masing-masing properti yang terikat.
Kandungan Assets/Resources/tank_inspector_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);
}
File ASS, tank_inspector_styles.uss
, menentukan gaya setiap elemen.
Daftar tabel berikut bidang yang didukung oleh PropertyField. Setiap bidang termasuk jenis datanya.
Field | Type |
---|---|
BoundsField | Bounds |
BoundsIntField | BoundsInt |
ColorField | Color |
CurveField | AnimationCurve |
FloatField | float |
GradientField | Gradient |
IntegerField | int |
IntegerField | int, untuk ArraySize |
LayerMaskField | unit |
ObjectField | Login Sitemap |
PopupField <string> | Enum |
RectField | Rect |
RectIntField | RecInt |
TextField | string |
TeksField, dengan MaxLength=1 | char |
Toggle | bool |
Vektor2Field | Vektor2 |
Vektor2IntField | Vektor2Int |
Vektor3Field | Vektor3 |
Vektor3IntField | Vektor3Int |
Vektor4Field | Vektor4 |