Unity Extensible Markup Language (UXML) file adalah file teks yang menentukan struktur antarmuka pengguna. Format UXML terinspirasi oleh HTML, XAML, dan XML. Jika Anda telah bekerja dengan format ini sebelum, Anda akan menemukan kesamaan dengan UXML. Namun, format UX mencakup perbedaan kecil untuk memberikan cara yang efisien untuk bekerja dengan Unity.
Bagian ini menjelaskan format UXML yang mendukung Unity dan memberikan rincian tentang menulis, memuat, dan mendefinisikan template UXML. Ini juga mencakup informasi tentang mendefinisikan elemen baru, dan bagaimana menggunakan UQuery.
UXML memudahkan pengguna yang kurang teknis untuk membangun antarmuka pengguna dalam Unity. Di UXML Anda dapat:
Pengembang daun ini untuk melakukan tugas teknis, seperti aset impor, mendefinisikan logika, dan memproses data.
Dengan UI Toolkit, Anda dapat menentukan komponen antarmuka pengguna dan elemen Anda sendiri.
Sebelum Anda dapat menggunakan file UXML untuk menentukan elemen baru, Anda harus mendapatkan kelas baru dari VisualElement
atau salah satu subklasnya, kemudian menerapkan fungsi yang tepat dalam kelas baru ini. Kelas baru Anda harus menerapkan konstruktor default.
Misalnya, kode berikut berasal dari kelas StatusBar
baru dan menerapkan konstruktor defaultnya:
class StatusBar : VisualElement
{
public StatusBar()
{
m_Status = String.Empty;
}
string m_Status;
public string status { get; set; }
}
Dalam rangka untuk UI Toolkit untuk meluruskan kelas baru ketika membaca file UXML, Anda harus mendefinisikan pabrik untuk kelas Anda. Kecuali pabrik Anda perlu melakukan sesuatu yang istimewa, Anda dapat memperoleh pabrik dari UxmlFactoy<T>
. Disarankan bahwa Anda menempatkan kelas pabrik dalam kelas komponen Anda.
Sebagai contoh, kode berikut menunjukkan cara menentukan pabrik untuk kelas StatusBar
dengan menolak pabriknya dari UxmlFactory<T>
. Pabrik ini dinamakan UxmlFactory
:
class StatusBar : VisualElement
{
public new class UxmlFactory : UxmlFactory<StatusBar> {}
// ...
}
Dengan pabrik ini didefinisikan, Anda dapat menggunakan elemen <StatusBar>
dalam file UXML.
Anda dapat mendefinisikan sifat UX untuk kelas baru dan mengatur pabriknya untuk menggunakan sifat-sifat ini.
Sebagai contoh, kode berikut menunjukkan cara menentukan kelas UXML untuk menginisialisasi properti status
sebagai properti kelas StatusBar
. Status properti menginisialisasi dari data XML.
class StatusBar : VisualElement
{
public new class UxmlFactory : UxmlFactory<StatusBar, UxmlTraits> {}
public new class UxmlTraits : VisualElement.UxmlTraits
{
UxmlStringAttributeDescription m_Status = new UxmlStringAttributeDescription { name = "status" };
public override IEnumerable<UxmlChildElementDescription> uxmlChildElementsDescription
{
get { yield break; }
}
public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
{
base.Init(ve, bag, cc);
((StatusBar)ve).status = m_Status.GetValueFromBag(bag, cc);
}
}
// ...
}
UxmlTraits
melayani dua tujuan:
Contoh kode di atas melakukan berikut:
m_Status
mendefinisikan atribut XML bernama status
.uxmlChildElementsDescription
mengembalikan IEnumerable
kosong yang menunjukkan bahwa elemen StatusBar
tidak memiliki anak.Init()
membaca nilai atribut status
dalam tas properti dari pembuat XML dan menetapkan properti StatusBar.status
untuk nilai ini.UxmlTraits
di dalam kelas StatusBar
memungkinkan metode Init()
untuk mengakses anggota pribadi StatusBar
.UxmlTraits
baru dari kelas dasar UxmlTraits
, sehingga saham atribut kelas dasar.Init()
panggilan base.Init()
untuk menginisialisasi properti kelas dasar.Contoh kode di atas menyatakan atribut string dengan kelas UxmlStringAttributeDescription
. UI Toolkit mendukung jenis atribut berikut dan setiap tautan tipe C# ke tipe XML:
Attribute | Attribute value |
---|---|
UxmlStringAttributeDescription |
A string |
UxmlFloatAttributeDescription |
Nilai titik mengambang presisi tunggal dalam kisaran tipe C # float . |
UxmlDoubleAttributeDescription |
Nilai titik mengambang presisi ganda dalam kisaran tipe C # double . |
UxmlIntAttributeDescription |
Nilai integer dalam kisaran tipe C # int . |
UxmlLongAttributeDescription |
Nilai bilangan bulat panjang dalam kisaran tipe C # long . |
UxmlBoolAttributeDescription |
true atau false |
UxmlColorAttributeDescription |
string mewakili warna (#FFFFFF ) |
UxmlEnumAttributeDescription<T> |
Sebuah string mewakili salah satu nilai untuk jenis Enum .T . |
Pada contoh kode di atas, uxmlChildElementsDescription
mengembalikan IEnumerable
kosong yang menunjukkan bahwa elemen StatusBar
tidak menerima anak-anak.
Untuk memiliki elemen menerima anak-anak dari jenis apa pun, Anda harus menimpa properti uxmlChildElementsDescription
. Misalnya, untuk elemen StatusBar
untuk menerima anak-anak dari jenis apa pun, properti uxmlChildElementsDescription
harus ditentukan sebagai berikut:
public override IEnumerable<UxmlChildElementDescription> uxmlChildElementsDescription
{
get
{
yield return new UxmlChildElementDescription(typeof(VisualElement));
}
}
Setelah Anda mendefinisikan elemen baru di C#, Anda dapat mulai menggunakan elemen dalam file UXML Anda. Jika elemen baru Anda didefinisikan dalam namespace baru, Anda harus mendefinisikan prefix untuk namespace. Prefix Namespace dideklarasikan sebagai atribut pada elemen <UXML>
root dan mengganti nama namespace penuh ketika mencetak elemen.
Untuk menentukan prefiks namespace, tambahkan atribut UxmlNamespacePrefix
ke perakitan Anda untuk setiap prefiks namespace yang ingin Anda tentukan.
[assembly: UxmlNamespacePrefix("My.First.Namespace", "first")]
[assembly: UxmlNamespacePrefix("My.Second.Namespace", "second")]
Anda dapat melakukan ini di tingkat akar (di luar ruang nama) dari setiap file C # dari perakitan.
Sistem generasi skema melakukan berikut:
<UXML>
dalam file UXML baru dibuatxsi:schemaLocation
.Anda harus memperbarui skema UXML proyek Anda. Pilih Assets > Update UXML Schema untuk memastikan bahwa editor teks Anda mengenali elemen baru.
Prefix yang ditentukan tersedia di UXML yang baru dibuat dengan memilih Create > UI Toolkit > Editor Window di folder Project/Assets/Editor
.
Anda dapat menyesuaikan nama UXML dengan menahan sifat IUxmlFactory.uxmlName
dan IUXmlFactory.uxmlQualifiedName
. Pastikan uxmlName
unik di dalam ruang nama Anda dan bahwa uxmlQualifiedName
unik dalam proyek Anda.
Jika kedua nama tidak unik, pengecualian dibuang ketika Anda mencoba memuat perakitan Anda.
Contoh kode berikut menunjukkan cara override dan kustom nama UXML:
public class FactoryWithCustomName : UxmlFactory<..., ...>
{
public override string uxmlName
{
get { return "UniqueName"; }
}
public override string uxmlQualifiedName
{
get { return uxmlNamespace + "." + uxmlName; }
}
}
Secara default, elemen IUxmlFactory
meluruskan dan memilih elemen menggunakan nama elemen.
Anda dapat membuat proses seleksi mempertimbangkan nilai atribut pada elemen dengan overriding IUXmlFactory.AcceptsAttributeBag
. Pabrik kemudian akan memeriksa atribut elemen untuk memutuskan jika dapat mengulangi objek untuk elemen UXML.
Ini berguna jika kelas VisualElement
Anda adalah generik. Dalam hal ini, pabrik kelas untuk spesialisasi kelas Anda dapat memeriksa nilai atribut XML type
. Tergantung pada nilai, sekiasi dapat diterima atau ditolak.
Dalam kasus di mana lebih dari satu pabrik dapat meluruskan elemen, pabrik terdaftar pertama dipilih.
Anda dapat mengubah nilai default dari atribut yang dinyatakan dalam kelas dasar dengan mengatur kelas defaultValue
yang berasal dari kelas UxmlTraits
.
Misalnya, kode berikut menunjukkan cara mengubah nilai default m_TabIndex
:
class MyElementTraits : VisualElement.UxmlTraits
{
public MyElementTraits()
{
m_TabIndex.defaultValue = 0;
}
}
Secara default, schema XML yang dihasilkan menyatakan bahwa elemen dapat memiliki atribut.
Nilai atribut, selain yang dinyatakan dalam kelas UxmlTraits
, tidak dibatasi. Ini berbeda dengan validator XML yang memeriksa nilai atribut yang dinyatakan sesuai dengan deklarasinya.
Atribut tambahan disertakan dalam kantong IUxmlAttributes
yang dilewatkan ke fungsi IUxmlFactory.AcceptsAttributBag()
dan IUxmlFactory.Init()
. Ini hingga implementasi pabrik untuk menggunakan atribut tambahan ini. Perilaku default adalah untuk membuang atribut tambahan.
Ini berarti bahwa atribut tambahan ini tidak melekat pada VisualElement
instan dan Anda tidak dapat meminta atribut ini dengan UQuery
.
Ketika mendefinisikan elemen baru, Anda dapat membatasi atribut yang diterima bagi mereka secara eksplisit menyatakan dengan menetapkan properti UxmlTraits.canHaveAnyAttribute
pada konstrukor false
Anda.UxmlTraits
constructor.
File definisi Skema menentukan atribut dan elemen anak mana setiap elemen UXML dapat mengandung. Gunakan file definisi skema sebagai panduan untuk menulis dokumen yang benar dan untuk memvalidasi dokumen Anda.
Dalam file template UXML, atribut xsi:noNamespaceSchemaLocation
dan xsi:schemaLocation
dari elemen akar <UXML>
menentukan lokasi file definisi skema.
Pilih Assets > Create > UI Toolkit > Editor Window untuk secara otomatis memperbarui definisi skema Anda dengan informasi terbaru dari sub-kelas VisualElement
yang digunakan oleh proyek Anda. Untuk memaksa pembaruan file skema UXML, pilih Assets > Update UXML Schema.
Note: Beberapa editor teks tidak mengenali atribut xsi:noNamespaceSchemaLocation
. Jika editor teks Anda tidak dapat menemukan file definisi skema, Anda juga harus menentukan atribut xsi:schemaLocation
.