O que é um jogo de ação sem a emoção do perigo? Ou um RPG sem a satisfação de derrotar um inimigo formidável? No coração de quase todos esses jogos, existe um sistema fundamental: o de vida e dano.
Construir essa mecânica pode parecer complexo no início, mas a lógica por trás dela é bastante direta.
Neste guia, vamos construir um sistema de vida e dano do zero. O resultado será um componente flexível que você poderá anexar a jogadores, inimigos e até a objetos destrutíveis no seu cenário. Vamos focar na criação de um script limpo e que pode ser facilmente expandido no futuro.
1. A Base: O Componente de Saúde (Saude.cs
)
O primeiro passo é criar um script que será o único responsável por gerenciar a saúde de um objeto. Essa abordagem de separar responsabilidades é uma ótima prática de programação.
- Na sua pasta de Scripts, crie um novo script C# chamado
Saude
. - Abra o script e adicione as seguintes variáveis:
using UnityEngine;
public class Saude : MonoBehaviour {
public float vidaMaxima = 100f;
private float vidaAtual;
void Awake() {
// Ao iniciar, a vida atual é igual à vida máxima.
vidaAtual = vidaMaxima;
}
}
O método Awake()
é chamado assim que o objeto é carregado, antes mesmo do Start()
. É o lugar perfeito para inicializar o estado do nosso componente, garantindo que todo objeto comece com a vida cheia.
2. Recebendo Dano: A Função LevarDano()
Agora, precisamos de uma forma de fazer este objeto perder vida. Para isso, criaremos uma função pública, que poderá ser chamada por outros scripts (como um projétil ou a espada de um inimigo).
Adicione o seguinte método dentro da sua classe Saude
:
public void LevarDano(float quantidadeDano) {
// Subtrai o dano da vida atual.
vidaAtual -= quantidadeDano;
// Garante que a vida não fique negativa.
if (vidaAtual < 0) {
vidaAtual = 0;
}
// Se a vida chegar a zero, chama a função de morte.
if (vidaAtual == 0) {
Morrer();
}
}
Esta função é o ponto de entrada para todo o dano que o objeto receber. Ela subtrai a quantidade de dano recebida e, crucialmente, verifica se a vida chegou a zero para acionar a consequência.
3. A Consequência: A Função Morrer()
O que acontece quando a vida de um objeto acaba? A “morte” pode significar coisas diferentes para objetos diferentes. Para um inimigo, pode ser uma explosão e a destruição do seu GameObject. Para o jogador, pode ser o acionamento de uma tela de “Game Over”.
Vamos criar uma função simples para lidar com isso. Adicione este método privado ao script Saude
:
private void Morrer() {
// Ação a ser executada quando a vida chega a zero.
Debug.Log("O objeto morreu!");
// Destrói o GameObject ao qual este script está anexado.
Destroy(gameObject);
}
Esta é a implementação mais básica. Sinta-se à vontade para customizá-la: você pode adicionar aqui sua lógica para tocar uma animação de morte, instanciar um efeito de partículas, dar pontos ao jogador, etc.
4. Aplicando o Dano: Um Exemplo Prático
Agora que nosso componente Saude
está pronto, como o usamos? Vamos criar um exemplo simples: um projétil que causa dano ao colidir com algo.
- Crie um novo script chamado
Projetil
. - Adicione o seguinte código a ele:
using UnityEngine;
public class Projetil : MonoBehaviour {
public float dano = 25f;
// Para jogos 2D, use OnCollisionEnter2D
void OnCollisionEnter(Collision colisao) {
// Tenta obter o componente 'Saude' do objeto com o qual colidiu.
Saude saudeDoAlvo = colisao.gameObject.GetComponent<Saude>();
// Verifica se o objeto com o qual colidimos tem, de fato, um script 'Saude'.
if (saudeDoAlvo != null) {
// Se tiver, chama a função pública para causar dano.
saudeDoAlvo.LevarDano(dano);
}
// Destrói o projétil após a colisão.
Destroy(gameObject);
}
}
Agora, basta anexar o script Projetil
a um Prefab de projétil, e o script Saude
a qualquer objeto que possa receber dano (jogador, inimigos, caixas destrutíveis). O sistema funcionará automaticamente.
Extras e Próximos Passos
Com a base pronta, você pode expandir o sistema facilmente:
- Cura: Crie uma função
public void Curar(float quantidadeCura)
no scriptSaude
que aumenta avidaAtual
, garantindo que ela não ultrapasse avidaMaxima
. - Feedback Visual: Crie uma barra de vida na UI que reflita a porcentagem de vida atual (
vidaAtual / vidaMaxima
). Você também pode fazer o personagem piscar em vermelho por um instante ao levar dano. - Invencibilidade Temporária: Após levar dano, ative um estado de “invencível” por um ou dois segundos para evitar que o jogador morra instantaneamente ao ser cercado.
Conclusão
Com estes dois scripts, Saude.cs
e Projetil.cs
, você tem um sistema de vida e dano funcional, modular e reutilizável.
O conceito mais importante aqui é a separação de responsabilidades: o script Saude
só se preocupa com a vida do objeto e suas consequências, enquanto outros scripts são responsáveis por acionar a função de dano. Essa organização torna seu projeto mais limpo, fácil de depurar e de expandir.
Implementar sistemas como este é um passo crucial na sua jornada de dev. Se você curtiu este guia prático, vai gostar ainda mais dos projetos que desenvolvemos em nosso canal no YouTube, a PERAI DEV. Inscreva-se e continue aprendendo com a gente!