Cursos / Jogos Digitais / Desenvolvimento com Motores de Jogos I / Aula

arrow_back Aula 08 - Animação de Sprites – Parte II

3. Utilizando Blend Trees

3.1 Preparando o Animator Controller

A fim de criarmos a animação do nosso personagem para o pulo e a queda através da Blend Tree, utilizaremos os mesmos princípios iniciais já realizados anteriormente. Precisaremos de parâmetros em nossa animação que serão responsáveis por controlar o momento do pulo, assim como precisaremos alterar o nosso script para esses parâmetros serem atualizados pelo código, a cada novo frame.

Começaremos, então, pelos nossos parâmetros! Dentro da aba Animator, com o nosso Animator Controller selecionado, adicionaremos dois novos parâmetros ao nosso controlador: o booleano grounded e o float vertSpeed. Faremos isso da mesma maneira como fizemos anteriormente. O resultado final pode ser visto na Figura 8.

Figura 08 - Novos parâmetros adicionados ao Animator Controller.
Novos parâmetros adicionados ao Animator Controller.
Fonte: Captura de tela do Unity. Disponível em: https://unity3d.com/pt/. Acesso em: 24 de fev de 2017.

O parâmetro grounded será o responsável por dizer à animação se estamos ou não no chão. Esse parâmetro será obtido a partir da variável grounded, a qual temos em nosso código e serve justamente para isso. Assim, poderemos saber quando iniciar a animação de pulo. O parâmetro grounded será a base do nosso controlador para saber quando trocar de animação!

O segundo parâmetro, o vertSpeed, indicará a velocidade que estamos no ar. Isso será importante para a posição do nosso personagem poder se adequar em relação à velocidade que ele está. Através desse parâmetro, é possível saber se estamos iniciando o pulo, chegando ao ponto mais alto, começando a descer ou, até mesmo, já chegando no chão. Esse parâmetro será a base da nossa Blend Tree para saber quando trocar de animação internamente!

Agora que já criamos os parâmetros, qual o próximo passo? A resposta já foi dada anteriormente!

Acertou quem pensou em definir os valores a partir de nosso código! Agora que já temos os parâmetros da animação, devemos alterar o nosso código principal a fim de esses parâmetros serem atualizados de acordo com as variáveis que lhe dizem respeito! Utilizaremos os mesmos métodos de setBool e setFloat no nosso Animator. As alterações podem ser vistas em destaque, na Listagem 2.

x
1
using System.Collections;
2
using System.Collections.Generic;
3
using UnityEngine;
4
5
public class PlayerController : MonoBehaviour {
6
7
    private bool jumping = false;
8
    private bool grounded = false;
9
    private bool doubleJump = false;
10
    private bool doubleJumping = false;
11
    private bool movingRight = true;
12
13
    private Rigidbody2D rigidBody;
14
    private Animator ani;
15
    public Transform groundCheck;
16
    public LayerMask layerMask;
17
    
18
    public float acceleration = 100f;
19
    public float maxSpeed = 10f;
20
    public float jumpSpeed = 500f;
21
22
    // Use this for initialization
23
    void Awake () {
24
        rigidBody = GetComponent<Rigidbody2D> ();
25
        ani = GetComponent<Animator>();
26
    }
27
28
    // Update is called once per frame
29
    void Update() {
30
        
31
        if (Input.GetButtonDown("Jump")) {
32
            if (grounded) {
33
                jumping = true;
34
                doubleJump = true;
35
            } else if (doubleJump) {
36
                doubleJumping = true;
37
                doubleJump = false;
38
            }
39
        }
40
41
    }
42
43
    //Called in fixed time intervals, frame rate independent
44
    void FixedUpdate() {
45
        float moveH = Input.GetAxis ("Horizontal");
46
47
        ani.SetFloat("speed", Mathf.Abs(moveH));
48
49
        grounded = Physics2D.Linecast(transform.position, groundCheck.position, layerMask);
50
        ani.SetBool("grounded", grounded);
51
        ani.SetFloat("vertSpeed", rigidBody.velocity.y);
52
53
        if (moveH < 0 && movingRight) {
54
            Flip();
55
        } else if (moveH > 0 && !movingRight) {
56
            Flip();
57
        }
58
59
        if (rigidBody.velocity.x * moveH < maxSpeed) {
60
            rigidBody.AddForce (Vector2.right * moveH * acceleration);
61
        }
62
63
        if (Mathf.Abs (rigidBody.velocity.x) > maxSpeed) {
64
            Vector2 vel = new Vector2 (Mathf.Sign (rigidBody.velocity.x) * maxSpeed, rigidBody.velocity.y);
65
            rigidBody.velocity = vel;
66
        }
67
68
        if (jumping) {
69
            rigidBody.AddForce(new Vector2(0f, jumpSpeed));
70
            jumping = false;
71
        }
72
        if (doubleJumping) {
73
            rigidBody.velocity = new Vector2 (rigidBody.velocity.x, 0);
74
            rigidBody.AddForce(new Vector2(0f, jumpSpeed));
75
            doubleJumping = false;
76
        }
77
            
78
    }
79
80
    void Flip() {
81
        movingRight = !movingRight;
82
        transform.localScale = new Vector3((transform.localScale.x * -1), transform.localScale.y, transform.localScale.z);
83
    }
84
}
Listagem 2 - Atualização de parâmetros de animação.

Aproveitamos, ainda, para alterar um pouco o nosso código, movendo o teste de grounded, que anteriormente estava no método Update, para o método FixedUpdate. Fizemos isso por duas razões: o teste de grounded utiliza o motor de física, o qual sempre é atualizado de acordo com o FixedUpdate, e as animações também se baseiam no FixedUpdate, de acordo com o que foi previamente definido, para serem atualizadas. Além disso, configuramos a alteração dos dois parâmetros necessários.

Perceba agora que, ao apertarmos espaço, o valor de grounded que se inicia em true se altera para false, enquanto o vertSpeed parte de uma velocidade por volta de 8, até chegar a 0 e retornar ao chão com -8. Com isso, estamos prontos para montar a nossa Blend Tree e configurá-la para se alterar de acordo com o valor de velocidade vertical!

Vamos adiante!

Versão 5.3 - Todos os Direitos reservados