Interactables — MRTK3

MRTK dibangun berdasarkan yang XRBaseInteractable disediakan oleh Unity's XR Interaction Toolkit. Perilaku dan API yang dapat berinteraksi yang ada didukung penuh di MRTK, dan semua kemampuan berinteraksi kustom kami mematuhi API XRI yang dapat berinteraksi yang ada.

Untuk pengembang yang baru menggunakan XRI, kami sangat menyarankan Agar Anda terlebih dahulu meninjau dokumentasi arsitektur XRI Unity.

Untuk memperluas mekanisme yang dapat berinteraksi yang termasuk dalam XRI, MRTK menawarkan dua kelas dasar di mana interaksi canggih dapat dibangun, satu memperluas yang lain.

Interactables inheritance diagram

  • MRTKBaseInteractable : XRBaseInteractable
    • Kelas ini menawarkan pemfilteran dan penandaan untuk berbagai jenis interaksi. Meskipun XRI XRBaseInteractable dasar tidak mendiskriminasi antara jenis interaktor, MRTKBaseInteractable menyediakan fungsi kenyamanan untuk memeriksa apakah jenis interaksi umum terjadi. Properti kenyamanan seperti IsGazeHovered atau IsGrabSelected adalah pintasan untuk mengkueri apakah interaksi yang berpartisipasi mengimplementasikan antarmuka tertentu (secara sesuai, IGazeInteractor atau IGrabInteractor). Bendera ini lebih berkinerja daripada iterasi melalui daftar interactorsHovering atau interactorsSelecting. Selain itu, MRTKBaseInteractable dapat memfilter/menolak jenis interaksi tertentu jika pengembang ingin mengecualikan modalitas input tertentu.
  • StatefulInteractable : MRTKBaseInteractable
    • Saat MRTKBaseInteractable menambahkan bendera dan filter, dan menghindari penambahan status tambahan ke yang dapat berinteraksi, StatefulInteractable memperkenalkan fitur stateful yang berguna seperti pengalih dan pemilihan variabel.

Pemisahan status dan visual yang ketat

Dalam MRTK 2.x, dapat berinteraksi sering kali bertanggung jawab untuk mengendarai efek visual mereka sendiri, baik itu kompresi tombol 3D, efek hover, atau bahkan hanya mengubah warna pada satu klik. Batasan pendekatan ini adalah bahwa logika interaksi terikat erat ke visual. Jika Anda mendesain ulang visual atau menggunakan ukuran/bentuk/perpindahan/dll. tombol yang berbeda, skrip interaksi itu sendiri perlu diubah.

Di MRTK3, interaktif adalah keadaan dan interaksi murni. Yang dapat berinteraksi tidak merender perubahan atau efek visual berdasarkan status internalnya. Ini murni kumpulan status dan logika interaksi yang sangat portabel antara pengaturan presentasi visual.

Strict isolation of state and visuals

Skrip yang sama PressableButton dapat digunakan untuk membangun bola yang lincah, bidang "trackpad" seperti yang dapat ditekan, atau menekan abstrak yang mengeluarkan peristiwa jaringan saat ditekan. PressableButton Skrip bahkan tidak peduli "di mana" itu; itu bisa berada di dalam Kanvas, atau pada yang kaku.

Untuk mendorong visual, "driver visual" terpisah digunakan untuk melakukan polling status dari yang dapat berinteraksi dan merender umpan balik yang sesuai. StateVisualizer adalah metode kode rendah yang direkomendasikan untuk mendorong efek umpan balik visual umum dari status yang dapat berinteraksi, tetapi pengembang bebas menulis driver visual kustom mereka sendiri. Misalnya, komponen tombol kami umumnya digunakan StateVisualizer untuk efek umpan balik berbasis 3D + shader tingkat lanjut, tetapi kami juga memberikan contoh BasicPressableButtonVisuals yang menunjukkan bagaimana driver visual sederhana dapat ditulis dalam kode.

Pilihan variabel

