Baca dalam bahasa Inggris

Bagikan melalui


Kerangka Kerja Pengikatan dan Tema Data — MRTK3

Selamat datang di kerangka kerja Pengikatan dan Tema Data MRTK3. Kerangka kerja ini dirancang untuk memudahkan pembuatan elemen visual yang dapat diisi dan diperbarui secara dinamis pada runtime berdasarkan data yang disediakan dari satu atau beberapa sumber data.

Apa itu pengikatan data

Pengikatan data adalah proses yang membuat koneksi antara UX (tampilan) aplikasi dan data yang sedang disajikan (model). Misalkan pengikatan memiliki pengaturan yang benar dan data menyediakan pemberitahuan yang tepat; ketika data mengubah nilainya, elemen yang terikat ke data mencerminkan perubahan secara otomatis.

Kerangka kerja pengikatan data populer:

  • Delphi
  • Windows Presentation Framework (WPF .NET)
  • Formulir Windows
  • Sudut
  • Backbond
  • Pengikatan JavaFX

Diagram blok pengikatan data Windows Presentation Framework

Databinding Windows Presentation Framework (WPF) Untuk informasi selengkapnya, lihat gambaran umum pengikatan data - WPF.NET


Diagram blok setara MRTK

Diagram blok setara MRTK


Tujuan Desain

  • Lintas platform--sebarkan di mana saja
  • Mendukung struktur organisasi dan asal sumber data apa pun
  • Mudah diintegrasikan ke dalam basis kode yang ada atau greenfield
  • Desainer dan pengembang ramah
  • Dapat diaktifkan / dinonaktifkan kapan saja selama siklus hidup aplikasi
  • Mendukung dunia nyata, skenario perusahaan--DB backend, templat prefab UX yang kompleks
  • Mudah diterapkan ke komponen UX non-MRTK yang ada dan elemen visual novel
  • Mengikat jenis data apa pun termasuk sprite, gambar, bahan, animasi, dan klip audio
  • Mudah untuk meningkatkan kemampuan tanpa menyentuh basis kode yang ada
  • Penggunaan CPU, RAM, GC, dan frame-time yang efisien
  • Integrasikan dengan mudah dengan berbagai sumber data lokal atau back-end
  • Kombinasi simultan dari sumber data yang disematkan, run-time, dan sumber data back-end
  • Menangani koleksi dengan ukuran apa pun secara efisien untuk presentasi daftar
  • Tema gabungan dan pengikatan data untuk elemen data dinamis bertema
  • Memvalidasi dan memanipulasi data variabel dengan cara terbuka sebelum menyajikan
  • Dependensi minimal pada fungsionalitas MRTK lainnya
  • Kompatibel dengan MRTK v2 dan MRTK3
  • Label yang mudah berwarna putih dan/atau menerapkan branding ke aset stok dengan usaha minimal

Fitur Utama

  • Sumber data terbuka mendukung strategi data yang bertahan, jarak jauh, atau RAM.
  • Konsumen data terbuka mendukung kebutuhan pengikatan dan tema UX.
  • Penemuan otomatis antara sumber data dan konsumen menyederhanakan hookup.
  • Konfigurasi otomatis opsional dari profil pengikatan
  • Model data yang dipisahkan dan melihat mendukung pola MVC dan MVVM.
  • Koleksi virtual dengan navigasi melalui halaman dan pengguliran.
  • Prefetch prediktif item koleksi untuk navigasi daftar halus.
  • Objek koleksi dapat dikumpulkan dan digunakan kembali untuk mengurangi GC.
  • Dapat memetakan antara perbedaan dalam data dan melihat namespace keypath.

Fungsionalitas Saat Ini

1. Memvisualisasikan data variabel melalui konsumen data

Saat ini didukung:

  • Teks TextMeshPro dan TextMesh
  • Lembar gaya teks (untuk tema dan aksesibilitas)
  • Tekstur sprite
  • Pemicu Boolean
  • Tekstur quad
  • Ikon Font
  • Koleksi: daftar berukuran sewenang-wenang yang berisi prefab yang diisi dengan data variabel
  • Konsumen lain yang mendukung antarmuka IDataConsumer (secara langsung atau melalui turunan kelas dasar)

2. Berikan data variabel menggunakan berbagai sumber data:

  • Teks JSON (secara langsung atau dengan cara pengambilan URL)
  • Kamus elemen data variabel
  • Objek - Data terstruktur berbasis simpul
  • Refleksi objek C# apa pun
  • Data yang diubah secara terprogram
  • Metode lain yang mendukung antarmuka IDataSource

3. Mencantumkan placer item untuk mengelola manifestasi visual daftar

4. Mencantumkan halaman, pengguliran, dan virtualisasi

  • Data hanya diambil saat terlihat atau sedang dalam proses
  • Mendukung himpunan data back-end yang sangat besar
  • Pengambilan beban seimbang di beberapa bingkai

5. Daftar kumpulan prefab

  • Prefab digunakan kembali dan diisi ulang untuk mengurangi GC dan waktu instansiasi.

6. Terapkan tema secara dinamis ke elemen saat runtime


Fungsionalitas pada peta jalan

Selain apa yang sudah tersedia, prioritas utama untuk lebih banyak kemampuan meliputi:

