Contexto


Las animaciones son las que dan vida a los videojuegos, lo hacen parecer un mundo real, lleno de movimiento y personalidad.

En el tema pasado, aprendiste a crear animaciones con Unity, pero estas animaciones solo pueden ser visualizadas dentro del editor de Unity; para que aparezcan en tu juego como resultado de las acciones del jugador, debes asignarlas a diferentes eventos utilizando scripts.

En este tema aprenderás a programar el uso de las animaciones a través de scripts para que correspondan a tu gameplay y así, tu personaje se mueva de manera natural sobre el escenario.

Explicación


13.1 Generar parámetros y transiciones de animación

Unity es un programa que permite manejar la animación de los elementos con un motor de gestión de la animación. La base para la gestión de la animación es un componente llamado Animator, que agregas a tus GameObjects y permite añadir diversas animaciones que luego puedes controlar con un script.

Para comenzar, vas a agregar dos parámetros en tu Animator que utilizarás para programar las transiciones entre tus animaciones. Una de ellas se llamará velocidad y será del tipo Float, que puedes usar para cambiar de correr a reposos al superar cierta velocidad y un Bool que te servirá para detectar si tu personaje está brincando y activar su animación.


Estas pantallas se obtuvieron directamente del software que se está explicando en la computadora, para fines educativos.

 

Luego creas transiciones entre cada uno de tus estados de animación, haciendo clic derecho en un estado de animación, seleccionando la opción Make Transition y luego seleccionando otro estado de animación. Debes tener transiciones entre cada estado de animación y de regreso.


Estas pantallas se obtuvieron directamente del software que se está explicando en la computadora, para fines educativos.

 

Ahora agrega parámetros a cada una de tus transiciones para que los estados de animación cambien según tus parámetros. Por ejemplo, tu animación debe cambiar de reposo a correr cada vez que la velocidad que programes en tu script suba a más de 0.05 y regresa a la animación de reposo (idle) cuando esta velocidad vuelva a bajar.


Estas pantallas se obtuvieron directamente del software que se está explicando en la computadora, para fines educativos.

 

Igualmente debe cambiar a la animación de salto si el parámetro de salto que es cierto (true) y regresa a correr o reposo si esta condición no es cierta. En total debes tener seis transiciones, cada una con su parámetro.

 

13.2 Generar física y controles de animación sidescroll

Ya que tienes un personaje con sus animaciones y su control de animación, vas a continuar con la programación; ésta la usarás para mover a tu personaje utilizando las teclas del teclado y asegúrate de que todas las animaciones corran en el momento indicado.

Con el personaje en su lugar, agrega un nuevo GameObject con Box Colliders 2D y RigidBody2D al área que quieres convertir en el suelo para que tu personaje tenga límites de qué tan abajo puede caer. También añade GameObjects con Colliders y RigidBody2D a los costados para que tu personaje no pueda salirse del escenario delimitado por el juego. Es posible desactivar el componente de render de tus colisionadores laterales para que estos sean invisibles.

Colliders que delimitan el movimiento de nuestro personaje.

Estas pantallas se obtuvieron directamente del software que se está explicando en la computadora, para fines educativos.

 

Toma el GameObject principal de tu prefab (calavera) y añade un componente de RigidBody para que éste pueda utilizar la física para moverse y colisionar con los objetos. También añade un Capsulle Collider 2D para generar la física de las colisiones de su cuerpo y así tener interacción con el resto de los elementos. Le puedes agregar a su Collider un material de física 2D para agregarle fricción o rebote si así lo quieres.

Ingresa a las opciones de Constraints del RigidBody y selecciona la casilla de la “z” en Freeze Rotation, esto para que tu personaje siempre se mantenga con la cabeza hacia arriba y no gire su cuerpo en ninguna dirección con el uso de la física.

Añade algunas capas que te servirán para organizar los elementos y aplicarles scripts. Crea uno de jugador, en el que añadas, en este caso, a la calavera y todos sus hijos en la jerarquía y otro de suelo, que le agregarás a todos los elementos sobre los que tu jugador puede pisar. Posteriormente se utilizará en el scrpit para detectar colisiones y cambiar las animaciones.

La cámara se convierte en un hijo del jugador en la jerarquía para que ésta siempre este centrada en el jugador y puedas cambiar la propiedad de tamaño (Size) para que la cámara esté más cerca o más lejos de tu personaje.

Crea un nuevo script llamado ControlesSimples y colócalo en el folder de scripts. Inicia el script creando las variables que utilizarás.

[HideInInspector] public bool mirandoDerecha = true;
[HideInInspector] public bool salto = false;

public float fuerzaMovimiento = 365f; public float maxVelocidad = 5f; public float fuerzaSalto = 1350f; public Transform controlSuelo;

private bool enSuelo = false; private Animator anim;
private Rigidbody2D rb2d;

