No script LifeController.cs, vamos fazer algumas inclusões de código para a lógica do Game Over (baixar na sessão downloads). Vamos começar declarando algumas variáveis (ver abaixo).
private float startLifePoints = 3; public Text messageText; private bool gameOver; private PlayerController playerController; public GameObject particlesGameOver;
A variável startLifePoints armazena o valor das vidas que o personagem terá quando iniciarmos o jogo. O messageText exibirá na tela o texto “Game Over” quando nosso personagem morrer. A variável booleana gameOver guarda o estado “true” quando as vidas chegam a zero, e “false” quando as vidas são maiores que zero, nos dando uma informação importante para controlarmos nossa cena.
O playerController nós usaremos para desativar os movimentos do personagem após ele morrer (nesse caso, enquanto o jogo não reinicia, os controles ficam inativos e o boneco desaparece da tela). Na variável particlesGameOver nós setaremos um “prefab” de partículas, que simula a morte do personagem (estilo explosão), após a vida chegar em zero e termos o Game Over.
void Start(){ ..... if (SceneManager.GetActiveScene().buildIndex == 0){ //Application.loadedLevel == 0 health = startHealth; lifePoints = startLifePoints; }else{ health = PlayerPrefs.GetFloat("Health"); lifePoints = PlayerPrefs.GetInt("LifePoints"); } messageText.text = " "; gameOver = false; playerController = GetComponent<PlayerController>(); }
Vamos fazer algumas alterções no método ApplyDamage para que a lógica de Game Over funcione corretamente.
void ApplyDamage(float damage){ if (isDamageable){ ..... if (health <= 0) { lifePoints--; if (!gameOver) { if (lifePoints > 0) { RestartLevel (); }else{ isGameOver (); } } } ..... } }
Vamos agora criar o método isGameOver(), que é chamado quando lifePoints <= 0. Nesse método setamos gameOver = true, desabilitamos o playerController, mostramos o texto “Game Over” na tela e instanciamos a partícula com efeito de Game Over. Finalmente, reiniciamos o jogo após 5 segundos (tempo necessário para exibirmos o efeito de explosão).
void isGameOver(){ gameOver = true; gameObject.GetComponent<Rigidbody2D>().velocity = Vector3.zero; messageText.text = "Game Over"; playerController.enabled = false; isDamageable = false; //Effect Game Over Instantiate (particlesGameOver, gameObject.transform.position, Quaternion.identity); gameObject.SetActive(false); Invoke ("RestartScene", 5.0f); } void RestartScene(){ SceneManager.LoadScene (0); }
void RestartLevel(){ ...... gameOver = false; playerController.enabled = true; }
Criando as partículas com efeito de Game-Over (Explosão).
Nessa tarefa, vamos criar um GameObject chamado gameOverEffect e adicionaremos um componente Audio Source a ele (nesse componente setaremos um audio com som de game-over). Também adicionaremos como objetos-filho dois efeitos de partículas (ver figura 1). Obs: O audio de Game Over será armazenado no diretório Sounds, e você poderá baixar a sessão de downloads (no final desse post).
As partículas inseridas no ‘gameObjectEffect’ precisam ser configuradas para termos o efeito esperado. Veja na Figura 2 como deve ser configurada cada uma das partículas, sendo que a imagem utilizada no material das partículas pode ser baixada na sessão de downloads.
Veja abaixo o resultado final desse post.