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.

 Agora vamos atualizar o método Start(), adicionando uma lógica para atualizar os valores da vida e da energia do personagem quando inciamos a cena. Observe que no início da cena, atribuímos “false” à variável gameOver.
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);
}
No método RestartLevel(), setamos gameOver = false e playerController.enabled = true (segue abaixo).
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).

GameOver_Particles
Figura 1 – Partículas com efeito de Game Over

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.

Particles
Figura 2 – Partículas inseridas no gameOverEffect

Veja abaixo o resultado final desse post.

Downloads