Las primeras dos variables serán públicas, pero no necesitas cambiar sus valores en el inspector, por lo que escribe [HideInInspector] para que no aparezcan visibles en Unity. Estas variables sirven para que el script sepa que el personaje por default está mirando a la derecha y no está saltando, pero haz uso de algunas funciones más adelante para cambiar de False a True y viceversa, dependiendo de las acciones que esté tomando el jugador.

El siguiente paso son otras variables públicas con las que defines la velocidad a la que tu personaje salta y se mueve. Cuentas con una variable llamada controlSuelo que usarás para ver si tu personaje está tocando el suelo.

Finalmente, cuentas con tres variables privadas. Utiliza Anim y rb2d para guardar una referencia a tus componentes de Animator y Rigidbody2D. Y la variable enSuelo, en la que guardes un booleano que te dirá si es cierto o falso que el personaje está tocando el suelo.

  void Awake()
    {
        anim = GetComponentInChildren();
        rb2d = GetComponent(); 
    }

  void Update()
    {
        enSuelo = Physics2D.Linecast(transform.position, controlSuelo.position, 1 << LayerMask.NameToLayer("Suelo"));
        if (Input.GetButtonDown("Jump") && enSuelo)
        {
            salto = true;
        }
    }

Utiliza la función de Awake para inicializar los componentes en las variables que creaste de anim y rb2d; en el primero utiliza GetComponentInChildren pues el componente de Animator no lo tiene el GameObject Calavera, sino que lo tiene uno de sus hijos, CalaveraRig.

Luego utiliza la función Update para crear un Linecast, que genera una línea desde tu personaje para revisar la posición para saber si está en el suelo, utilizando los elementos con el nombre de capa “Suelo” que creaste anteriormente para medir la distancia entre estos y tu personaje. Guarda esta información en la variable enSuelo que generaste anteriormente y si esta variable es cierta y se presiona el botón de salto, entonces la variable de salto será cierta.

void Flip()
{
mirandoDerecha= !mirandoDerecha;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}

Crearemos una función llamada Flip que utilizaremos para invertir la dirección de nuestro personaje cuando éste cambie de dirección.

	 void FixedUpdate()
{
float h = Input.GetAxis("Horizontal");
anim.SetFloat("Velocidad", Mathf.Abs(h));
if (h * rb2d.velocity.x < maxVelocidad)
rb2d.AddForce(Vector2.right * h * fuerzaMovimiento);
if (Mathf.Abs(rb2d.velocity.x) > maxVelocidad)
rb2d.velocity = new Vector2(Mathf.Sign(rb2d.velocity.x) * maxVelocidad, rb2d.velocity.y);
if (h > 0 && !mirandoDerecha)
Flip();
else if (h < 0 && mirandoDerecha)
Flip();
if (!enSuelo){ anim.SetTrigger("Salto"); }
if (enSuelo){ anim.ResetTrigger("Salto"); }
if (salto)
{
rb2d.AddForce(new Vector2(0f, fuerzaSalto));
salto = false;
}
}

Aplica la función de FixedUpdate para agregar la mayor parte de la programación del movimiento. Comienza por crear una variable “h” que contendrá el movimiento del eje horizontal. Luego conecta esta variable al parámetro de velocidad que estableciste en el Animator.

Utiliza Mathf.Abs para que este número siempre sea positivo y que esté relacionado con la velocidad de tu eje horizontal.

if (h * rb2d.velocity.x < maxVelocidad)
rb2d.AddForce(Vector2.right * h * fuerzaMovimiento);
if (Mathf.Abs(rb2d.velocity.x) > maxVelocidad)
rb2d.velocity = new Vector2(Mathf.Sign(rb2d.velocity.x) * maxVelocidad, rb2d.velocity.y);

Emplea este código para agregar la velocidad que capturaste en fuerzaMovimiento cuando presiones la tecla de movimiento, pero limitar la velocidad de tu personaje a lo que escribas en tu variable maxVelocidad para que ésta no aumente indefinidamente.

Cuentas con códigos condicionales que cuando la dirección horizontal sea negativa, voltea tu personaje hacia la izquierda y si es positiva se voltee a la izquierda. También tienes unos que agregan la animación de salto si tu personaje está en el aire, cuando la variable enSuelo sea falsa o quite la animación si tu personaje toca el suelo.

Finalmente, tienes un código que indica lo siguiente, si la función de salto es llamada se le agregará una fuerza vertical a tu personaje, también volverá falsa a la variable de salto para que sea imposible saltar de nuevo en el aire.

Cierre


La animación por sí sola no genera el funcionamiento total de un personaje para un videojuego, recuerda que estas animaciones necesitan indicaciones para que el usuario pueda interactuar con el personaje.

Aprendiste a programar parámetros para que tu script contenga la funcionalidad de tu animación. Es importante tener en cuenta que Unity cuenta con funciones para inicializar los componentes de tus variables.

Checkpoint


Asegúrate de poder:

  • Comprender la importancia del funcionamiento de scripts de animación.
  • Aplicar scripts para hacer las animaciones funcionales en el juego.

Referencias