Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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, parfois, des dispositions plus complexes pour afficher des informations ou des paramètres sont fournies à l’utilisateur sous la forme d’un menu de main, souvent avec la possibilité 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 une 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 à l’aide du 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 à main pour améliorer la facilité d’utilisation et éviter la fatigue des bras. Cet exemple prend également en charge « grab and pull » 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 placement 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 est automatiquement verrouillé lorsque la main n’est pas visible. Les valeurs de la section Palm Up ont été optimisées pour rendre le menu world-locked sans être trop glissé vers le bas lors du déplacement manuelle.
Cet exemple fournit la barre pouvant être saisie 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 le saisissant. Pour ce faire, sur 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 solverHandler.UpdateSolvers pour restaurer les fonctionnalités du solveur HandConstraint.
Scripts
Le HandConstraint comportement fournit un solveur qui limite l’objet suivi à une région sûre pour le contenu à contrainte manuelle (par exemple, l’interface utilisateur de la main, les menus, etc.) Les régions sûres sont considérées comme des zones qui ne se croisent pas avec la main. Une classe dérivée de HandConstraint appelée HandConstraintPalmUp est également incluse pour illustrer un comportement courant d’activation de l’objet suivi du solveur lorsque la paume est face à l’utilisateur.
Consultez les info-bulles disponibles pour chaque HandConstraint propriété pour obtenir de la 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ù limiter le contenu. Il est recommandé de placer le contenu côté Ulnar pour éviter tout chevauchement avec la main et améliorer la qualité de l’interaction. Les zones de sécurité sont calculées par l’orientation des mains projetée dans un plan orthogonal à la vue de la caméra et le 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’à l’appareil photo Avec cet actif, le solveur suivra la rotation de la main jusqu’à ce que le menu soit suffisamment aligné sur le regard lorsqu’il fait face à la caméra. Pour que cela fonctionne, modifiez dans
SolverRotationBehaviorleHandConstraintSolver, deLookAtTrackedObjectàLookAtMainCamera, car l’angleGazeAlignmentavec le solveur varie.
Événements d’activation : actuellement, le
HandConstraintdé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 de la main passe de l’absence de mains en vue à la première main dans la vue.
- OnLastHandLost : se produit lorsque l’état de suivi de la main passe d’au moins une main en vue à aucune main dans la vue.
Logique d’activation/désactivation du solveur : actuellement, il est recommandé d’activer et de désactiver
HandConstraintPalmUpla logique en utilisant laSolverHandlervaleur de plutôt qu’enUpdateSolverdésactivant/en activant l’objet. Cela peut être vu 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 joint.-
Arrêt de la logique de contrainte de main : lorsque vous essayez de définir l’objet contraint à la main pour qu’il s’arrête (sans exécuter la logique d’activation/désactivation), définissez UpdateSolver sur False au lieu 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 par l’appel de la
HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine()fonction . Cela déclenche une coroutine qui continue à case activée si les critères «IsValidController» sont remplis et définit 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 par l’appel de la
- Démarrage de la logique de contrainte manuelle : lorsque vous essayez de définir l’objet hand contrainte pour qu’il commence à suivre à nouveau votre main (selon qu’il répond ou non aux critères d’activation), définissez UpdateSolver de SolverHandler sur true.
-
Arrêt de la logique de contrainte de main : lorsque vous essayez de définir l’objet contraint à la main pour qu’il s’arrête (sans exécuter la logique d’activation/désactivation), définissez UpdateSolver sur False au lieu de désactiver HandConstraintPalmUp.
-
Rattacher la logique : actuellement, le
HandConstraintPalmUppeut automatiquement rattacher l’objet cible au point suivi, que le ait laSolverHandlerUpdateSolvervaleur True ou non. Pour ce faire, appelez laHandConstraintPalmUpfonction deStartWorldLockReattachCheckCoroutine()une fois qu’elle a été verrouillée dans le monde (ce qui, dans ce cas, a pour effet de définir UpdateSolver de SolverHandler sur False).