Tutorial de como usar OnTriggerEnter2D e Tags para aplicar dano na Unity 2D.

Como Fazer Seu Personagem Levar Dano de um Inimigo (Sem Quebrar a Física)

💥 Colisão Sem Trauma: Detectando Perigo e Aplicando Dano Simples na Unity

Introdução

Você está no ponto onde o seu protótipo parece vivo. Mas, para haver jogabilidade, tem que haver risco.

Você já tentou fazer dois objetos se tocarem e disparar um evento? Se você usou o OnCollisionEnter2D e teve problemas, ou pior, tentou fazer a lógica de dano dentro de um Update() gigantesco, a gente sabe como é. É frustrante ver a colisão falhar ou o jogo travar.

O segredo aqui é o processo. Vamos usar a função da Unity feita para isso: o Trigger. Ele permite que objetos se cruzem sem colidirem rigidamente, disparando apenas um evento de código. É o MVP das interações.

Este post é o seu atalho para transformar um sprite em uma ameaça funcional.

Passo 1: Configurando o Objeto de Perigo

Seu objeto de perigo (um espinho, um projétil, lava) precisa de três coisas para funcionar como um sensor de dano:

  1. Collider 2D: Sem ele, não há colisão. Use um Box Collider 2D ou Circle Collider 2D, dependendo do formato.
  2. Rigidbody 2D: Mesmo que ele não vá se mover, a Unity exige que pelo menos um dos objetos envolvidos na colisão (o inimigo ou o jogador) tenha um Rigidbody 2D. É uma regra da Engine.
    • Configuração Prática: No Rigidbody 2D do objeto de perigo, defina Body Type como Kinematic e Gravity Scale como 0. Isso garante que ele não seja afetado pela gravidade e nem seja movido por colisões.
  3. Is Trigger: Este é o ponto crucial. Marque a caixa Is Trigger no componente Collider 2D do seu objeto de perigo. Isso permite que o objeto atravesse o jogador, mas dispare a lógica de código.

Passo 2: O Script de Dano

Crie um novo script C# (ex: DamagePlayer) e anexe-o ao seu objeto de perigo.

Ele será o responsável por chamar a função de dano no script do jogador (PlayerHealth, que criamos no post anterior).

using UnityEngine;

public class DamagePlayer : MonoBehaviour
{
    [Header("Configuração de Dano")]
    public float damageAmount = 10f;
    public bool destroyOnHit = true;

    // Método disparado quando um Collider 2D com "Is Trigger" ativado toca em outro Collider 2D
    void OnTriggerEnter2D(Collider2D other)
    {
        // 1. A Verificação Essencial (Garantir que é o Jogador)
        // Usamos Tags para identificar de quem é a colisão.
        if (other.gameObject.CompareTag("Player"))
        {
            // 2. Tentar Obter o Script de Vida
            // Tenta achar o componente PlayerHealth no objeto que tocou (other)
            PlayerHealth playerHealth = other.gameObject.GetComponent<PlayerHealth>();

            // Se o jogador tem o script de vida...
            if (playerHealth != null)
            {
                // 3. Aplica o Dano
                playerHealth.TakeDamage(damageAmount);
            }
            
            // 4. A Destruição (Se for um projétil, por exemplo)
            if (destroyOnHit)
            {
                Destroy(gameObject);
            }
        }
    }
}

Passo 3: O Ponto de Contato (Tagging)

A linha other.gameObject.CompareTag("Player") é a sua segurança para não danificar o chão, outros inimigos ou objetos do cenário.

Como configurar a Tag:

  1. Selecione o seu Personagem (o jogador).
  2. No topo da Inspector, ao lado do nome, clique na caixa Tag.
  3. Clique em Add Tag… e crie uma nova Tag chamada Player.
  4. Volte e atribua a Tag Player ao seu personagem.

Importante: Sempre que você for verificar uma colisão, use Tags! É muito mais robusto do que comparar nomes de objetos, que podem mudar.

Passo 4: O Caso da Destruição (Bônus Prático)

No script DamagePlayer, a linha Destroy(gameObject); (dentro da condição if (destroyOnHit)) é fundamental.

Se o seu objeto de perigo for um projétil (como uma bala ou um míssil), ele não deve continuar voando após o impacto. Usar Destroy(gameObject, 0.1f) (onde 0.1f é o tempo em segundos) é uma forma pragmática de garantir que o objeto de perigo seja removido, limpando a memória e evitando lixo na cena.

Conclusão

Com um Collider e a caixa Is Trigger marcada, você isolou a lógica de dano da lógica de física pesada.

O seu objeto de perigo agora:

  1. Detecta o jogador de forma eficiente.
  2. Chama o método TakeDamage() no script de vida do jogador (separação de responsabilidades!).
  3. Se for um projétil, ele se destrói, mantendo o jogo limpo.

O desenvolvimento de jogos se resume a essa organização. Separar as responsabilidades em scripts (um para Movimento, um para Vida, um para Dano) é o que permite que seu projeto cresça sem se tornar um M.U.P. caótico.

O que fazer agora: Crie um novo objeto, chame de “Espinhos” e use este script. Depois, venha comentar se funcionou de primeira! Se não, me diga o erro mais comum que você cometeu ao usar o OnTriggerEnter2D.

No nosso último post desta série, vamos fechar o ciclo e falar sobre a linha de chegada: como fazer um build jogável para você compartilhar e colher feedback.

Compartilhe !