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

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

3. O Game Controller

3.5 Adicionando uma Condição de Vitória

Mas chega de derrotas, não é? Falaremos agora de vitórias! Precisamos, ao chegar no fim do nível adequadamente, vencer! Avançar de fase! E celebrar! Faremos isso agora.

Por sorte, já temos um objeto responsável por representar o fim da fase. É o nosso BoundaryEnd. Adicionaremos, a esse objeto, um script capaz de avisar ao nosso GameController e ao nosso Player quando a condição de vitória for atingida. Nomeie esse script EndBoundaryTrigger. O código dele, similar ao já desenvolvido, pode ser visto na Listagem 8.

x
1
using System.Collections;
2
using System.Collections.Generic;
3
using UnityEngine;
4
5
public class EndBoundaryTrigger : MonoBehaviour {
6
7
    // Use this for initialization
8
    void Start () {
9
        
10
    }
11
    
12
    void OnCollisionStay2D (Collision2D col) {
13
        if (col.gameObject.CompareTag("Player")) {
14
             if (col.gameObject.GetComponent<PlayerController>().isGrounded()) {
15
                col.gameObject.GetComponent<PlayerController>().LevelEnd();
16
            }
17
        }
18
    }
19
}
Listagem 8 - Código do script EndBoundaryTrigger.
Fonte: Elaborada pelo autor.

Perceba que o script tem duas diferenças em relação ao da fronteira inferior. Nesse caso, estamos usando o método OnCollisionStay2D. Esse método é chamado enquanto uma colisão estiver ocorrendo. O motivo disso é que queremos iniciar a animação de vitória apenas quando o personagem estiver no chão, então, detectamos a colisão e só disparamos o evento quando o personagem estiver lá. Isso é testado através do método já utilizado anteriormente, o isGrounded(), do próprio Player.

Mais uma vez, precisamos adicionar ao Player e ao nosso GameController os métodos relacionados ao fim do level. Esses métodos podem ser vistos nas Listagens 9 e 10, respectivamente.

7
1
public void LevelEnd () {
2
        active = false;
3
        rigidBody.bodyType = RigidbodyType2D.Static;
4
        ani.SetBool("active", false);
5
        ani.Play("CelebrationRoll");
6
        FindObjectOfType<GameController>().LevelEnd();
7
    }
Listagem 9 - Método LevelEnd adicionado ao script PlayerController.
Fonte: Elaborada pelo autor.
10
1
public void LevelEnd () {
2
        robotsLeft += 1;
3
        Debug.Log(robotsLeft);
4
        Invoke("NextLevel", 3f);
5
    }
6
7
    private void NextLevel () {
8
        int sceneIndex = SceneManager.GetActiveScene().buildIndex;
9
        SceneManager.LoadScene(sceneIndex+1);
10
    }
Listagem 10 - Métodos de LevelEnd adicionados ao script do GameController.
Fonte: Elaborada pelo autor.

Percebam que o método do PlayerController é bem similar ao já desenvolvido antes, mudando apenas a animação que será invocada do Animation Controller. Já o método do GameController varia um pouco.

No caso do GameController, estamos utilizando uma nova abordagem para avançar a fase. Buscamos a cena ativa, da mesma maneira como fazíamos no outro método, mas agora pegamos o índex dessa cena, e não o seu nome. Em seguida, carregamos a cena com a outra versão do LoadScene, o qual recebe um número como parâmetro, e então passamos o índex da cena ativa acrescido em uma unidade. Ou seja, carregamos a próxima cena de acordo com o Build Settings.

Como só temos em nosso Build Settings a cena principal do jogo, como a cena 0 e a cena de Game Over em seguida, como a cena 1, esse método também nos levará à cena de Game Over. Mas isso pode ser mudado, concorda?

Versão 5.3 - Todos os Direitos reservados