Visualizador de estado: MRTK3

Gráfico que muestra el script del visualizador de estado en la ventana inspector de Unity.

StateVisualizer es una interfaz que los diseñadores pueden usar con facilidad y que requiere poco código. Esta puede ayudarle a crear comentarios visuales en respuesta a distintos estados de interacción. En concreto, le permite usar tanto efectos complejos, basados en animaciones, como efectos comunes predefinidos.

Filosofía

En el MRTK3, aplicamos una separación entre los estados y los objetos visuales. Aunque los objetos con los que se puede interactuar son responsables de su propia lógica y estado de interacción, estos no están diseñados para representar sus propios objetos visuales o efectos en función de su estado. Esta separación se lleva a cabo para que tanto la lógica como el estado de interacción puedan reutilizarse en varios contextos visuales, así como para que los comentarios visuales y la dirección artística de una interacción puedan personalizarse sin necesidad de modificar el estado o la interacción subyacentes. Además, combinar el estado con los objetos visuales podría dar lugar a código que no se pueda mantener, que incluiría relaciones complejas y difíciles de entender entre los efectos visuales y las interacciones que estos representan.

Es por esto que, por lo general, StateVisualizer no utiliza estados. En su lugar, este escucha a una clase StatefulInteractable asociada y ejecuta un gráfico de elementos IEffect en función del estado de interacción actual. En StateVisualizer, los estados complejos como Selectedness y la intención de desplazamiento pasiva o activa están expuestos para su uso. Algunos efectos pueden responder al valor de selección fraccional para impulsar bonitos efectos "analógicos" que respondan cuando el usuario se mueva o haga un gesto de reducción o de presión.

La interfaz StateVisualizer se basa parcialmente en la API de Playables de Unity.

Cómo se usa

Agregue StateVisualizer, junto con un animador, al objeto con el que se puede interactuar. Elija un estado y agregue los efectos deseados. Si la interfaz StateVisualizer no encuentra el objeto con el que se puede interactuar en tiempo de ejecución, asegúrese de que la propiedad Interactable esté establecida.

Importante

NO es necesario tener un controlador de animadores en el animador, excepto si va a crear efectos. StateVisualizer controla el animador directamente a través de la API de Playables. Además, StateVisualizer evita el uso de los controladores de animadores para mejorar el rendimiento y el mantenimiento.

Adición de un efecto

Creación de animaciones con StateVisualizer

Como la interfaz StateVisualizer no usa controladores de animadores, las animaciones no se pueden previsualizar mientras se están editando de forma predeterminada. Para resolver esto, cree un controlador de animadores (clase AnimatorController) temporal que contenga las animaciones pertinentes en las que esté trabajando y haga referencia a él en el animador. Sin embargo, recuerde que estos no son necesarios en tiempo de ejecución y que pueden tener un impacto no deseado en el rendimiento si no se quitan.

El MRTK incluye ejemplos de controladores de creación (clases AuthoringControllers) que usamos para crear los efectos de animación de nuestros componentes. No dude en duplicar nuestro ejemplo para aplicarlo a sus propias necesidades.

Rendimiento

La interfaz StateVisualizer se ha creado para obtener un rendimiento óptimo a pesar de su uso de animadores y animaciones de Unity que, en otros contextos, podrían ser costosos a escala. Para resolver estos problemas, StateVisualizer selecciona el animador de forma inteligente y minimiza agresivamente la cantidad de tiempo que este se ejecuta. Además, la API de Playables tiene un rendimiento significativamente mayor que las máquinas de estado que utilizan controladores de animadores. La ausencia de estos controladores contribuye significativamente a la simplicidad del sistema de StateVisualizer y su rendimiento a escala.

Actualmente, StateVisualizer sondea el estado interactivo en lugar de depender de clientes de escucha de eventos que reaccionen únicamente cuando es necesario. Esta parte de StateVisualizer se encuentra bajo desarrollo y podría refactorizarse para poder usar clientes de escucha de eventos y aumentar aún más el rendimiento.

Efectos

Efecto Descripción
AnimationEffect

Vista inspector AnimationEffect
En el modo OneShot, se reproduce una sola animación hacia delante cuando se activa el estado y la misma animación hacia atrás cuando este se desactiva. En el modo PlaybackTimeMatchesValue, el tiempo de reproducción de la animación se controla directamente mediante el valor fraccional del estado (por ejemplo, "Selectedness" para el estado "Select").
TwoWayAnimationEffect

Vista del inspector TwoWayAnimationEffect
Este efecto es similar al modo OneShot del efecto AnimationEffect pero, además, usa dos animaciones independientes; una para cada "dirección".
GraphicTintEffect

Vista inspector GraphicTintEffect
Con este efecto, se tiñe una lista de componentes Graphic de un color determinado. Este efecto ofrece las mismas opciones de PlaybackMode que el efecto AnimationEffect y con resultados similares (OneShot realiza una transición completa cuando cambia de estado, mientras que PlaybackTimeMatchesValue hace que el progreso de la transición coincida con el valor fraccional del estado).

  • El valor reemplazar hace que los colores se tiñan del color especificado.
  • El valor aditivo hace que el color especificado se mezcle con el color ya existente.
  • El valor multiplicar hace que el nuevo color se multiplique en el color ya existente.

    Estas operaciones de mezcla se combinarán sobre cualquier otro tinte o animación que se estén ejecutando actualmente en el gráfico de la interfaz StateVisualizer. Tenga en cuenta que si los objetos que se pueden teñir tienen colores iniciales diferentes, este efecto de tinte podría mezclarse incorrectamente. Use efectos de tinte separados para los elementos que tengan diferentes colores base.
  • SpriteTintEffect

    Vista del inspector SpriteTintEffect
    Con este efecto se realiza, exactamente, la misma operación que GraphicTintEffect, pero debe aplicarse a elementos SpriteRenderer.
    SpriteSwapEffect

    Vista del inspector SpriteSwapEffect
    Con este efecto, se establece el elemento Image de destino como ActiveSprite o InactiveSprite en función de si el estado se encuentra activo o inactivo actualmente. Esto resulta útil para crear alternancias.
    SetTargetsActiveEffect

    Vista del inspector SetTargetsActiveEffect
    Con este efecto, se habilita o deshabilita la lista de elementos "GameObject" en función de si el estado se encuentra activo o inactivo. Establecer el valor Invert provocará el comportamiento opuesto.
    PlayableAssetEffect

    Vista del inspector PlayableAssetEffect
    El activo StateVisualAsset es un elemento "ScriptableObject" que contiene un recurso reproducible reutilizable. Este efecto conecta ese recurso reproducible con el grafo de la interfaz StateVisualizer. (Esta característica todavía es experimental y está sujeta a cambios).

    Efectos personalizados

    La mayoría de los efectos que no puedan obtenerse mediante uno de los tipos de efectos personalizados anteriores suelen poder crearse como elementos AnimationEffect. Sin embargo, si desea crear un nuevo efecto personalizado y no basado en animaciones, puede implementar la interfaz IEffect o emplear uno de nuestros efectos existentes como subclase. Consulte la referencia de API IEffect para obtener más detalles.

    Estados personalizados

    Está previsto que la interfaz StateVisualizer pueda admitir estados personalizados en el futuro. Permanezca atento.