Menu tangan — MRTK3

Menu Tangan

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.

Contoh Adegan Menu Tangan

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 Menu Tangan Besar 1

Konfigurasi Palm Up

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.

Contoh Menu Tangan Besar 2

Terakhir, tombol tutup perlu mengaktifkan kembali SolverHandler.UpdateSolvers untuk memulihkan fungsionalitas pemecah HandConstraint.

Contoh Menu Tangan Besar 3

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 di HandConstraintSolver, dari LookAtTrackedObject ke LookAtMainCamera sebagai GazeAlignment sudut dengan pemecah bervariasi.

Contoh Menu Tangan Zona Aman

  • Peristiwa Aktivasi: Saat ini, HandConstraint memicu empat peristiwa aktivasi. Peristiwa ini dapat digunakan dalam banyak kombinasi yang berbeda untuk membuat perilaku unik HandConstraint .

    • 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 menggunakan SolverHandlernilai daripada UpdateSolver 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).
    • 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.
  • Memasang kembali Logika: Saat ini, HandConstraintPalmUp dapat secara otomatis memasang kembali objek target ke titik yang dilacak, terlepas dari apakah SolverHandleritu UpdateSolver True. Ini dilakukan dengan memanggil HandConstraintPalmUpfungsi setelah StartWorldLockReattachCheckCoroutine() dikunci di dunia (yang dalam hal ini, secara efektif mengatur UpdateSolver SolverHandler ke False).