1. Alur Manipulator Data

  • Konversi antara sisi data dan nilai sisi tampilan
  • Pelokalan (integrasi mulus dengan pelokalan Unity)
  • Pemformatan
  • Validasi

2. Prefetch item daftar prediktif untuk pengguliran/paging yang lebih cepat/lancar

3. Lebih Banyak Konsumen Data

  • Mengatur properti publik apa pun pada Komponen
  • Atur status aktif/nonaktif kotak centang
  • Mengatur nilai penggeser
  • Mengatur tombol radio dalam grup
  • Properti Materi Individual seperti warna yang ditetapkan

4. Tema

  • Lihat tema yang diterapkan di Editor bahkan saat tidak menjalankan aplikasi
  • Perbarui prefab untuk mencerminkan tema yang diterapkan sehingga menjadi tema default
  • Pewarisan tema / gaya

Terminologi

  • Sumber Data - Penyedia data apa pun, baik status runtime, disimpan secara lokal, atau diambil dari server.
  • Penyedia Sumber Data - MonoBehaviour sederhana yang menyediakan akses ke Sumber Data yang mungkin tidak terekspos dalam grafik adegan Unity.
  • Jenis Sumber Data - Nama unik yang ditetapkan ke Sumber Data sehingga Konsumen Data dapat menentukan Sumber Data yang diinginkan berdasarkan nama.
  • Konsumen Data - Setiap konsumen data yang ingin bertindak berdasarkan perubahan data, biasanya elemen visual, tetapi tidak diperlukan. Sebagai contoh, tujuannya adalah untuk memicu tindakan berdasarkan perubahan nilai data.
  • Pengontrol Data - Mekanisme untuk memanggil tindakan dengan nilai terikat data terkait yang saat ini disediakan sebagai parameter.
  • Keypath - Pemilih data yang mereferensikan objek tertentu di Sumber Data. Seperti yang saat ini diimplementasikan, format keypath dimodelkan setelah pengakses data JSON untuk menguraikan kombinasi berlapis dari peta, daftar, dan elemen atomik.
  • Keypath Lokal - Keypath sisi Konsumen Data yang dapat disematkan secara permanen dalam prefab yang dapat digunakan kembali. Melalui penyelesaian entitas koleksi dan Keypath Mappers, ini akan secara otomatis dikonversi ke keypath yang diselesaikan sepenuhnya untuk item tertentu dalam koleksi. Ketika tidak terkait dengan koleksi, ini dapat memetakan langsung ke datum di sumber data atau dapat terlebih dahulu dimodifikasi dengan cara Keypath Mapper.
  • Keypath yang Diselesaikan Sepenuhnya - Keypath lengkap dan absolut yang memetakan ke satu objek tertentu di Sumber Data. Untuk item dalam koleksi, ini adalah kombinasi keypath yang diselesaikan sepenuhnya untuk satu entitas koleksi dan keypath relatif (lokal) untuk satu elemen data dari entitas pengumpulan tersebut.

  • Keypath Mapper - Pemeta namespace opsional antara keypath lokal dan nama bidang Sumber Data (misalnya "tautan" <-> "URL").

  • Tema - Sumber Data yang menyediakan sekumpulan berbagai aset dan gaya yang diperlukan untuk mencapai estetika visual tertentu.

  • Item Placer - Pendamping DataConsumerCollection yang bertanggung jawab untuk menempatkan item yang terlihat ke dalam adegan.

  • Kumpulan Objek Data - Prefab siaga yang dibuat dan siap diisi dengan data untuk navigasi daftar GC rendah.

  • Daftar Virtualisasi - Kemampuan untuk mengisi, menyajikan, dan menavigasi daftar berukuran besar secara sewenang-wenang.

  • Prefetch Prefetch Prediktif - Pra-pengambilan data dan mengisi prefab pengumpulan untuk item yang mungkin segera terlihat dengan cara menggulir/penomoran halaman.

  • Prefetch Prefetch Prediktif - Pra-pengambilan data dan mengisi prefab pengumpulan untuk item yang mungkin segera terlihat melalui pengguliran/penomoran halaman.

Konsep utama

Sumber data

Sumber data adalah sekumpulan data terkelola dari jenis dan kompleksitas arbitrer yang dapat digunakan untuk mengisi tampilan data melalui konsumen data. Data yang dikelola oleh sumber data bisa statis atau dinamis. Setiap perubahan pada item data akan dilaporkan kepada konsumen data apa pun yang telah mendaftar untuk menerima pemberitahuan perubahan.

Penyedia Sumber Data

Antarmuka sederhana yang memiliki satu metode untuk mengambil sumber data. Ini dirancang untuk memungkinkan komponen pembuatan skrip MonoBehavior ditemukan secara otomatis dalam hierarki objek game oleh komponen konsumen data. Tidak perlu mengimplementasikan sumber data langsung pada objek game itu sendiri. Ini berguna ketika MonoBehaviour yang ada harus berasal dari kelas lain dan beberapa warisan mencegah turunan dari DataSourceGOBase. Ini juga memungkinkan lebih banyak kode untuk tidak memiliki dependensi Unity.

Penyedia Sumber Data Singleton

