Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Jogos Digitais / Desenvolvimento com Motores de Jogos I / Aula
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.
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.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
private bool jumping = false;
private bool grounded = false;
private bool doubleJump = false;
private bool doubleJumping = false;
private bool movingRight = true;
private Rigidbody2D rigidBody;
private Animator ani;
public Transform groundCheck;
public LayerMask layerMask;
public float acceleration = 100f;
public float maxSpeed = 10f;
public float jumpSpeed = 500f;
// Use this for initialization
void Awake () {
rigidBody = GetComponent<Rigidbody2D> ();
ani = GetComponent<Animator>();
}
// Update is called once per frame
void Update() {
if (Input.GetButtonDown("Jump")) {
if (grounded) {
jumping = true;
doubleJump = true;
} else if (doubleJump) {
doubleJumping = true;
doubleJump = false;
}
}
}
//Called in fixed time intervals, frame rate independent
void FixedUpdate() {
float moveH = Input.GetAxis ("Horizontal");
ani.SetFloat("speed", Mathf.Abs(moveH));
grounded = Physics2D.Linecast(transform.position, groundCheck.position, layerMask);
ani.SetBool("grounded", grounded);
ani.SetFloat("vertSpeed", rigidBody.velocity.y);
if (moveH < 0 && movingRight) {
Flip();
} else if (moveH > 0 && !movingRight) {
Flip();
}
if (rigidBody.velocity.x * moveH < maxSpeed) {
rigidBody.AddForce (Vector2.right * moveH * acceleration);
}
if (Mathf.Abs (rigidBody.velocity.x) > maxSpeed) {
Vector2 vel = new Vector2 (Mathf.Sign (rigidBody.velocity.x) * maxSpeed, rigidBody.velocity.y);
rigidBody.velocity = vel;
}
if (jumping) {
rigidBody.AddForce(new Vector2(0f, jumpSpeed));
jumping = false;
}
if (doubleJumping) {
rigidBody.velocity = new Vector2 (rigidBody.velocity.x, 0);
rigidBody.AddForce(new Vector2(0f, jumpSpeed));
doubleJumping = false;
}
}
void Flip() {
movingRight = !movingRight;
transform.localScale = new Vector3((transform.localScale.x * -1), transform.localScale.y, transform.localScale.z);
}
}
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