Interactivos: MRTK3

MRTK se basa en el elemento XRBaseInteractable que proporciona el kit de herramientas de interacción de XR de Unity. El comportamiento interactivo existente y la API son totalmente compatibles con MRTK, y todos los elementos interactivos personalizados obedecen a la API interactiva XRI existente.

En el caso de los desarrolladores nuevos en XRI, se recomienda encarecidamente revisar primero la documentación sobre la arquitectura de XRI de Unity.

Para ampliar los mecanismos interactivos incluidos en XRI, MRTK ofrece dos clases básicas sobre las que se pueden crear interacciones avanzadas y que se complementan.

Diagrama de herencia de interactables

  • MRTKBaseInteractable : XRBaseInteractable
    • Esta clase ofrece filtrado y marcado para diferentes tipos de interactores. Aunque el elemento XRBaseInteractable base de XRI no discrimina entre los tipos de interactor, MRTKBaseInteractable proporciona características útiles para comprobar si se producen tipos de interacciones comunes. Propiedades de conveniencia como IsGazeHovered o IsGrabSelected son accesos directos para consultar si un interactor participante implementa una interfaz determinada (correspondiente, IGazeInteractor o IGrabInteractor). Estas marcas son más eficaces que recorrer en iteración la lista de interactorsHovering o interactorsSelecting. Además, MRTKBaseInteractable puede filtrar o rechazar determinados tipos de interactores, en caso de que el desarrollador quiera excluir determinadas modalidades de entrada.
  • StatefulInteractable : MRTKBaseInteractable
    • Aunque MRTKBaseInteractable simplemente agrega marcas y filtros y evita agregar cualquier estado adicional a la interacción, StatefulInteractable presenta características con estado útiles, como alternancia y selección de variables.

Separación estricta del estado y los objetos visuales

En MRTK 2.x, los elementos interactivos son a menudo responsables de administrar sus propios efectos visuales, ya sea pulsar un botón 3D, crear un efecto de desplazamiento o incluso simplemente cambiar el color en un clic. La limitación de este enfoque es que la lógica de interacción está estrechamente enlazada a los objetos visuales. Si uno fuera a rediseñar los objetos visuales o a usar otro tamaño, forma, desplazamiento, etc. del botón, el propio script de interacción tendría que cambiar.

En MRTK3, los interactivos son estado puro e interacción. El interactivo no representa ningún cambio ni efecto visuales en función de su estado interno. Es simplemente una colección de lógica de estado e interacción que es muy portátil entre las configuraciones de presentación visual.

Aislamiento estricto del estado y los objetos visuales

El mismo script PressableButton se puede usar para crear una bola de tipo "blando", un plano similar al "trackpad" presionable o un plano abstracto presionable que genera eventos de red al presionarse. Al script PressableButton ni siquiera le importa "dónde" está; podría estar dentro de un lienzo o en un cuerpo rígido.

Para controlar los objetos visuales, se usa un "controlador visual" independiente para sondear el estado del objeto interactivo y representar los comentarios adecuados. StateVisualizer es un método recomendado que usa poco código para impulsar los efectos comunes de comentarios visuales del estado interactivo, pero los desarrolladores pueden escribir sus propios controladores visuales personalizados. Por ejemplo, nuestros componentes de botón suelen usar StateVisualizer en los efectos avanzados de comentarios basados en sombreador y 3D, pero también proporcionan un ejemplo BasicPressableButtonVisuals que muestra cómo se puede crear un controlador visual sencillo en el código.

Selección de variables

StatefulInteractableLa característica adicional más útil sobre la funcionalidad XRI base es compatible con la variable Selectedness. Sin importar si los elementos interactivos de las XRI básicas se seleccionan o no, los elementos StatefulInteractable de MRTK pueden ser cualquier fracción de punto flotante de los objetos seleccionados.

Este concepto es útil cuando se trabaja en XR, ya que casi todas las formas de entrada ya no son estados binarios. Los controladores de movimiento a menudo tienen desencadenadores analógicos (o agarres analógicos), las interacciones manuales pueden proporcionar una variable "descomprimida" y las interacciones de presión volumétrica pueden apretar un botón o superficie presionable en una cantidad variable. En todas partes de XR verá estas interacciones analógicas y variables; verá que MRTK está equipado para que los desarrolladores creen interacciones agradables sobre estas entradas analógicas.

Una amplia gama de diferentes interactores y tipos de interacciones puede contribuir conjuntamente a la selección general de un objeto interactivo. En particular, todos los interactores que implementan IVariableSelectInteractor contribuyen a su cantidad de selección analógica, normalmente a través de un elemento max() de todos los interactores participantes. Esta cantidad variable se combina con las selecciones binarias y no variables procedentes de interactores de estilo "vainilla".

Para las clases derivadas como PressableButton, la función Selectedness() se reemplaza para agregar un "ingrediente" adicional al cálculo de selección. Los interactores que implementan IPokeInteractor pueden contribuir a la selección en función de su ubicación física y cómo se presionan físicamente en el interactivo. Otras clases derivadas pueden presentar otras formas arbitrarias de selección.

Selección de variables

En el caso de los interactivos que proporciona MRTK, Selectedness() y isSelected siempre tendrán el estado "acepto", es decir, nunca observará un valor Selectedness() mayor que SelectThreshold sin un elemento isSelected de XRI correspondiente y un interactor adjunto en interactorsSelecting.

Importante

Las subclases interactivas personalizadas pueden reemplazar Selectedness por algún otro valor que esté completamente desconectado del elemento isSelected de XRI, pero nuestros interactivos no lo hacen y es totalmente desaconsejable. En general, nunca escriba interacciones que no tengan un interactor correspondiente. En la gran mayoría de los casos, la selección de XRI será suficiente y las interacciones personalizadas que cree se deben escribir como interactores.

Al crear un objeto interactivo personalizado que admita un nuevo método para determinar Selectedness(), simplemente invalide el método y combine la nueva selección con la cantidad de selección existente. Si usa StateVisualizer o cualquier otra capa visual que escuche la selección de variables, responderá en consecuencia al nuevo tipo de selección.

Asignación de eventos UGUI a XRI

En algunos casos, es conveniente que los interactivos respondan a eventos UGUI, como el mouse, el controlador de juegos o la entrada de pantalla táctil. El UGUIInputAdapter, que es un UGUI Selectable, recibe eventos UGUI y los reenvía a CanvasProxyInteractor, si hay uno presente.

Flujo del adaptador de UGUI

Cuando el UGUIInputAdapter notifica al CanvasProxyInteractor de los eventos UGUI, emite acciones XRI equivalentes en el objeto interactivo relevante. La asignación entre las acciones de entrada UGUI y XRI es imperfecta y es un área de desarrollo activo.

Con este sistema, los objetos interactivos XRI existentes creados para plataformas envolventes, manos, controladores de movimiento y entrada 3D pueden reaccionar bien a los controles 2D accesibles, como el mouse y el controlador para juegos.