DataSourceProviderSingleton MonoBehaviour memungkinkan untuk menentukan sumber data yang dapat ditemukan secara otomatis meskipun tidak dalam hierarki GameObject yang sama dengan DataConsumers yang ingin mendengarkannya. Cukup letakkan DataSourceProviderSingletondi mana saja di adegan dan isi Data Sources properti dengan sumber data apa pun yang akan ditemukan oleh konsumen data. Atau, konsumen data akan memandu orang tua mereka untuk menemukan sumber data yang sesuai, yang menyiratkan bahwa Anda dapat menempatkan sumber data yang menyediakan data yang diinginkan di mana saja dalam rantai induk konsumen data tersebut.

Jalur Kunci (string)

Jalur kunci adalah mekanisme untuk mengidentifikasi informasi apa pun secara unik dalam sumber data.

Meskipun jalur kunci dapat menjadi pengidentifikasi unik per item data, implementasi saat ini menggunakan penentu yang dapat dibaca pengguna logis yang menunjukkan posisi navigasi data yang menarik relatif terhadap seluruh himpunan data terstruktur. Ini dimodelkan pada konsep daftar, kamus, dan primitif Javascript. Jalur kunci secara sintetis mengoreksi pernyataan Javascript untuk mengakses data yang dapat diwakili dalam JSON. Keuntungan dari pendekatan ini adalah berkorelasi dengan baik dengan JSON dan XML. Ini adalah dua cara yang paling lazim untuk mentransfer informasi dari layanan backend.

Contoh jalur kunci:

  • suhu
  • contacts[10].firstName
  • Kontak
  • contacts[10].addresses[3].city
  • [10].title
  • kingdom.animal.mammal.aardvark.diet.foodtypes.termites

Mengingat bahwa jalur kunci adalah string arbitrer tanpa taksonomi yang diperlukan, penentu data aktual bisa menjadi metode apa pun untuk menjelaskan data apa yang akan diambil. XPath XML adalah contoh skema jalur kunci yang layak yang akan berfungsi dengan sumber data. Selama jalur kunci yang disediakan oleh konsumen data konsisten dengan keypath yang diharapkan oleh sumber data, semuanya akan berfungsi. Selain itu, Key Path Mappers dapat diimplementasikan untuk menerjemahkan antara skema yang berbeda.

Menyelesaikan Jalur Kunci

Menyelesaikan jalur kunci berarti menggabungkan dua keypath:

  1. Keypath absolut yang menjelaskan cara mengakses subset tertentu dari himpunan data yang lebih besar, seperti satu entri dalam daftar banyak entri.
  2. Keypath parsial (relatif) yang mewakili datum tertentu dalam daftar atau entri peta tersebut.

Hal ini memungkinkan untuk memperlakukan subset data sewaktu-waktu sehingga tidak masalah di mana dalam hierarki himpunan data yang lebih besar itu sebenarnya ada. Penggunaan paling penting dari kemampuan ini adalah menggambarkan data dari satu entri dalam daftar tanpa khawatir tentang entri mana dalam daftar yang dirujuk instans saat ini.

Karena jalur Kunci "diselesaikan sepenuhnya" selalu dihasilkan dan dikonsumsi oleh DataSource dan jarang atau tidak pernah dimodifikasi oleh DataConsumer atau komponen eksternal lainnya, jalur tersebut dapat memiliki struktur apa pun yang masuk akal untuk DataSource. Misalnya, jika ada prefab untuk menampilkan entri daftar untuk foto dan judulnya, tanggal diambil dan atribut lainnya, jalur kunci lokal di prefab mungkin terlihat seperti ini:

  • "photo_url"
  • "judul"
  • "date_taken"
  • "deskripsi"

Jalur kunci yang diselesaikan sepenuhnya untuk satu entri prefab dalam daftar mungkin terlihat seperti ini:

  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/photo_url"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/title"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/date_taken"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/description"

Pemeta Jalur Kunci (IDataKeyPathMapper)

Pemeta Jalur Kunci memungkinkan sumber data dan konsumen data menggunakan namespace layanan dan konvensi yang berbeda untuk jalur kunci dan masih bekerja sama.

Prefab untuk elemen yang umum digunakan, seperti slate untuk menunjukkan informasi kontak seseorang, dapat berisi bidang variabel yang dikelola oleh konsumen data. Untuk memungkinkan hal ini, pengidentifikasi yang digunakan untuk setiap aspek variabel prefab membutuhkan cara untuk memetakan ke pengidentifikasi untuk datum yang benar dalam sumber data yang akan, dalam setiap penggunaan prefab, menentukan konten elemen variabel tersebut. Pemeta Jalur Kunci memungkinkan hal ini.

Prefab dapat digunakan dengan sumber data yang berbeda di mana data disimpan dalam struktur organisasi yang berbeda dan menggunakan nama bidang. Untuk menggunakan prefab templat dengan setiap sumber data, Pemeta Jalur Kunci dapat menyelesaikan perbedaan apa pun dalam cara data diatur.

Konsumen Data (IDataConsumer)

Objek yang tahu cara menggunakan informasi yang dikelola oleh sumber data dan menggunakan data tersebut untuk mengisi tampilan data.

