💥 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 para HeadPoint.
  • 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

  1. No Unity, vá até Assets > Pixel Adventure 1 > Assets > Main Characters > Ninja Frog.
  2. Clique em Ninja Frog.png e, no Inspector, certifique-se de que o Sprite Mode está como Multiple.
  3. Clique no botão Sprite Editor e verifique se os slices já estão cortados automaticamente.
  4. Se necessário, ajuste os cortes e clique em Apply.

2️⃣ Criando a Animação de Andar (Run)

  1. No Inspector, expanda a pasta Ninja Frog e selecione todos os sprites da animação de corrida (Run_0 até Run_5).
  2. Arraste-os para dentro do GameObject do inimigo na Hierarchy.
  3. Quando o Unity pedir para criar um Animation Clip, nomeie como Enemy_Run.anim e salve dentro da pasta Animations.

3️⃣ Criando a Animação de Idle (Parado)

  1. Vá para a pasta Ninja Frog novamente.
  2. Selecione os sprites da animação Idle (Idle_0 até Idle_4).
  3. 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:

  1. Selecione o inimigo na Hierarchy.
  2. No Inspector, clique no Animator.
  3. Abra o Animator Window (Window > Animation > Animator).
  4. Você verá os clipes Enemy_Run e Enemy_Idle.
  5. Clique com o botão direito em Enemy_Idle e escolha “Set as Default State” (para que o inimigo inicie parado).
  6. Crie uma transição de Idle → Run e de Run → Idle, definindo a condição bool isRunning.