StatefulInteractableFitur tambahan yang paling berguna melalui fungsionalitas XRI dasar adalah dukungan untuk variabel Selectedness. Meskipun XRI dasar dapat berinteraksi dipilih atau tidak dipilih, MRTK StatefulInteractabledapat menjadi pecahan titik mengambang yang dipilih.

Konsep ini berguna saat bekerja di XR, karena hampir semua bentuk input tidak lagi menjadi status biner. Pengontrol gerakan sering memiliki pemicu analog (atau genggaman analog!), interaksi tangan dapat memberikan variabel "terjepit", dan interaksi pers volumetrik dapat menekan tombol atau permukaan yang dapat didorong dengan jumlah yang bervariasi. Anda melihat variabel ini, interaksi analog di mana-mana di XR, dan MRTK dilengkapi untuk membantu pengembang membangun interaksi yang menyenangkan di atas input analog ini.

Berbagai interaktor dan jenis interaksi yang berbeda semuanya dapat berkontribusi bersama-sama pada Keseleksian keseluruhan yang dapat berinteraksi. Terutama, semua interaktor yang menerapkan IVariableSelectInteractor berkontribusi jumlah pemilihan analog mereka, biasanya melalui max() semua interaksi yang berpartisipasi. Jumlah variabel ini dikombinasikan dengan pilihan biner non-variabel yang berasal dari interaktor gaya vanili.

Untuk kelas turunan seperti PressableButton, Selectedness() fungsi ditimpa untuk menambahkan "bahan" tambahan ke komputasi keseleksian. Interaksi yang menerapkan IPokeInteractor dapat berkontribusi Pilihan berdasarkan lokasi fisik mereka dan bagaimana mereka secara fisik menekan pada interaktif. Kelas turunan lainnya dapat memperkenalkan bentuk seleksi arbitrer lainnya.

Variable selectedness

Untuk MRTK yang dapat berinteraksi menyediakan, Selectedness() dan isSelected akan selalu "setuju"--dengan kata lain, Anda tidak akan pernah mengamati yang Selectedness() lebih besar dari SelectThreshold tanpa XRI isSelected yang sesuai dan interaksi yang menyertainya di interactorsSelecting.

Penting

Subkelas yang dapat berinteraksi kustom Anda jelas dapat mengambil alih Selectedness ke beberapa nilai lain yang sepenuhnya terputus dari XRI isSelected; namun, kemampuan berinteraksi kami tidak melakukan ini, dan kami sangat mencegahnya. Secara umum, jangan pernah menulis interaksi yang tidak memiliki interaksi yang sesuai. Pemilihan XRI akan, dalam sebagian besar kasus, cukup, dan interaksi kustom apa pun yang Anda bangun harus ditulis sebagai interaksi.

Saat Anda membuat interaktif kustom yang mendukung metode baru untuk menentukan Selectedness(), cukup ganti metode dan gabungkan pilihan baru Anda dengan jumlah pilihan yang ada. Jika Anda menggunakan StateVisualizer atau lapisan visual lain yang mendengarkan pemilihan variabel, itu akan merespons sesuai dengan jenis pilihan baru Anda.

Memetakan peristiwa UGUI ke XRI

Dalam beberapa kasus, diinginkan untuk memiliki interaktif merespons peristiwa UGUI, seperti mouse, gamepad, atau input layar sentuh. UGUIInputAdapter, yang merupakan UGUI Selectable, menerima peristiwa UGUI dan meneruskannya ke CanvasProxyInteractor, jika ada.

UGUI adapter flow

CanvasProxyInteractor Ketika diberi tahu tentang peristiwa UGUI oleh UGUIInputAdapter, ini mengeluarkan tindakan XRI yang setara pada yang relevan yang dapat berinteraksi. Pemetaan antara input UGUI dan tindakan XRI agak rugi dan merupakan area pengembangan aktif.

Dengan sistem ini, XRI yang ada dapat berinteraksi yang dibangun untuk platform imersif, tangan, pengontrol gerakan, dan input 3D dapat bereaksi sama baiknya dengan kontrol 2D yang dapat diakses seperti mouse dan gamepad.