Menu a mano - MRTK3
I menu di mano consentono agli utenti di visualizzare l'interfaccia utente associata a mano per le funzioni usate di frequente. Questi sono in genere piccoli gruppi di pulsanti che offrono azioni rapide. Tuttavia, a volte layout più complessi per la visualizzazione di informazioni o impostazioni vengono forniti all'utente come menu a mano, spesso con l'opzione di "strappare" il menu dalla mano e ancorarlo nel mondo.
Il menu Mano fornisce le opzioni "Richiedi mano piatta" e "Usa attivazione sguardo" per impedire l'attivazione false durante l'interazione con altri oggetti. È consigliabile usare queste opzioni per impedire l'attivazione indesiderata.
Scena di esempio e Prefab
Se si usa il progetto modello, HandMenuExamples.unity
vengono illustrate diverse configurazioni comuni per i menu a mano, tutto usando lo HandConstraintPalmUp
script.
HandMenuLarge
Questo prefab illustra l'esempio di un'interfaccia utente complessa o di grandi dimensioni che richiede tempo di interazione estesa. Per questo tipo di interfaccia utente, è consigliabile bloccare il menu a discesa per migliorare l'usabilità ed evitare la stanchezza del braccio. Questo esempio supporta anche "grab and pull" per bloccare il menu.
In questo esempio il menu diventa visibile e invisibile attivando l'oggetto MenuContent nell'evento OnFirstHandDetected(). Con l'evento OnLastHandLost() viene attivato il pulsante di chiusura e viene attivata l'animazione di posizionamento. L'animazione è una semplice fluttuazione del ridimensionamento. Poiché non è stato nascosto l'evento MenuContent on OnLastHandLost(), il menu verrà bloccato automaticamente quando la mano non è visibile. I valori della sezione Palm Up sono stati ottimizzati per rendere bloccato il menu senza essere trascinati troppo a discesa.
![Configurazione Palm Up](../../../mrtk3-overview/images/uxbuildingblocks/handmenu/mrtk_examples_handmenu_large1a.png)
In questo esempio viene fornita la barra afferrabile nella parte inferiore del menu e il comportamento di blocco automatico del mondo. L'utente può scollegare in modo esplicito il menu dalla mano e posizionarlo nel mondo afferrandolo. A questo scopo, nell'evento ManipulationStarted() in ObjectManipulator viene disabilitato SolverHandler.UpdateSolvers. In caso contrario, il menu non sarà in grado di essere scollegato poiché il risolutore HandConstraint tenterà di posizionare il menu vicino alla posizione della mano. Si usa anche HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine per consentire all'utente di alzare la mano per riassegnare il menu alla mano.
Infine, il pulsante chiudi deve riattivare la funzionalità del risolutore.UpdateSolvers per ripristinare la funzionalità del risolutore HandConstraint.
Script
Il HandConstraint
comportamento fornisce un risolutore che limita l'oggetto monitorato a un'area sicura per il contenuto vincolato a mano (ad esempio interfaccia utente, menu e così via) Le aree sicure sono considerate aree che non si intersecano con la mano. Una classe derivata di HandConstraint
chiamata HandConstraintPalmUp
è inclusa anche per illustrare un comportamento comune dell'attivazione dell'oggetto risolutore quando il palmo è rivolto all'utente.
Per ogni HandConstraint
proprietà, vedere le descrizioni comandi disponibili per una documentazione aggiuntiva. Di seguito sono definite alcune proprietà.
Zona sicura: la zona sicura specifica la posizione in cui limitare il contenuto. È consigliabile inserire il contenuto sul lato Ulnar per evitare la sovrapposizione con la mano e migliorare la qualità dell'interazione. Le zone sicure vengono calcolate dall'orientamento delle mani proiettate in un piano ortogonale alla vista della fotocamera e al raycasting su un rettangolo di selezione intorno alle mani. Le zone sicure sono definite per lavorare con
XRNode
. È consigliabile esplorare ciò che ogni zona sicura rappresenta in tipi di controller diversi.Segui la mano fino a quando la fotocamera non è rivolta Con questo attivo, il risolutore seguirà la rotazione della mano fino a quando il menu è sufficientemente allineato con lo sguardo quando si trova la fotocamera. Per apportare questo lavoro, modificare l'oggetto
SolverRotationBehavior
HandConstraintSolver
in , daLookAtTrackedObject
aLookAtMainCamera
come angoloGazeAlignment
con il risolutore varia.
Eventi di attivazione: attualmente attiva
HandConstraint
quattro eventi di attivazione. Questi eventi possono essere usati in molte combinazioni diverse per creare comportamenti univociHandConstraint
.- OnHandActivate: attiva quando una mano soddisfa il metodo IsHandActive.
- OnHandDeactivate: attiva quando il metodo IsHandActive non è più soddisfatto.
- OnFirstHandDetected: si verifica quando lo stato di rilevamento delle mani cambia da nessuna mano in vista alla prima mano.
- OnLastHandLost: si verifica quando lo stato di rilevamento della mano cambia da almeno una mano in vista a nessuna mano in vista.
Logica di attivazione/disattivazione del risolutore: attualmente, la raccomandazione per l'attivazione e la disattivazione
HandConstraintPalmUp
della logica consiste nell'usare ilSolverHandler
valore diUpdateSolver
's anziché disabilitando/abilitando l'oggetto. Ciò può essere visualizzato nella scena di esempio tramite gli hook basati sull'editor attivati dopo gli eventi ManipulationHandler del menu collegato "OnManipulationStarted/End".-
Arresto della logica del vincolo a mano: quando si tenta di impostare l'oggetto vincolato a mano su arresta (e non eseguire la logica di attivazione/disattivazione), impostare UpdateSolver su False anziché disabilitare HandConstraintPalmUp.
- Se si vuole abilitare la logica reattach basata sullo sguardo (o anche non basata su sguardo), questa operazione viene seguita chiamando la
HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine()
funzione. Verrà attivata una coroutine che continua a verificare se i criteri "IsValidController
" vengono soddisfatti e imposta UpdateSolver su True una volta che è (o l'oggetto è disabilitato).
- Se si vuole abilitare la logica reattach basata sullo sguardo (o anche non basata su sguardo), questa operazione viene seguita chiamando la
- Avvio della logica del vincolo a mano: quando si tenta di impostare l'oggetto vincolato della mano per iniziare di nuovo a seguire la mano (in base al fatto che soddisfi i criteri di attivazione), impostare UpdateSolver di SolverHandler su true.
-
Arresto della logica del vincolo a mano: quando si tenta di impostare l'oggetto vincolato a mano su arresta (e non eseguire la logica di attivazione/disattivazione), impostare UpdateSolver su False anziché disabilitare HandConstraintPalmUp.
-
Reattach Logic: attualmente, l'oggetto
HandConstraintPalmUp
di destinazione può riassegnare automaticamente l'oggetto di destinazione al punto monitorato, indipendentemente dal fatto che l'oggettoSolverHandler
siaUpdateSolver
True. Questa operazione viene eseguita chiamando laHandConstraintPalmUp
funzione dopoStartWorldLockReattachCheckCoroutine()
che è stata bloccata a livello mondiale (che in questo caso, imposta in modo efficace l'updateSolver di SolverHandler su False).