Menu tangan — MRTK3
Menu tangan memungkinkan pengguna memunculkan UI yang terpasang tangan untuk fungsi yang sering digunakan. Ini biasanya adalah grup tombol kecil yang menawarkan tindakan cepat. Namun, terkadang tata letak yang lebih kompleks untuk menampilkan informasi atau pengaturan diberikan kepada pengguna sebagai menu tangan, seringkali dengan opsi untuk "merobek" menu dari tangan dan jangkarnya di dunia.
Menu Tangan menyediakan opsi 'Memerlukan Tangan Datar' dan 'Gunakan Aktivasi Tatapan' untuk mencegah aktivasi palsu saat berinteraksi dengan objek lain. Disarankan untuk menggunakan opsi ini untuk mencegah aktivasi yang tidak diinginkan.
Contoh adegan dan Prefab
Jika Anda menggunakan proyek templat, HandMenuExamples.unity
tunjukkan beberapa konfigurasi umum untuk menu tangan, semuanya menggunakan HandConstraintPalmUp
skrip.
HandMenuLarge
Prefab ini menunjukkan contoh UI besar atau kompleks yang memerlukan waktu interaksi yang diperpanjang. Untuk UI jenis ini, disarankan untuk mengunci menu di tangan untuk meningkatkan kegunaan dan menghindari kelelahan lengan. Contoh ini juga mendukung 'ambil dan tarik' untuk mengunci menu di dunia.
Dalam contoh ini, menu menjadi terlihat dan tidak terlihat dengan mengaktifkan objek MenuContent pada peristiwa OnFirstHandDetected(). Dengan peristiwa OnLastHandLost(), tombol tutup diaktifkan, dan animasi penempatan dipicu. Animasinya adalah fluktuasi penskalaan sederhana. Karena kami tidak menyembunyikan MenuContent pada acara OnLastHandLost(), menu akan secara otomatis terkunci di dunia ketika tangan tidak terlihat. Nilai di bagian Palm Up telah dioptimalkan untuk membuat menu terkunci di dunia tanpa terlalu banyak diseret di tangan.
Contoh ini menyediakan bilah yang dapat diambil di area bawah menu dan perilaku penguncian dunia otomatis. Pengguna dapat secara eksplisit melepaskan menu dari tangan dan menempatkannya di dunia dengan mengambil ini. Untuk mencapai hal ini, pada peristiwa ManipulationStarted() di ObjectManipulator, kami menonaktifkan SolverHandler.UpdateSolvers. Jika tidak, menu tidak akan dapat dilepas karena pemecah HandConstraint akan mencoba memposisikan menu di dekat posisi tangan. Kami juga menggunakan HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine untuk memungkinkan pengguna mengangkat tangan untuk memasang kembali menu ke tangan.
Terakhir, tombol tutup perlu mengaktifkan kembali SolverHandler.UpdateSolvers untuk memulihkan fungsionalitas pemecah HandConstraint.
Skrip
Perilaku ini HandConstraint
menyediakan pemecah yang membatasi objek terlacak ke wilayah yang aman untuk konten yang dibatasi tangan (seperti UI tangan, menu, dll.) Wilayah yang aman dianggap sebagai area yang tidak bersinggungan dengan tangan. Kelas turunan yang HandConstraint
dipanggil HandConstraintPalmUp
juga disertakan untuk menunjukkan perilaku umum dalam mengaktifkan objek yang dilacak pemecah saat telapak tangan menghadap pengguna.
Lihat tipsalat yang tersedia untuk setiap HandConstraint
properti untuk dokumentasi tambahan. Beberapa properti didefinisikan secara lebih rinci di bawah ini.
Zona Aman: Zona aman menentukan di mana di tangan membatasi konten. Disarankan agar konten ditempatkan di Sisi Ulnar untuk menghindari tumpang tindih dengan tangan dan peningkatan kualitas interaksi. Zona aman dihitung dengan orientasi tangan yang diproyeksikan ke dalam bidang ortogonal ke pandangan kamera dan raycasting terhadap kotak pembatas di sekitar tangan. Zona aman didefinisikan untuk bekerja dengan
XRNode
. Menjelajahi apa yang diwakili setiap zona aman pada berbagai jenis pengontrol disarankan.Ikuti Tangan Hingga Menghadap Kamera Dengan aktif ini, pemecah akan mengikuti rotasi tangan sampai menu cukup selaras dengan tatapan saat menghadap kamera. Untuk membuat pekerjaan ini, ubah
SolverRotationBehavior
diHandConstraintSolver
, dariLookAtTrackedObject
keLookAtMainCamera
sebagaiGazeAlignment
sudut dengan pemecah bervariasi.
Peristiwa Aktivasi: Saat ini,
HandConstraint
memicu empat peristiwa aktivasi. Peristiwa ini dapat digunakan dalam banyak kombinasi yang berbeda untuk membuat perilaku unikHandConstraint
.- OnHandActivate: memicu ketika tangan memenuhi metode IsHandActive.
- OnHandDeactivate: memicu ketika metode IsHandActive tidak lagi terpenuhi.
- OnFirstHandDetected: terjadi ketika status pelacakan tangan berubah dari tanpa tangan terlihat ke tangan pertama dalam tampilan.
- OnLastHandLost: terjadi ketika status pelacakan tangan berubah dari setidaknya satu tangan dalam tampilan menjadi tidak ada tangan yang terlihat.
Logika Aktivasi/Penonaktifan Solver: Saat ini, rekomendasi untuk mengaktifkan dan menonaktifkan
HandConstraintPalmUp
logika adalah dengan menggunakanSolverHandler
nilai daripadaUpdateSolver
menonaktifkan/mengaktifkan objek. Ini dapat dilihat dalam contoh adegan melalui kait berbasis editor yang dipicu setelah menu terpasang peristiwa ManipulationHandler "OnManipulationStarted/Ended".- Menghentikan logika batasan tangan: Saat mencoba mengatur objek yang dibatasi tangan untuk berhenti (dan tidak menjalankan logika aktivasi/penonaktifan), atur UpdateSolver ke False daripada menonaktifkan HandConstraintPalmUp.
- Jika Anda ingin mengaktifkan logika Reattach berbasis tatapan (atau bahkan berbasis non-tatapan), ini kemudian diikuti dengan memanggil
HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine()
fungsi . Ini akan memicu coroutine yang terus memeriksa apakah kriteria "IsValidController
" terpenuhi dan akan mengatur UpdateSolver ke True setelah itu (atau objek dinonaktifkan).
- Jika Anda ingin mengaktifkan logika Reattach berbasis tatapan (atau bahkan berbasis non-tatapan), ini kemudian diikuti dengan memanggil
- Memulai logika batasan tangan: Saat mencoba mengatur objek yang dibatasi tangan untuk mulai mengikuti tangan Anda lagi (berdasarkan apakah memenuhi kriteria aktivasi), atur UpdateSolver SolverHandler ke true.
- Menghentikan logika batasan tangan: Saat mencoba mengatur objek yang dibatasi tangan untuk berhenti (dan tidak menjalankan logika aktivasi/penonaktifan), atur UpdateSolver ke False daripada menonaktifkan HandConstraintPalmUp.
- Memasang kembali Logika: Saat ini,
HandConstraintPalmUp
dapat secara otomatis memasang kembali objek target ke titik yang dilacak, terlepas dari apakahSolverHandler
ituUpdateSolver
True. Ini dilakukan dengan memanggilHandConstraintPalmUp
fungsi setelahStartWorldLockReattachCheckCoroutine()
dikunci di dunia (yang dalam hal ini, secara efektif mengatur UpdateSolver SolverHandler ke False).