💥 Criando um Sistema para Derrotar Inimigos ao Pular na Cabeça!

Agora vamos implementar um sistema onde o jogador derrota os inimigos ao pular na cabeça deles, como no Super Mario Bros!
🛠 Passo 1: Criando o Inimigo
1️⃣ Na Hierarchy, clique com o botão direito e vá em 2D Object > Sprite.
2️⃣ Renomeie o objeto para Inimigo.
3️⃣ No Inspector, clique em Sprite Renderer > Sprite e selecione um sprite de inimigo (exemplo: Slime, Goblin, etc.).
4️⃣ Adicione um Box Collider 2D para detectar colisões.
5️⃣ Adicione um Rigidbody 2D e defina:
- Body Type: Dynamic.
- Freeze Rotation (Z): Ativado (para impedir que o inimigo tombe).
🛠 Passo 2: Criando um Ponto de Colisão na Cabeça do Inimigo
Para garantir que o jogador só derrote o inimigo ao pular na cabeça, precisamos criar um detector de colisão no topo do inimigo.
1️⃣ Dentro do GameObject “Inimigo”, clique com o botão direito e vá em Create Empty.
2️⃣ Renomeie o objeto para HeadDetector.
3️⃣ No Inspector, clique em Add Component > Box Collider 2D e configure:
- Size: Reduza o tamanho para que cubra apenas o topo da cabeça do inimigo.
- Is Trigger: Ativado (para detectar a colisão sem afetar a física).
👾 Como o Sistema Funciona?
- O inimigo causa dano ao jogador ao tocar nele pelos lados ou por baixo.
- Se o jogador pular na cabeça do inimigo, o inimigo será destruído.
- O inimigo não se autodestrói ao causar dano, garantindo uma mecânica justa.
💾 Configurando o Inimigo no Unity
1️⃣ Criar um GameObject “HeadPoint”
- No Unity, selecione seu inimigo na Hierarchy.
- Clique com o botão direito →
Create Empty
e renomeie paraHeadPoint
. - Arraste
HeadPoint
um pouco para cima do inimigo (onde o jogador vai pisar). - No Inspector, defina “Layer” como “Player”.
2️⃣ Adicionar o Script EnemyDamage.cs
- Crie um novo script chamado
EnemyDamage.cs
e adicione ao inimigo. - Copie e cole o código abaixo:
🛠 Passo 3: Criando o Script para Destruir o Inimigo
Agora vamos programar a lógica para derrotar o inimigo ao pular na cabeça dele.
1️⃣ Vá até a pasta Scripts e crie um novo script chamado Enemy.cs.
2️⃣ Abra o script e substitua o código por este:
using UnityEngine;
public class Enemy : MonoBehaviour
{
public GameObject deathEffect; // Efeito visual ao destruir o inimigo
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Player")) // Verifica se foi o jogador que colidiu
{
DestroyEnemy(); // Chama a função para destruir o inimigo
PlayerJump(collision.gameObject); // Faz o jogador quicar para cima após derrotar o inimigo
}
}
void DestroyEnemy()
{
if (deathEffect != null)
{
Instantiate(deathEffect, transform.position, Quaternion.identity); // Cria o efeito de destruição
}
Destroy(gameObject); // Destroi o inimigo
}
void PlayerJump(GameObject player)
{
Rigidbody2D rb = player.GetComponent<Rigidbody2D>();
if (rb != null)
{
rb.velocity = new Vector2(rb.velocity.x, 7f); // Faz o jogador pular após pisar no inimigo
}
}
}
🛠 Passo 4: Ligando o Script ao Inimigo
1️⃣ Selecione o HeadDetector dentro do inimigo.
2️⃣ No Inspector, clique em Add Component > Enemy.
3️⃣ Se tiver um efeito de partículas para quando o inimigo morrer, arraste-o para o campo Death Effect do script (opcional).
4️⃣ Adicione a Tag “Enemy” no inimigo:
- Vá até o Inspector, clique em Tag > Add Tag… e crie a tag Enemy.
- Depois, selecione o inimigo e atribua essa tag a ele.
🎮 Testando o Sistema
✅ Pressione Play e pule sobre um inimigo.
✅ O inimigo deve ser destruído, e o personagem deve quicar para cima.
✅ Agora o jogador pode derrotar inimigos igual no Mario Bros! 🎮🔥
vamos adicionar movimentação automática para os inimigos, fazendo com que eles andem pelo cenário! 🚀
Se tiver dúvidas, assista ao tutorial no YouTube: (colocar link aqui).
👹 Fazendo o Inimigo Andar e Causar Dano ao Jogador!
Agora vamos programar o movimento automático do inimigo, fazendo com que ele:
✔ Cause dano ao jogador ao tocar nele.
✔ Ative animações conforme o estado (andando/parado).
🛠 Passo 1: Criando o Script de Movimento do Inimigo
1️⃣ Vá até a pasta Scripts e crie um novo script chamado EnemyMovement.cs.
2️⃣ Abra o script e substitua o código por este:
using UnityEngine;
public class EnemyMovement : MonoBehaviour
{
public float speed = 2f; // Velocidade do inimigo
public float walkDistance = 3f; // Distância total a percorrer
private float startPositionX; // Posição inicial
private int direction = 1; // 1 = direita, -1 = esquerda
private Animator animator; // Referência ao Animator
void Start()
{
startPositionX = transform.position.x; // Guarda a posição inicial
animator = GetComponent<Animator>(); // Obtém o Animator
animator.SetBool("Run", true); // Ativa a animação de corrida
}
void Update()
{
// Move o inimigo na direção atual
transform.position += new Vector3(speed * direction * Time.deltaTime, 0, 0);
// Se o inimigo percorreu a distância desejada, inverte a direção
if (Mathf.Abs(transform.position.x - startPositionX) >= walkDistance)
{
Flip();
}
}
void Flip()
{
direction *= -1; // Inverte a direção
Vector3 scale = transform.localScale;
scale.x *= -1; // Inverte o sprite
transform.localScale = scale;
animator.SetBool("Run", true); // Garante que a animação continua ativa
}
}
using UnityEngine;
public class EnemyDamage : MonoBehaviour
{
public int damage = 1; // Dano causado ao jogador
public Transform headPoint; // Ponto da cabeça do inimigo
public float headSize = 0.3f; // Tamanho da área da cabeça
public LayerMask playerLayer; // Camada do jogador
private Animator animator;
private Collider2D enemyCollider;
private bool isDead = false; // Evita múltiplas execuções da morte
void Start()
{
animator = GetComponent<Animator>(); // Obtém o Animator
enemyCollider = GetComponent<Collider2D>(); // Obtém o Collider do inimigo
}
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
// Se o jogador acertou a cabeça do inimigo, o inimigo morre
if (IsHeadHit(other.transform))
{
Die();
}
// Se o jogador colidiu lateralmente ou por baixo, ele recebe dano
else
{
other.GetComponent<PlayerHealth>().TakeDamage(damage);
}
}
}
bool IsHeadHit(Transform player)
{
// Verifica se o jogador atingiu a cabeça do inimigo
return Physics2D.OverlapCircle(headPoint.position, headSize, playerLayer);
}
void Die()
{
if (isDead) return; // Evita chamadas múltiplas
isDead = true;
animator.SetTrigger("Death"); // Ativa animação de morte
enemyCollider.enabled = false; // Desativa colisões do inimigo
Destroy(gameObject, 0.5f); // Destroi o inimigo após a animação
}
}
Para o personagem:
using UnityEngine;
public class PlayerHealth : MonoBehaviour
{
public int maxHealth = 3; // Vida máxima do jogador
private int currentHealth;
void Start()
{
currentHealth = maxHealth; // Define a vida inicial
}
// Método público para receber dano
public void TakeDamage(int damage)
{
currentHealth -= damage; // Reduz a vida do jogador
Debug.Log("Jogador tomou dano! Vida restante: " + currentHealth);
if (currentHealth <= 0)
{
Die(); // Chama a função de morte se a vida chegar a 0
}
}
void Die()
{
Debug.Log("Jogador morreu!");
// Aqui você pode adicionar animação de morte, respawn, etc.
}
}
🏃 Criando a Animação de Andar do Inimigo na Unity
Agora que configuramos o sistema de dano e destruição do inimigo, vamos adicionar animações para que ele se mova de forma mais realista.
Se tiver dúvidas, assista ao vídeo tutorial no YouTube: [inserir link aqui].
🎬 Criando a Animação do Inimigo
1️⃣ Importando os Sprites
- No Unity, vá até
Assets > Pixel Adventure 1 > Assets > Main Characters > Ninja Frog
. - Clique em
Ninja Frog.png
e, no Inspector, certifique-se de que o Sprite Mode está comoMultiple
. - Clique no botão
Sprite Editor
e verifique se os slices já estão cortados automaticamente. - Se necessário, ajuste os cortes e clique em
Apply
.
2️⃣ Criando a Animação de Andar (Run)
- No Inspector, expanda a pasta
Ninja Frog
e selecione todos os sprites da animação de corrida (Run_0
atéRun_5
). - Arraste-os para dentro do GameObject do inimigo na Hierarchy.
- Quando o Unity pedir para criar um Animation Clip, nomeie como
Enemy_Run.anim
e salve dentro da pastaAnimations
.
3️⃣ Criando a Animação de Idle (Parado)
- Vá para a pasta
Ninja Frog
novamente. - Selecione os sprites da animação
Idle
(Idle_0
atéIdle_4
). - Arraste-os para o inimigo e nomeie o novo clip como
Enemy_Idle.anim
.
🎭 Configurando a Animação no Animator
Agora precisamos configurar a troca de animações dentro do Animator do inimigo:
- Selecione o inimigo na Hierarchy.
- No Inspector, clique no
Animator
. - Abra o Animator Window (
Window > Animation > Animator
). - Você verá os clipes
Enemy_Run
eEnemy_Idle
. - Clique com o botão direito em
Enemy_Idle
e escolha “Set as Default State” (para que o inimigo inicie parado). - Crie uma transição de
Idle → Run
e deRun → Idle
, definindo a condiçãobool isRunning
.