Konsumen Data dapat mendaftar dengan sumber data untuk diberi tahu tentang perubahan apa pun pada item data yang ada di jalur kunci tertentu dalam himpunan data. Setiap kali data yang ditentukan telah berubah (atau dicurigai telah berubah), Konsumen Data akan diberi tahu.

Pengumpulan Konsumen Data

Pengumpulan Konsumen Data memiliki kemampuan tambahan untuk mengelola daftar item serupa. Daftar ini bisa menjadi seluruh himpunan data yang dikelola oleh sumber data, atau hanya subset. Biasanya data untuk setiap item dalam daftar berisi jenis informasi yang sama, tetapi ini bukan persyaratan. Sumber data dan konsumen data dapat mendukung daftar berlapis, seperti daftar kata kunci yang terkait dengan setiap foto dalam daftar foto yang terkait dengan setiap orang dalam daftar kontak. Keypath untuk kata kunci akan relatif terhadap foto, dan keypath untuk foto akan relatif terhadap orang tersebut, dan keypath orang tersebut akan relatif terhadap daftar induk terdekat, atau akar himpunan data.

Saat memproses koleksi, keypath yang diselesaikan dengan benar untuk entri tertentu dalam koleksi ditetapkan ke setiap konsumen data yang ditemukan di prefab yang dibuat untuk setiap item koleksi. Itu kemudian digunakan untuk sepenuhnya menyelesaikan jalur kunci untuk data tampilan relatif (lokal) dalam prefab tersebut.

Placer Item Pengumpulan Data

Konsumen data koleksi memerlukan sarana untuk mengisi pengalaman pengguna dengan daftar elemen visual berulang, seperti apa yang mungkin ditemukan dalam daftar produk, foto, atau kontak yang dapat digulir. Ini dicapai dengan menetapkan placer item ke konsumen data pengumpulan. Placer item ini adalah logika tha tahu cara meminta item daftar, menerima prefab yang telah diisi dengan data variabel, dan kemudian menyajikannya kepada pengguna, biasanya dengan memasukkannya ke dalam daftar yang dikelola oleh komponen tata letak UX untuk daftar.

Penemaan

Tema menggunakan semua pipa sumber data dan konsumen data. Dimungkinkan untuk tema hierarki GameObjects apakah itu statis atau secara dinamis terikat data ke sumber data lain. Ini memungkinkan pengikatan data dan tema diterapkan dalam kombinasi. Bahkan dimungkinkan untuk tema data yang berasal dari sumber data lain.

Diagram Blok dan Aliran data

Aliran data tema MRTK

Tema MRTK

Tema adalah kemampuan untuk mengubah estetika visual banyak elemen UX sekaligus. Biasanya, semua data yang diperlukan untuk menentukan tema disediakan oleh satu Sumber Data seperti Objek yang Dapat Ditulis. Anda juga dapat menyediakan data tema sesuai kebutuhan atau dibagi menjadi grup logis berdasarkan tujuannya.

Tema MRTK3

Tema MRTK3 dikombinasikan dengan Pengikatan Data

Pengikatan data dan Tema dapat ada bersama untuk satu elemen UX. Setiap elemen UX individual dapat bertema dan terikat data secara bersamaan. Dalam skenario ini, alur umumnya adalah bahwa datum yang berasal dari DataSource digunakan untuk mendapatkan keypath tema yang benar. Keypath ini kemudian digunakan untuk mengambil objek dari Tema Sumber Data, biasanya profil ScriptableObject, tetapi berpotensi sumber data apa pun yang dapat menyelesaikan keypath.

Untuk menyederhanakan konfigurasi tema dan pengikatan data, Anda dapat membuat profil pengikatan yang diproses oleh BindingConfigurator pada waktu instansiasi.

  • Memproses BindingConfigurator Profil Pengikatan untuk menentukan aset dalam prefab yang akan ditemakan dan mengaitkan elemen data terikat dan elemen yang dapat di-tema dengan Keypaths. Kemudian menambahkan yang sesuai DataConsumers untuk mengikat elemen visual ini ke pemilih Keypaths yang benar yang akan digunakan untuk mereferensikan data tertentu dalam satu atau beberapa DataSources, yang biasanya berada di luar prefab itu sendiri.
  • Data tema disediakan oleh DataSource yang berisi data untuk setiap Keypath yang diidentifikasi di Profil Pengikatan.
  • ThemeProvider Skrip pembantu memudahkan penggunaan ScriptableObject sebagai DataSource untuk tema.
  • Tema UX standar disediakan oleh MRTK_UX_ThemeProfile ScriptableObject yang terikat dengan DataSourceReflection ThemeProviderdi .

Diagram alur Sumber Data Profil Tema

Sumber Data yang Disematkan

Sumber data yang disematkan sesuai dalam dua situasi:

  1. Ketika setiap instans prefab mungkin memiliki pengaturan tema yang berbeda dan memerlukan sumber data terpisahnya sendiri.
  2. Ketika semua instans prefab ini diatur oleh satu profil tema persisten umum (misalnya, ScriptableObject) dan dapat disediakan dengan cara sumber data yang disematkan sehingga tidak ada dependensi eksternal untuk dibuat.

DataSourceReflection

