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
Vejamos a Listagem 3.
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 bool active = 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 (active) {
if (grounded) {
doubleJump = true;
}
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() {
if (active) {
float moveH = Input.GetAxis ("Horizontal");
ani.SetFloat("speed", Mathf.Abs(moveH));
grounded = Physics2D.OverlapBox (groundCheck.position, (new Vector2 (1.3f, 0.2f)), 0f, layerMask);
ani.SetBool("grounded", grounded);
ani.SetFloat("vertSpeed", rigidBody.velocity.y);
if (moveH < 0 && movingRight) {
Flip();
} else if (moveH > 0 && !movingRight) {
Flip();
}
rigidBody.velocity = new Vector3 (maxSpeed * moveH, rigidBody.velocity.y, 0);
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);
}
public bool isGrounded () {
return grounded;
}
public void Break () {
active = false;
rigidBody.bodyType = RigidbodyType2D.Static;
ani.SetBool("active", false);
ani.Play("Break");
}
}
Criamos, como visto na Listagem 3, o nosso método Break. A primeira coisa que ele precisa fazer, no entanto, é parar o personagem. Para tanto, precisamos criar uma nova variável booleana active que nos mostra se o personagem está ativo ou não. Caso não esteja, ignoramos todo o controle tido pelos métodos FixedUpdate e Update sobre o personagem, tornando o personagem estático. Fazemos isso com um novo if no início de cada um desses métodos, checando se estão ativos ou não.
E por falar em estático, uma vez que o nosso personagem não está mais sob o controle do jogador e acaba de se quebrar, podemos também alterar o tipo do corpo rígido para Static, a fim de ter a garantia de ele não estar mais em nenhum dos cálculos físicos feitos pelo motor.
Com isso, precisamos, agora, apenas realizar mais duas etapas. A primeira delas é avisar ao nosso Animator Controller que o personagem não está mais ativo, evitando, assim, de ele cair no estado de pulo/queda, já que o personagem não está mais grounded e esse estado parte de Any State. A última etapa é tocar a nova animação criada no início de nossa aula. Com o método Play, do nosso Animator, podemos iniciar a execução de uma animação pelo nome. Passamos, então, ao parâmetro “Break”.
Assim, nosso método de quebra estará funcionando e pronto para ser chamado pelo script de LevelLoss. Vamos testar? Vai lá, dá o play no jogo e veja o que acontece!
Calma, pessoal! Ele não morreu! Está tudo bem com ele! Um colega de mecatrônica encontrou o robô em pedaços, após o ocorrido, e juntou todas as peças novamente. Está tudo bem! Duvida? Pois vamos adiante, para a próxima seção!
Versão 5.3 - Todos os Direitos reservados