Menu main — MRTK3
Les menus main permettent aux utilisateurs d’afficher l’interface utilisateur attachée à la main pour les fonctions fréquemment utilisées. Il s’agit généralement de petits groupes de boutons qui offrent des actions rapides. Toutefois, des dispositions parfois plus complexes pour afficher des informations ou des paramètres sont fournies à l’utilisateur sous la forme d’un menu de main, souvent avec l’option de « déchirer » le menu de la main et de l’ancrer dans le monde.
Le menu Main fournit les options « Exiger une main plate » et « Utiliser l’activation du regard » pour empêcher la fausse activation lors de l’interaction avec d’autres objets. Il est recommandé d’utiliser ces options pour empêcher l’activation indésirable.
Exemple de scène et de préfabriqués
Si vous utilisez le projet de modèle, HandMenuExamples.unity
illustre plusieurs configurations courantes pour les menus main, toutes utilisant le HandConstraintPalmUp
script.
HandMenuLarge
Ce préfabriqué illustre l’exemple d’une interface utilisateur volumineuse ou complexe qui nécessite un temps d’interaction étendu. Pour ce type d’interface utilisateur, il est recommandé de verrouiller le menu à la main pour améliorer la facilité d’utilisation et éviter la fatigue des bras. Cet exemple prend également en charge « saisir et extraire » pour verrouiller le menu.
Dans cet exemple, le menu devient visible et invisible en activant l’objet MenuContent sur l’événement OnFirstHandDetected(). Avec l’événement OnLastHandLost(), le bouton fermer est activé et l’animation de positionnement est déclenchée. L’animation est une fluctuation de mise à l’échelle simple. Étant donné que nous n’avons pas masqué l’événement MenuContent sur OnLastHandLost(), le menu sera automatiquement verrouillé dans le monde lorsque la main n’est pas visible. Les valeurs de la section Palm Up ont été optimisées pour rendre le menu verrouillé sans être déplacé trop vers le bas à la main.

Cet exemple fournit la barre attrapable dans la zone inférieure du menu et le comportement de verrouillage automatique du monde. L’utilisateur peut détacher explicitement le menu de la main et le placer dans le monde en l’attrapant. Pour ce faire, dans l’événement ManipulationStarted() dans ObjectManipulator, nous désactivons SolverHandler.UpdateSolvers. Sinon, le menu ne pourra pas être détaché, car le solveur HandConstraint tentera de positionner le menu près de la position de la main. Nous utilisons également HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine pour permettre à l’utilisateur de lever la main pour rattacher le menu à la main.
Enfin, le bouton fermer doit réactiver le SolverHandler.UpdateSolvers pour restaurer la fonctionnalité du solveur HandConstraint.
Scripts
Le comportement HandConstraint
fournit un résolveur qui limite l’objet suivi à une région sécurisée pour le contenu contraint à la main (par exemple, interface utilisateur et menus Main, etc.). Les régions sûres sont considérées comme des zones qui ne présentent pas d’intersection avec la main. Une classe dérivée de HandConstraint
appelée HandConstraintPalmUp
est également incluse pour illustrer un comportement courant de l’activation de l’objet suivi du résolveur lorsque la paume est orientée vers l’utilisateur.
Consultez les info-bulles disponibles pour chaque HandConstraint
propriété pour obtenir une documentation supplémentaire. Quelques propriétés sont définies plus en détail ci-dessous.
Zone sécurisée : la zone sécurisée spécifie où, d’une part, pour limiter le contenu. Il est recommandé de placer le contenu côté Ulnar pour éviter de chevaucher la main et d’améliorer la qualité des interactions. Les zones sûres sont calculées par l’orientation des mains projetée dans un plan orthogonal à la vue de la caméra et raycasting par rapport à un cadre englobant autour des mains. Les zones sécurisées sont définies pour fonctionner avec
XRNode
. Il est recommandé d’explorer ce que représente chaque zone sécurisée sur différents types de contrôleurs.Suivre la main jusqu’à la caméra face Avec ce solveur actif, le solveur suit la rotation des mains jusqu’à ce que le menu soit suffisamment aligné avec le regard lorsqu’il fait face à la caméra. Pour effectuer ce travail, modifiez la
SolverRotationBehavior
valeur dans leHandConstraintSolver
, deLookAtTrackedObject
àLookAtMainCamera
mesure que l’angleGazeAlignment
avec le solveur varie.
Événements d’activation : actuellement, le déclencheur
HandConstraint
déclenche quatre événements d’activation. Ces événements peuvent être utilisés dans de nombreuses combinaisons différentes pour créer des comportements uniquesHandConstraint
.- OnHandActivate : se déclenche lorsqu’une main satisfait à la méthode IsHandActive.
- OnHandDeactivate : se déclenche lorsque la méthode IsHandActive n’est plus satisfaite.
- OnFirstHandDetected : se produit lorsque l’état de suivi des mains passe d’aucune main en vue à la première main dans l’affichage.
- OnLastHandLost : se produit lorsque l’état de suivi des mains passe d’au moins une main en vue à aucune main.
Logique d’activation/désactivation du solveur : actuellement, la recommandation d’activation et de désactivation
HandConstraintPalmUp
de la logique consiste à utiliser laSolverHandler
valeur de l’objetUpdateSolver
plutôt qu’en désactivant/activant l’objet. Vous pouvez le voir dans l’exemple de scène via les hooks basés sur l’éditeur déclenchés après les événements ManipulationHandler « OnManipulationStarted/Ended » du menu attaché.- Arrêt de la logique de contrainte manuelle : lorsque vous essayez de définir l’objet contrainte à la main pour arrêter (et non exécuter la logique d’activation/désactivation), définissez UpdateSolver sur False plutôt que de désactiver HandConstraintPalmUp.
- Si vous souhaitez activer la logique de rattachement basée sur le regard (ou même non basée sur le regard), cette opération est suivie de l’appel de la
HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine()
fonction. Cela déclenche une coroutine qui continue à vérifier si les critères «IsValidController
» sont remplis et définissent UpdateSolver sur True une fois qu’il est (ou l’objet est désactivé).
- Si vous souhaitez activer la logique de rattachement basée sur le regard (ou même non basée sur le regard), cette opération est suivie de l’appel de la
- Démarrage de la logique de contrainte manuelle : lorsque vous essayez de définir l’objet contraint à la main pour recommencer à suivre votre main (selon qu’il répond aux critères d’activation), définissez UpdateSolver du SolverHandler sur true.
- Arrêt de la logique de contrainte manuelle : lorsque vous essayez de définir l’objet contrainte à la main pour arrêter (et non exécuter la logique d’activation/désactivation), définissez UpdateSolver sur False plutôt que de désactiver HandConstraintPalmUp.
- Retacher la logique : actuellement, il
HandConstraintPalmUp
peut rattacher automatiquement l’objet cible au point suivi, que leSolverHandler
' soitUpdateSolver
vrai ou non. Pour ce faire, appelez laHandConstraintPalmUp
fonction 'StartWorldLockReattachCheckCoroutine()
une fois qu’elle a été verrouillée dans le monde (ce qui, dans ce cas, définit efficacement UpdateSolver de SolverHandler sur False).