Ini dapat mengubah struktur atau kelas C# apa pun menjadi DataSource dengan menggunakan pantulan untuk memetakan keypath ke bidang, properti, kelas berlapis, array, daftar, atau kamus. Ini dapat dikaitkan dengan Unity ScriptableObject atau struct C# atau kelas lain di mana data tema ada. Objek yang dibuat yang berisi data dapat disuntikkan dependensi dan diubah saat runtime.

  1. Objek yang Dapat Ditulis: berguna untuk tema statis yang dibagikan di banyak prefab.
  2. Struktur atau kelas C# yang tidak bertahan: berguna untuk modifikasi run-time dinamis tema.

DataSourceJson

Jika data ada sebagai json teks, maka ini mengelola keypath pemetaan ke json DOM. Aset biner dapat diambil dari Sumber Daya Unity, StreamingAssets, atau bahkan URL yang diambil.

DataSourceDictionary

Ini adalah pilihan sederhana ketika daftar murni datar cukup baik untuk memenuhi kebutuhan, dan untuk prototipe cepat. Semua aset tema didukung termasuk teks, aset Unity (misalnya, Materi, Sprite, dan Gambar), Sumber Daya, StreamingAssets, atau bahkan dapat diambil secara eksternal melalui URL.

Adat

Sumber data kustom apa pun yang mengimplementasikan antarmuka atau turunan langsung IDataSource dari DataSourceBase atau DataSourceGOBase dapat digunakan untuk memenuhi kebutuhan kustom.

Tema UXComponents

Kontrol UXComponents standar yang disediakan dalam paket UXComponents semuanya dikonfigurasi untuk mendukung tema. Ini dimatikan secara default, tetapi mudah diaktifkan.

Setiap kontrol, biasanya di GameObject paling atas dari prefab root, memiliki skrip yang disebut UXBindingConfigurator. Skrip ini, jika diaktifkan, akan menarik skrip pengikatan data yang diperlukan untuk mengaktifkan tema. Pastikan untuk mengimpor paket Pengikatan Data dan Tema juga.

Catatan di TextMeshPro StyleSheets: Saat ini tidak dimungkinkan untuk menggunakan StyleSheets untuk menata gaya TextMeshPro Normal . Gaya lain yang disertakan dalam Lembar Gaya Default TextMeshPro dapat digunakan. Contohnya menggunakan Isi untuk mengatasi batasan ini.

DataSourceThemeProvider

DataSourceThemeProvider MonoBehaviour dapat digunakan untuk dengan mudah membuat ScriptableObject yang berisi semua referensi ke semua aset tema berfungsi sebagai sumber data. Ini ditunjukkan dalam adegan UXThemingExample.

ThemeSelector

ThemeSelector MonoBehaviour memungkinkan untuk menentukan dan dengan mudah bertukar antara beberapa profil ScriptableObject. Contoh penggunaan ini adalah untuk memudahkan peralihan antara tema 'Gelap' dan 'Terang'. Tambahkan ScriptableObjects ke Theme Profiles, biasanya pada waktu desain. Kemudian, pada waktu proses, ubah Current Theme properti untuk mengubah tema.

Tema Konsumen Data

Tema dicapai oleh Konsumen Data, terutama yang mewarisi dari DataConsumerThemeBase<T>, DataConsumerTextStyle dan kelas DataConsumer kustom yang dapat diterapkan pengembang untuk meningkatkan dukungan tema.

Kelas dasar DataConsumerThemeBase<T> menyediakan logika untuk menggunakan bilangan bulat atau datum kunci dari sumber data utama untuk mencari nilai akhir yang diinginkan dari database tema sekunder. Ini dicapai dengan memetakan data input ke keypath tema dan kemudian menggunakan keypath tema tersebut untuk mengambil nilai akhir. Ini memungkinkan elemen apa pun untuk terikat data dan bertema pada saat yang sama. Sebagai contoh, bayangkan bidang status dalam database dengan status Baru, Dimulai, dan Selesai yang diwakili oleh nilai 0, 1 dan 2. Masing-masing dapat diwakili oleh ikon Sprite. Untuk pengikatan data, nilai dari 0 hingga 2 digunakan untuk mencari sprite yang diinginkan. Dengan tema dan pengikatan data, profil tema menunjuk ke daftar tiga sprite yang benar dalam profil tema dan kemudian nilai dari 0 hingga 2 digunakan untuk memilih sprite yang benar dari daftar tersebut. Ini memungkinkan gaya ikon ini berbeda per tema.

Ketika tema runtime dan pengikatan data dinamis digunakan bersama-sama, kelas DataConsumerThemeHelper dapat ditentukan di kelas DataConsumerThemeBase-turunan untuk memberi tahu ketika tema telah berubah.

Penukaran tema saat runtime dilakukan dengan mengganti data pada sumber data tema dengan himpunan data baru yang ditata dalam topologi model objek data yang sama. DataSourceReflection dapat digunakan dengan ScriptableObjects di mana setiap profil mewakili tema. Untuk semua kontrol MRTK Core UX, profil tema adalah ScriptableObject bernama MRTK_UXComponents_ThemeProfile. Skrip pembantu ThemeProvider.cs memudahkan penggunaan ini atau profil ScriptableObject apa pun sebagai Sumber Data.

