Creación de Misiones para Derrotar Enemigos en Videojuegos

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

Contenido del curso

Personaje principal: Movimiento y Animaciones

Enemigos Avanzados

Personaje principal avanzado

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?