Creación de Misiones para Derrotar Enemigos en Videojuegos

Clase 52 de 60Curso Avanzado de Creación de RPGs con Unity

Resumen

Implementa una misión de derrotar enemigos en Unity con un sistema de conteo claro y confiable. Aquí verás cómo extender tu flujo de quests para registrar muertes, validar objetivos y completar la misión, reutilizando la lógica de ítems pero aplicada a enemigos específicos.

¿Cómo crear una misión de matar enemigos en Unity?

Para añadir el objetivo de derrotar enemigos, se reutiliza la estructura de objetivos de ítems y se introduce un contador de muertes. La clave es notificar al Quest Manager cada vez que un enemigo del tipo correcto muere y hacer el seguimiento hasta alcanzar el total requerido.

¿Qué variables necesitas para la quest?

  • needsEnemy (bool): indica que la misión requiere matar enemigos.
  • enemyName (string): nombre del enemigo objetivo, por ejemplo "Red Eye".
  • numberOfEnemies (int): total de enemigos a derrotar, por ejemplo 5.
  • enemiesKilled (int, private): contador interno de muertes registradas.
  • En el Quest Manager: enemyKilled (string, public) para recibir el nombre del último enemigo muerto.

¿Cómo funciona el contador de enemigos?

  • Si needsEnemy es verdadero, la quest escucha el valor de manager.enemyKilled.
  • Cuando enemyKilled coincide con enemyName, se incrementa enemiesKilled.
  • Se limpia el evento con manager.enemyKilled = null para no contar dos veces.
  • Si enemiesKilled >= numberOfEnemies, se llama a CompleteQuest().

¿Cómo se compara con recoger ítems?

  • La estructura es casi idéntica: se sustituye el "ítem recogido" por "enemigo muerto".
  • El patrón de verificación y conteo se mantiene. Solo cambian los nombres de variables y la fuente del evento.

¿Qué cambios aplicar en QuestManager y HealthManager?

La comunicación entre scripts es directa: el HealthManager informa al Quest Manager del nombre del enemigo abatido. La quest valida y actualiza el progreso.

¿Qué código C# implementar en la quest?

// Dentro de la clase Quest
public bool needsEnemy;
public string enemyName;
public int numberOfEnemies;
private int enemiesKilled;

// Referencia al QuestManager
private QuestManager manager;

void Start()
{
    manager = FindObjectOfType<QuestManager>();
}

void Update()
{
    if (needsEnemy)
    {
        if (!string.IsNullOrEmpty(manager.enemyKilled) && manager.enemyKilled == enemyName)
        {
            manager.enemyKilled = null; // limpiar el evento.
            enemiesKilled++; // sumar una muerte válida.

            if (enemiesKilled >= numberOfEnemies)
            {
                CompleteQuest(); // condición de completar la misión.
            }
        }
    }
}

¿Qué código C# implementar en HealthManager?

// Dentro de HealthManager (enemigos y jugador comparten este script)
public string enemyName; // nombre del enemigo para las quests.
private QuestManager manager;

void Start()
{
    manager = FindObjectOfType<QuestManager>();
}

void Update()
{
    // ... lógica de vida/daño.

    // Antes de destruir al enemigo cuando su vida llega a 0:
    // if (isEnemy && currentHealth <= 0)
    // {
    //     DarExperienciaAlJugador();
    //     manager.enemyKilled = enemyName; // notificar muerte.
    // }
}

Notas: - Usa la etiqueta del GameObject para distinguir enemigos y otorgar experiencia antes de notificar la muerte. - El nombre debe coincidir exactamente con el configurado en la quest.

¿Cómo configurar y probar la misión en el editor?

La "Quest 2" define el objetivo de matar cinco "Red Eye". Se activa al entrar en una zona de inicio y se completa al abatir el total.

¿Cómo definir la Quest 2 en el editor?

  • ID: 2.
  • Texto de inicio: "Mata a cinco ojos rojos".
  • Texto de completar: "Has matado a cinco ojos rojos".
  • needsItem: desactivado.
  • needsEnemy: activado.
  • enemyName: "Red Eye".
  • numberOfEnemies: 5.
  • Estado inicial: desactivada hasta entrar en su zona de inicio.

¿Cómo iniciar la quest en la escena?

  • Duplica el activador de inicio existente: "Quest 1 Start" → "Quest 2 Start".
  • Colócalo en la zona del cementerio para activar la misión al pasar.
  • Asigna la questID = 2 en el nuevo activador.
  • Selecciona todos los enemigos del tipo ojo rojo y, en su HealthManager, define enemyName = "Red Eye".

¿Qué mejoras de interfaz puedes añadir?

  • Lista de misiones en la esquina superior derecha con progreso: "Matar ojos rojos: 1/5, 2/5...".
  • Indicador tipo check para objetivos de recogida como la campana.
  • Botón con icono de librito desde los assets para abrir el detalle: completadas, activas, repetibles y conteo de veces completadas.
  • Referencias visuales inspiradas en World of Warcraft, The Witcher o Final Fantasy, adaptadas a tu UI.

¿Te gustaría compartir cómo mostrarías el progreso en tu HUD y qué otros tipos de enemigos integrarías a continuación?

      Creación de Misiones para Derrotar Enemigos en Videojuegos