Metode penerapan tema ke data dinamis dapat secara otomatis terdeteksi dalam banyak kasus, atau dapat ditentukan secara eksplisit.

Saat datum digunakan untuk memilih item yang benar dari sumber data tema, prosesnya adalah:

  • datum dari sumber data utama digunakan untuk memilih atau membuat keypath tema yang benar
  • keypath tema digunakan untuk mengambil nilai dari sumber data tema yang ditentukan pada DataConsumerThemeHelper
  • nilai tema yang diambil dianalisis untuk mendeteksi metode pengambilan yang benar secara otomatis
  • item data akhir dari jenis yang benar (misalnya, Materi, Sprite, atau Gambar) kemudian diambil menggunakan metode yang terdeteksi secara otomatis.

Jenis Data

Jenis data yang diharapkan dari datum yang digunakan untuk mengambil objek yang diinginkan dapat menjadi salah satu dari yang berikut ini:

Jenis Data Deskripsi
AutoDetect Datum dianalisis dan interpretasi yang benar secara otomatis terdeteksi. Lihat "Deteksi Otomatis Jenis Data" di bawah ini untuk informasi selengkapnya.
DirectValue Datum diharapkan dari jenis T yang diinginkan (misalnya, Bahan, Sprite, Gambar) dan digunakan secara langsung.
DirectLookup Indeks integral atau kunci string yang digunakan untuk mencari nilai yang diinginkan dari tabel pencarian lokal.
StaticThemedValue Objek bertema statis dari jenis yang benar diambil dari sumber data tema pada keypath tema tertentu.
ThemeKeypathLookup Indeks integral atau kunci string digunakan untuk mencari keypath tema yang diinginkan.
ThemeKeypathProperty Nama properti string yang akan ditambahkan ke keypath dasar tema yang disediakan dalam Tema.
ResourcePath Jalur sumber daya untuk mengambil nilai dari sumber daya Unity (dapat dimulai dengan "resource://").
FilePath Jalur file untuk mengambil aset streaming Unity (dapat dimulai dengan "file://").

Deteksi Otomatis Tipe Data

Autodetect menganalisis data yang diterima dan memutuskan metode pengambilan secara otomatis. Dalam tabel di bawah ini, T mewakili jenis yang diinginkan seperti Material, Sprite, Image. Autodetect dapat terjadi di dua tempat dalam proses:

  • Pada nilai datum utama itu sendiri.
  • Pada nilai bermasalah yang diambil melalui datum utama.
Jenis Datum Pertimbangan Memiliki Pembantu Tema Perilaku
T n/a Y/T Digunakan langsung tanpa tema
int setiap string primitif integral atau Int32 yang dapat diurai No Diteruskan sebagai indeks untuk memperoleh GetObjectByIndex(n) untuk mengambil objek Nth jenis T.
int setiap string primitif integral atau Int32 yang dapat diurai Ya Indeks untuk mengambil keypath tema Nth dari pencarian lokal lalu mengambil objek bertema melalui deteksi otomatis.
string Format: "resource://{resourcePath}" Y/T resourcePath digunakan untuk mengambil Sumber Daya Unity
string Format: "file://{filePath} Y/T filePath digunakan untuk mengambil aset streaming
string Lainnya No Diteruskan sebagai kunci untuk mendapatkan GetObjectByKey() untuk mengambil objek jenis T yang cocok.
string Lainnya Ya Kunci untuk mengambil keypath tema yang cocok dari pencarian lokal lalu mengambil objek bertema melalui deteksi otomatis.

Contoh untuk mengambil ikon status ber tema dari database yang berisi nilai status numerik:

  1. Keypath untuk ikon status dalam database status.sprite_index.
  2. Nilai yang diambil untuk status.sprite_index adalah 2 yang berarti status "dibatalkan".
  3. Entri N=2 (dengan kata lain, ke-3) dalam pencarian DataConsumerSprite diatur ke "Status.Icons.Cancelled".
  4. Ini adalah keypath yang digunakan untuk mengambil nilai dari sumber data "tema".
  5. Nilai untuk keypath "Status.Icons.Cancelled" adalah "resource://Sprites/sprite_cancelled".
  6. Deteksi otomatis menentukan bahwa ikon harus mengambil ikon melalui sumber daya yang terletak di "Sumber Daya/Sprites/sprite_cancelled"

Lembar Gaya TextMeshPro

Tema dapat mengaktifkan lembar gaya TMPro. "Pengaturan TMP" ScriptableObject menentukan di mana lembar gaya diharapkan berada di Sumber Daya. Ini adalah properti "Default Font Asset => Path".

Pastikan untuk menempatkan StyleSheets khusus aplikasi apa pun di sub-jalur sumber daya yang sama. Jika Anda ingin mengaturnya secara berbeda, pastikan untuk memperbarui "Pengaturan TMP" agar sesuai.

Membuat Kontrol UX Baru Dapat Digunakan

Jika Anda mengembangkan kontrol UX baru, relatif mudah untuk membuatnya mudah digunakan. Sejauh kontrol menggunakan Bahan, Sprite, dan aset lain yang sudah digunakan oleh kontrol UX lainnya, umumnya masalah penamaan berbagai objek game dengan cara yang dapat ditemukan.

