Menú Manual : MRTK3
Los menús de mano permiten a los usuarios abrir la interfaz de usuario conectada a mano para las funciones usadas con frecuencia. Normalmente son grupos de botones pequeños que ofrecen acciones rápidas. Sin embargo, a veces se proporcionan diseños más complejos para mostrar información o configuración al usuario como menú de mano, a menudo con la opción de "quitar" el menú de la mano y anclarlo en el mundo.
El menú Mano proporciona opciones "Requerir mano plana" y "Usar activación de mirada" para evitar la activación falsa al interactuar con otros objetos. Se recomienda usar estas opciones para evitar la activación no deseada.
Escena de ejemplo y objetos prefabricados
Si usa el proyecto de plantilla, HandMenuExamples.unity
muestra varias configuraciones comunes para los menús de mano, todo ello con el HandConstraintPalmUp
script .
HandMenuLarge
Este objeto prefabricado muestra el ejemplo de una interfaz de usuario grande o compleja que requiere un tiempo de interacción prolongado. Para este tipo de interfaz de usuario, se recomienda bloquear el menú de la mano para mejorar la facilidad de uso y evitar la fatiga de los brazos. En este ejemplo también se admiten "agarrar y extraer" para bloquear el menú.
En este ejemplo, el menú se vuelve visible e invisible activando el objeto MenuContent en el evento OnFirstHandDetected(). Con el evento OnLastHandLost(), se activa el botón Cerrar y se desencadena la animación de colocación. La animación es una simple fluctuación de escalado. Dado que no ocultamos el evento MenuContent en OnLastHandLost(), el menú se bloqueará automáticamente cuando la mano no esté visible. Los valores de la sección Palm Up se han optimizado para hacer que el menú esté bloqueado por el mundo sin arrastrarse demasiado en la lista desplegable de la mano.
En este ejemplo se proporciona la barra agarrable en el área inferior del menú y el comportamiento automático de bloqueo mundial. El usuario puede desasociar explícitamente el menú de la mano y colocarlo en el mundo agarrando esto. Para lograrlo, en el evento ManipulationStarted() de ObjectManipulator, deshabilitamos SolverHandler.UpdateSolvers. De lo contrario, el menú no podrá desasociarse, ya que HandConstraint solver intentará colocar el menú cerca de la posición de la mano. También usamos HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine para permitir que el usuario levante la mano para volver a adjuntar el menú a la mano.
Por último, el botón Cerrar debe reactivar SolverHandler.UpdateSolvers para restaurar la funcionalidad del solucionador HandConstraint.
Scripts
El comportamiento HandConstraint
proporciona un solucionador que restringe el objeto de seguimiento a una región segura para el contenido restringido a mano (como la interfaz de usuario de mano, los menús, etc.). Las regiones seguras se consideran áreas que no se dividen con la mano. También se incluye una clase derivada HandConstraint
de llamada HandConstraintPalmUp
para mostrar un comportamiento común de activar el objeto con seguimiento del solucionador cuando la palma mira hacia el usuario.
Consulte la información sobre herramientas disponible para cada HandConstraint
propiedad para obtener documentación adicional. A continuación se definen algunas propiedades con más detalle.
Zona segura: la zona segura especifica dónde se va a restringir el contenido. Se recomienda colocar el contenido en el lado ulnar para evitar superponerse con la mano y mejorar la calidad de interacción. Las zonas seguras se calculan mediante la orientación de las manos proyectadas en un plano ortogonal a la vista de la cámara y la radiodifusión en un rectángulo delimitador alrededor de las manos. Las zonas seguras se definen para que funcionen con
XRNode
. Se recomienda explorar lo que representa cada zona segura en diferentes tipos de controlador.Seguir la mano hasta la cámara orientada Con este activo, el solucionador seguirá la rotación de manos hasta que el menú esté suficientemente alineado con la mirada cuando se enfrente a la cámara. Para realizar este trabajo, cambie en
SolverRotationBehavior
HandConstraintSolver
, deLookAtTrackedObject
aLookAtMainCamera
como elGazeAlignment
ángulo con el solucionador varía.
Eventos de activación: actualmente, desencadena
HandConstraint
cuatro eventos de activación. Estos eventos se pueden usar en muchas combinaciones diferentes para crear comportamientos únicosHandConstraint
.- OnHandActivate: se desencadena cuando una mano satisface el método IsHandActive.
- OnHandDeactivate: se desencadena cuando el método IsHandActive ya no está satisfecho.
- OnFirstHandDetected: se produce cuando el estado de seguimiento de la mano cambia de ninguna de las manos a la primera mano en la vista.
- OnLastHandLost: se produce cuando el estado de seguimiento de la mano cambia de al menos una mano en vista a ninguna de las manos en la vista.
Lógica de activación/desactivación del solucionador: actualmente, la recomendación para activar y desactivar
HandConstraintPalmUp
la lógica es hacerlo mediante el uso delSolverHandler
valor deUpdateSolver
en lugar de deshabilitar o habilitar el objeto. Esto se puede ver en la escena de ejemplo a través de los enlaces basados en editor desencadenados después de los eventos ManipulationHandler "OnManipulationStarted/Ended" del menú adjunto.-
Detener la lógica de restricción de mano: al intentar establecer el objeto restringido a mano para detener (y no ejecutar la lógica de activación o desactivación), establezca UpdateSolver en False en lugar de deshabilitar HandConstraintPalmUp.
- Si desea habilitar la lógica de reintento basada en la mirada (o incluso no basada en miradas), esto va seguido de llamar a la
HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine()
función . Esto desencadenará una corrutina que continúa comprobando si se cumplen los criterios "IsValidController
" y establecerá UpdateSolver en True una vez que sea (o el objeto esté deshabilitado).
- Si desea habilitar la lógica de reintento basada en la mirada (o incluso no basada en miradas), esto va seguido de llamar a la
- Iniciar la lógica de restricción de mano: al intentar establecer el objeto restringido a mano para empezar a seguir la mano de nuevo (en función de si cumple los criterios de activación), establezca UpdateSolver de SolverHandler en true.
-
Detener la lógica de restricción de mano: al intentar establecer el objeto restringido a mano para detener (y no ejecutar la lógica de activación o desactivación), establezca UpdateSolver en False en lugar de deshabilitar HandConstraintPalmUp.
-
Lógica de reintento: actualmente,
HandConstraintPalmUp
puede volver a adjuntar automáticamente el objeto de destino al punto de seguimiento, independientemente de si elSolverHandler
valorUpdateSolver
de es True. Esto se hace mediante una llamada a laHandConstraintPalmUp
función deStartWorldLockReattachCheckCoroutine()
después de que se haya bloqueado el mundo (lo que, en este caso, establece eficazmente updateSolver de SolverHandler en False).