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?