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

¡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.

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.

¿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.

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.

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.

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.