Anda dapat mewarisi dan MRTK_UXCore_ThemeProfile menambahkan lebih banyak bidang yang dapat digunakan, atau mengarahkan kontrol Anda ke ScriptableObject Anda sendiri. Tidak ada yang ajaib tentang yang disediakan; organisasi ScriptableObject akan menentukan keypath yang diperlukan untuk mengakses item data individual melalui C# Reflection.

Dengan menambahkan skrip BindingConfigurator.cs ke tingkat atas kontrol baru, Anda kemudian dapat menentukan BindingProfile ScriptableObject serial Anda sendiri. Ini akan memberikan nama GameObject yang diperlukan ke pemetaan KeyPath yang diperlukan untuk mengaitkan elemen yang dapat digunakan dengan data yang disediakan di profil tema. Skrip ini akan secara otomatis menambahkan komponen DataConsumerXXX yang diperlukan saat runtime untuk mendukung tema yang ingin Anda gunakan.

Memulai

Persyaratan

  • Unity 2020.3 LTS atau yang lebih baru
  • TextMeshPro 2.1.4 atau yang lebih baru

Adegan Sampel

Untuk langkah pertama, lihat lebih dekat berbagai adegan contoh pengikatan data dalam paket Contoh MRTK dan lihat bagaimana berbagai sumber data MonoBehaviours dikonfigurasi. Secara umum, skrip pengikatan data hanya perlu ditempatkan pada GameObject tingkat tertinggi dari prefab atau sekumpulan elemen UX terkait.

Selain itu, untuk sebagian besar kasus penggunaan, nilai default berfungsi "di luar kotak", tetapi properti yang terekspos memberikan banyak fleksibilitas untuk kasus yang lebih canggih.

Catatan

Untuk mengaktifkan tema untuk komponen UX MRTK standar, MRTK_UX_DATABINDING_THEMING_ENABLED simbol harus didefinisikan dalam Pengaturan Pemutar. Simbol ini memastikan tidak ada dampak performa saat tema tidak diperlukan.

Contoh/Adegan/DataBinding Aset/DataBindingExamples.scene

Adegan ini yang menunjukkan berbagai skenario data variabel. Cukup muat adegan dan mainkan. Beberapa hal yang perlu diperhatikan:

  • Bidang Input Teks komponen TextMeshPro berisi variabel yang terlihat seperti ini: {{ firstName }}. Penanda ini digunakan langsung sebagai keypath lokal.

  • Objek game untuk sprite dan teks memiliki beberapa bentuk komponen Konsumen Data yang mengelola penerimaan data dan memperbarui tampilan.

  • Satu Konsumen Data dapat dibagikan oleh beberapa komponen dengan jenis yang sama dengan ditempatkan lebih tinggi dalam hierarki GO.

  • Konsumen Data dapat menemukan Sumber Datanya sendiri selama berada di objek game yang sama atau lebih tinggi dalam hierarki GO.

  • Objek game induk memiliki komponen Sumber Data yang menyediakan data untuk semua objek permainan anak yang menyajikan sekumpulan informasi variabel terkait.

  • Konsumen Data koleksi menentukan prefab yang sendiri berisi konsumen data yang akan digunakan untuk mengisi prefab tersebut dengan data variabel.

Contoh/Adegan/Adegan Tema Aset/UX/AudioTheming

Contoh ini menggunakan tema untuk mengalihkan AudioClips antara set untuk Piano dan satu untuk Xylophone.

Contoh/Adegan Tema Aset/UX/BatteryLevelExample

Contoh ini menggabungkan tema dan pengikatan data untuk menunjukkan tingkat baterai baik sebagai nilai numerik maupun sebagai ikon. Tema digunakan untuk memilih antara tema "mengisi dayanya" dan tema "tidak mengisi daya". Ini dirancang untuk memenuhi tujuan berikut:

  • Semua aset visual dapat ada dalam satu ScriptableObject tindakan sebagai profil tema.
  • Jumlah sprite untuk status "pengisian daya" dapat berbeda dari angka untuk status "tidak mengisi daya".
  • Algoritma untuk memetakan tingkat baterai yang dilaporkan ke sprite tertentu dapat menjadi non-linier dan berbeda antara status "pengisian daya" dan "tidak mengisi daya".
  • Semua aset visual dapat ada dalam satu ScriptableObject tindakan sebagai profil tema.
  • Jumlah sprite untuk status pengisian daya dapat berbeda dari jumlah untuk status tidak mengisi daya.
  • Algoritma untuk pemetaan tingkat baterai yang dilaporkan di mana sprite dapat menjadi non-linier dan berbeda antara status pengisian daya dan tidak pengisian daya.

Catatan

Struktur demo ini bukan contoh yang baik untuk menggabungkan tema dan pengikatan data. Dalam aplikasi produksi untuk pemisahan model dan tampilan yang tepat, status baterai aktual (tingkat dan pengisian daya) akan disediakan dalam sumber data terpisah daripada pencari sumber daya untuk sprite itu sendiri.

Contoh/Adegan Tema Aset/UX/UXThemingExample

