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
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.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EndBoundaryTrigger : MonoBehaviour {
// Use this for initialization
void Start () {
}
void OnCollisionStay2D (Collision2D col) {
if (col.gameObject.CompareTag("Player")) {
if (col.gameObject.GetComponent<PlayerController>().isGrounded()) {
col.gameObject.GetComponent<PlayerController>().LevelEnd();
}
}
}
}
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.
public void LevelEnd () {
active = false;
rigidBody.bodyType = RigidbodyType2D.Static;
ani.SetBool("active", false);
ani.Play("CelebrationRoll");
FindObjectOfType<GameController>().LevelEnd();
}
public void LevelEnd () {
robotsLeft += 1;
Debug.Log(robotsLeft);
Invoke("NextLevel", 3f);
}
private void NextLevel () {
int sceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(sceneIndex+1);
}
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