💥 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:
- Collider 2D: Sem ele, não há colisão. Use um
Box Collider 2DouCircle Collider 2D, dependendo do formato. - 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.
- 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:
- Selecione o seu Personagem (o jogador).
- No topo da Inspector, ao lado do nome, clique na caixa Tag.
- Clique em Add Tag… e crie uma nova Tag chamada
Player. - Volte e atribua a Tag
Playerao 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:
- Detecta o jogador de forma eficiente.
- Chama o método
TakeDamage()no script de vida do jogador (separação de responsabilidades!). - 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.




![Código C# na Unity usando [SerializeField] para expor variáveis privadas no Inspector.](https://perai.dev/wp-content/uploads/2025/11/unity-serializefield-vs-public-inspector-tutorial-1.png)
