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

arrow_back Aula 11 - O Game Controller e a Transição Entre Cenas

2. Modificando o Jogo Para Quebrar o Personagem

2.3 Modificando o Script PlayerController para Adicionar um Método de Quebra

Vejamos a Listagem 3.

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
    private bool active = true;
13
14
    private Rigidbody2D rigidBody;
15
    private Animator ani;
16
    public Transform groundCheck;
17
    public LayerMask layerMask;
18
    
19
    public float acceleration = 100f;
20
    public float maxSpeed = 10f;
21
    public float jumpSpeed = 500f;
22
23
    // Use this for initialization
24
    void Awake () {
25
        rigidBody = GetComponent<Rigidbody2D> ();
26
        ani = GetComponent<Animator>();
27
    }
28
29
    // Update is called once per frame
30
    void Update() {
31
        if (active) {
32
            if (grounded) {
33
                doubleJump = true;
34
            }
35
36
            if (Input.GetButtonDown("Jump")) {
37
                if (grounded) {
38
                    jumping = true;
39
                    doubleJump = true;
40
                } else if (doubleJump) {
41
                    doubleJumping = true;
42
                    doubleJump = false;
43
                }
44
            }
45
        }
46
    }
47
48
    //Called in fixed time intervals, frame rate independent
49
    void FixedUpdate() {
50
        if (active) {
51
            float moveH = Input.GetAxis ("Horizontal");
52
53
            ani.SetFloat("speed", Mathf.Abs(moveH));
54
55
            grounded = Physics2D.OverlapBox (groundCheck.position, (new Vector2 (1.3f, 0.2f)), 0f, layerMask);
56
57
            ani.SetBool("grounded", grounded);
58
            ani.SetFloat("vertSpeed", rigidBody.velocity.y);
59
60
            if (moveH < 0 && movingRight) {
61
                Flip();
62
            } else if (moveH > 0 && !movingRight) {
63
                Flip();
64
            }
65
66
            rigidBody.velocity = new Vector3 (maxSpeed * moveH, rigidBody.velocity.y, 0);
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
85
    public bool isGrounded () {
86
        return grounded;
87
    }
88
89
    public void Break () {
90
        active = false;
91
        rigidBody.bodyType = RigidbodyType2D.Static;
92
        ani.SetBool("active", false);
93
        ani.Play("Break");
94
    }
95
}
Listagem 3 - Modificações (em negrito) feitas no PlayerController.cs para adicionar o comportamento de quebra ao personagem do jogo.
Fonte: Elaborada pelo autor.

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!

Figura 07 - Personagem quebrando ao tocar no fim do cenário.
Personagem quebrando ao tocar no fim do cenário.
Fonte: Captura de tela do Unity. Disponível em: https://unity3d.com/pt/ Acesso em: 14 de mar. de 2017.

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