Contoh ini menunjukkan perubahan tema seluruh aplikasi dan juga menunjukkan penggunaan DataSourceGODictionary sebagai sumber data untuk mengelola berbagai konten tekstual untuk ditampilkan di UX. Dalam skenario yang lebih komprehensif, jenis sumber data lain yang lebih fleksibel kemungkinan akan memberikan fleksibilitas yang diperlukan, seperti DataSourceReflection atau DataSourceGOJson.

Proyek Pengikatan Data Pertama

Berikut adalah contoh sederhana untuk membantu Anda memulai dengan cepat:

  1. Buat adegan baru.
  2. Pada menu Mixed Reality Toolkit, pilih opsi Tambahkan ke Adegan dan Konfigurasikan .
  3. Buat objek game kosong dan ganti namanya menjadi "Pengikatan Data." Tambahkan komponen DataSourceJsonTest.
  4. Di inspektur, ubah URL menjadi: https://www.boredapi.com/api/activity
  5. Tambahkan objek UI -> Text - TextMeshPro ke objek game Pengikatan Data. Ini akan menambahkan kanvas dan kemudian objek "Teks (TMP)".
  6. Pilih objek Teks (TMP), dan di Pemeriksa, ubah Input Teks menjadi:

{{ activity }}. It's {{ type }}.

  1. Pilih objek Canvas dan tambahkan komponen Teks Konsumen Data ke dalamnya.
  2. Jalankan proyek. Setiap 15 detik, aktivitas yang berbeda akan ditampilkan.

Selamat. Anda telah membuat proyek Pengikatan Data pertama Anda dengan MRTK!

Menulis Sumber Data baru

Sumber data menyediakan data untuk satu atau beberapa konsumen data. Datanya bisa apa saja: dihasilkan secara algoritma, dalam RAM, pada disk, atau diambil dari database pusat.

Semua sumber data harus menyediakan antarmuka IDataSource. Beberapa fungsionalitas dasar ditawarkan dalam kelas dasar yang disebut DataSourceBase. Anda kemungkinan besar ingin berasal dari kelas ini untuk menambahkan fungsionalitas manajemen data tertentu khusus untuk kebutuhan Anda.

Untuk memungkinkan untuk menjatuhkan sumber data sebagai komponen ke objek game, objek dasar lain ada yang disebut DataSourceGOBase di mana GO adalah singkatan Dari GameObject. Ini adalah MonoBehavior yang dapat dihilangkan ke GameObject sebagai Komponen. Ini adalah proksi tipis yang dirancang untuk mendelegasikan pekerjaan ke sumber data inti khusus non-Unity.

Sumber data dapat mengekspos kemampuan untuk memanipulasi data dalam Editor Unity. Jika demikian, kelas turunan dapat berisi semua logika sumber data, atau dapat memanfaatkan sumber data "stok", tetapi juga menambahkan bidang Pemeriksa atau cara lain untuk mengonfigurasi data.

Menulis Konsumen Data baru

Konsumen data mendapatkan pemberitahuan ketika data telah berubah lalu memperbarui beberapa aspek pengalaman pengguna, seperti teks yang ditampilkan dalam Komponen TextMeshPro.

Semua konsumen data harus menyediakan antarmuka IDataConsumer. Beberapa fungsionalitas dasar ditawarkan dalam kelas dasar yang disebut DataConsumerGOBase, di mana GO adalah singkatan dari GameObject.

Sebagian besar pekerjaan konsumen data adalah menerima data baru dan kemudian menyiapkannya untuk presentasi. Ini mungkin semudah memilih prefab yang tepat, atau bisa berarti mengambil lebih banyak data dari layanan cloud seperti sistem manajemen konten.

Menulis placer item pengumpulan data

Placer item pengumpulan data bertanggung jawab untuk mengelola bagian mana dari koleksi yang saat ini terlihat dan cara menyajikan koleksi yang terlihat, apakah koleksi tersebut adalah daftar statis kecil atau database rekaman jutaan raksasa.

Semua placer item harus menyediakan antarmuka IDataCollectionItemPlacer. Beberapa fungsionalitas dasar ditawarkan dalam kelas dasar yang disebut DataColletionItemPlacerGOBase. Semua placer item harus berasal dari kelas ini.

Batasan yang Diketahui dan Fitur yang Hilang

  • Belum terintegrasi dengan kontrol berbasis Kanvas Unity dan daftar yang dapat digulir.
  • Integrasi .NET INotifyPropertyChanged belum diimplementasikan.
  • Contoh adegan yang mengambil gambar dari Flickr dan trymrtk.com tidak berfungsi di HoloLens karena bug HTTPS SSL di versi Unity yang lebih baru.
  • Penyetelan performa tambahan.
  • Rilis ini berfokus pada presentasi data, bukan pengambilan data. Kontrol UX MRTK belum dikabel untuk mengatur status dalam .DataSource
  • Perubahan dinamis untuk mencantumkan data sepenuhnya me-refresh seluruh daftar alih-alih memperbarui secara bertahap.
  • Alur manipulasi data belum diimplementasikan
  • Mengisi semua komponen UX pada slate belum sepenuhnya didukung.
  • Simpul DataSourceJson harus menerapkan antarmuka agar dapat dioperasikan IDataNode dengan DataSourceObjects.