Condividi tramite


Menu a mano - MRTK3

Menu a mano

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.

Scena di esempio di menu a mano

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.

Esempio di menu a mano grande 1

Configurazione Palm Up

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.

Esempio di menu a mano grande 2

Infine, il pulsante chiudi deve riattivare la funzionalità del risolutore.UpdateSolvers per ripristinare la funzionalità del risolutore HandConstraint.

Esempio di menu a mano grande 3

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 SolverRotationBehaviorHandConstraintSolverin , da LookAtTrackedObject a LookAtMainCamera come angolo GazeAlignment con il risolutore varia.

Esempio di zona sicura del menu a mano

  • Eventi di attivazione: attualmente attiva HandConstraint quattro eventi di attivazione. Questi eventi possono essere usati in molte combinazioni diverse per creare comportamenti univoci HandConstraint .

    • 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 il SolverHandlervalore di UpdateSolver '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).
    • 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.
  • Reattach Logic: attualmente, l'oggetto HandConstraintPalmUp di destinazione può riassegnare automaticamente l'oggetto di destinazione al punto monitorato, indipendentemente dal fatto che l'oggetto SolverHandlersia UpdateSolver True. Questa operazione viene eseguita chiamando la HandConstraintPalmUpfunzione dopo StartWorldLockReattachCheckCoroutine() che è stata bloccata a livello mondiale (che in questo caso, imposta in modo efficace l'updateSolver di SolverHandler su False).