¿Qué estás buscando?
Engine & platform

'Espera, he cambiado de opinión': interrupciones de transición de la máquina de estados

CATHERINE PROULX Anonymous
Jul 13, 2016|5 minutos
'Espera, he cambiado de opinión': interrupciones de transición de la máquina de estados
Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.
Recientemente investigué un error complicado informado por un usuario que involucra la combinación de estados vacíos, capas de anulación e interrupciones de transición. Mientras investigaba, descubrí que nuestra documentación sobre las interrupciones de transición en el sistema de animación era un poco… minimalista. Después de una larga conversación con mi equipo, concluimos que era necesario publicar una publicación en el blog.

¡Así que profundicemos en algunos detalles intrincados de las transiciones e interrupciones de la máquina de estados!

Por defecto en el sistema de animación, las transiciones no se pueden interrumpir: una vez que empiezas a pasar de un estado a otro, no hay salida. Como un pasajero en un vuelo transatlántico, estás cómodamente acomodado en tu asiento hasta que llegas a tu destino y no puedes cambiar de opinión. Para la mayoría de los usuarios, esto está bien.

Pero si necesita más control sobre las transiciones, Mecanim se puede configurar de diferentes maneras para satisfacer sus necesidades. Si no está satisfecho con su destino actual, puede sentarse en el asiento del piloto y cambiar los planes a mitad de su vuelo. Esto significa animaciones más responsivas, pero también muchas oportunidades de perderse en la complejidad.

Veamos algunos ejemplos para aclararlo. Podemos comenzar con una máquina de estados bastante simple con cuatro estados, etiquetados de A a D, y disparadores conectados a cada transición en la máquina de estados.

image05

De forma predeterminada, cuando activamos la transición A->B, nuestra máquina de estados realiza la transición hacia B y nada puede impedir que alcance su destino. Pero si vamos al inspector de transición A->B y cambiamos la fuente de interrupción de “Ninguna” a “Estado actual”, nuestro viaje de A a B puede verse interrumpido por algunos desencadenantes en el estado A.

image01

¿Por qué sólo “algunos”? Porque la casilla de verificación “Interrupción ordenada” también está marcada de forma predeterminada. Esto significa que solo se permiten las transiciones en el estado A que tengan una prioridad mayor que la actual. Observando al inspector del estado A, podemos ver que esto sólo se aplica a la transición de A a C.

image02

Entonces, si activamos el disparador A->B, poco después del disparador A->D, nuestra transición permanece ininterrumpida. Sin embargo, si presionamos el disparador A->C, entonces la transición se interrumpe inmediatamente y la máquina de estados comienza a realizar la transición hacia C.





Internamente, el sistema de animación registra la pose en el momento de la interrupción y ahora realizará una combinación entre esa pose estática (X) y la nueva animación de destino. ¿Por qué una pose estática, en lugar de una combinación posiblemente más suave entre las transiciones actuales y las nuevas? En pocas palabras: rendimiento. Cuando un juego se enfrenta a una cascada de interrupciones, realizar un seguimiento de varias transiciones dinámicas que tienen lugar simultáneamente haría que el sistema de animación se volviera rápidamente inescalable.

Ahora, si desmarcamos la casilla de verificación “Interrupción ordenada”, tanto A->C como A->D pueden interrumpir la transición. Sin embargo, si ambos se activan en el mismo cuadro, A->C seguirá teniendo prioridad porque tiene una mayor prioridad.

Si cambiamos la fuente de interrupción a “Siguiente Estado”, A->C y A->D ya no podrán interrumpir la transición, independientemente de su orden. Sin embargo, si presionamos el gatillo B->D, inmediatamente comenzaremos la transición de A a D, sin completar la transición hacia B.

El orden de transición también importa en el estado B. La casilla de verificación “Interrupción ordenada” ya no está disponible (cualquier transición activada en B puede interrumpir la transición porque no tiene una clasificación de prioridad relativa a A->B), pero el orden de las transiciones en B determinará qué transición gana si ambas se activan dentro del mismo cuadro. En este caso, si B->D y B->C se activan en el mismo cuadro, se seleccionará B->D.

image03

Finalmente, para un control completo, podemos establecer la Fuente de interrupción en “Estado actual y luego siguiente estado” o “Siguiente estado y luego estado actual”. En ese caso, las transiciones se analizarán independientemente en un estado y luego en el otro.

Entonces, supongamos que tenemos la siguiente configuración.

image00

Durante la transición de A a B, un jugador muy emocionado desencadena cuatro transiciones dentro del mismo cuadro: A->C, A->D, B->C y B->D. ¿Lo que sucede?

Primero, se marca “Interrupción ordenada”, por lo que podemos ignorar A->D de inmediato: tiene menor prioridad que A->B. El estado actual se resuelve primero, por lo que ni siquiera tenemos que mirar el estado B para saber que la transición A->C gana.

image02
image03