viernes, 27 de febrero de 2015

Introducción a Mecanim

Estoy empezando a usar Mecanim como sistema de animación de movimiento. Y hoy voy a contar alguna de sus bondades principales. Aunque habrá que empezar por explicar un poco ¿qué es mecanim?





Hay algo de confusión sobre esto, y muchos hemos pensado que era lo que no era. Mecanim es la respuesta de Unity ante la baja calidad de las animaciones de los juegos hecho con Unity 3. Entonces, ¿se tienen mejores animaciones con Mecanim? No, las animaciones serán las mismas pero se usarán mejor y será más sencillo hacer cosas más complejas. Mecanim no es un sistema para crear animaciones, sino para usarlas. Tendrás que darle las animaciones hechas de forma externa exactamente igual que hasta ahora. La novedad es que para usarlas en lugar de hacer todo por código harás mucho con un editor visual y con muchas más opciones y potencia.




Por poner un ejemplo avanzado de uso, imaginemos una animación de deslizarnos por el suelo para pasar por debajo de obstáculos. Aunque en la animación el personaje se agache, el collider seguirá siendo igual de alto y la física del juego no nos dejará pasar. A la vieja usanza tendríamos que ir chequeando en cada frame por qué parte de la animación nos llegamos, tener una tabla de valores e ir modificando la altura del collider según estos valores. Con Mecanim podemos pedir que nos haga una curva y retocarla, o hacerla nosotros a mano a lo largo de la animación y modificar el valor de un parámetro con esa curva. Así en código solo queda asignar la nueva altura del collider en cada frame. Puede sonar similar, pero una cosa supone bastante código, puede llegar a la hora de trabajo y el resultado será discreto; en el otro solo escribes 1-3 líneas de código, lo tienes en 2 minutos y el resultado será continuo. Si por alguna razón quieres que la animación vaya el doble de lento no tendrás que tocarlo, en el primer caso tendrías que volver a hacer todo.

Maquina de estados finita de Mecanim


A lo mejor este ejemplo era un poco complejo de entrada, vamos con lo básico. Mecanim te permite crear y controlar una máquina de estados finita de forma visual para controlar el comportamiento de tu personaje. Bueno, de sus animaciones, pero casi siempre su comportamiento estará relacionado con una animación ¿no?. ¿Qué puede hacer un personaje? Estar quieto, andar, correr, saltar, atacar, caerse, morir. Todos esos estados están relacionados con animaciones, así que tiene sentido llevarlos con una máquina de estados finita. Y Mecanim permite de forma sencilla crear estados, asociar animaciones, poner las transiciones de un estado a otro y sus condiciones, en base a unos parámetros (que te inventas), y ya solo quedaría rellenar esos parámetros desde tu código, casi siempre en relación a la entrada de usuario (¿está el joystick hacia delante?, ¿ha pulsado el botón de saltar?). También puedes acceder a los estados de la máquina desde el código para hacer tu lógica. Por ejemplo al saltar, la parte de subir la puedes saber a priori, pero no sabes cuanto caerás, no es lo mismo saltar para llegar a un sitio más alto que para despeñarse por algún lado, así que es normal tener las comprobaciones de altura del personaje en código, solo si estás en el estado de caer.



Así se pueden crear fácilmente animaciones y transiciones al estilo Unity3. Aunque puedes controlar mejor las transiciones con curvas, duración de la misma... Este tipo de transiciones suelen ser para decisiones binarias: un botón está pulsado o no, estás cayendo y has llegado al suelo o no... Hasta aquí solo sería más cómodo.



Otra ventaja es que puedes crear capas de animación. Imaginemos que hacemos un juego tipo metal slug, en 3d, o en 2d, da igual. Siempre podemos disparar y diferentes armas, seguramente con animación diferente según qué arma. Y a la vez podemos estar quietos, andando, corriendo, saltando, cayendo... Casi cualquier arma de fuego supondrá solo animaciones de los brazos, pero si lo hacemos de la forma tradicional, la combinación de animaciones es brutal: andando sin disparar, andando disparando pistola, andando disparando escopeta, saltando sin disparar, saltando disparando pistola... Si hacemos la animación por capas podemos combinar esos tipos de animaciones sin tener que realizar todas las animaciones a mano. En una capa tendremos el movimiento neutral del cuerpo (sin disparar) y en otra las animaciones de disparo, aplicadas con una máscara solo a los brazos. Y así tendremos todas las combinaciones de forma sencilla. De hecho ya estoy usando las capas. Las animaciones de andar o correr normales me hacen cosas muy raras en los dedos, así que tengo una capa solo para las manos, con una animación de manos “tipo idle” para sobreescribir las aberraciones de las demás animaciones en los dedos. Y es posible que tenga que hacer otra capa para controlar el brazo de la espada y que el personaje no se saque un ojo al hacer algunos movimientos.



Mecanim blending tree


Y por último por hoy, el blending de animaciones. Una maravilla. Decía antes que las transiciones sirven para eventos binarios, pero los joystick nos dan un continuo de movimiento, incluso hay botones con recorrido. Y no debería ser lo mismo la respuesta si tienes el joystick al 50% que a tope. En tiempos de la PSX había juegos que si dabas un poco al joystick andaban y a partir de cierto punto corrían, era binario igual, pero con joystick. Yo digo controlar completamente la velocidad, que si tengo un 20% de joystick hacia arriba se note la diferencia con un 40% y con un 80%. Y eso se hace con un blending tree en mecanim. Hacemos que una animación compleja funcione como una fusión de otras animaciones. Así para andar hacia delante pondremos dos animaciones, andar y correr y según cuanto muevas el joystick tendrá más peso una animación o la otra. Eso es lo que se ve en el vídeo, lo suave que puede ser pasar de andar a correr.



Y eso que en mi juego el jugador va a encarar inmediatamente la dirección de movimiento, lo cual lo hace más sencillo, no anda hacia atrás ni nada así. En juegos más realistas, además de movimiento hacia delante y hacia atrás, tenemos el andar girando, no hay giro inmediato, esto supone tener 2 niveles de blending tree (y hablando solo de hacia delante). En el primer nivel se hace el blending entre andar y correr, y en el nivel inferior entre delante, delante izquierda y delante derecha. Por ejemplo si tenemos el joystick dado a la mitad adelante y un poco a la derecha: se hará en blending de andar: delante y derecha con más peso de delante, luego el blending de correr: delante y derecha, con más peso de delante, y luego blending del resultado de los dos al 50%, y eso será la animación final. Una animación cocinada con otras 4 en tiempo real. Por eso el movimiento en los juegos realistas actuales ha mejorado tanto.

1 comentario :