QuestManager para misiones de RPG en Unity

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

Resumen

Dar un objetivo claro a tu juego de rol pasa por un sistema de misiones bien diseñado. Aquí se construye, paso a paso, un flujo en C# con un QuestManager que coordina quests, controla estados de completado y muestra mensajes vía un DialogManager. Como en The Witcher, Final Fantasy o World of Warcraft, las quests mantienen el juego vivo y con propósito.

¿Cómo dan objetivo las quests al personaje?

Las quests transforman un mundo jugable en una experiencia dirigida. Dejan de ser un “second life” y pasan a tener metas concretas: ir a un lugar, recoger un objeto o derrotar enemigos. Este enfoque permite crear “infinidad” de misiones y actualizarlas con facilidad para sostener el interés durante años.

  • Quests con propósito. Definen objetivos claros para el jugador.
  • Tipos base. Desplazamiento, recolección y combate.
  • Escalabilidad. Añade nuevas quests sin tocar la arquitectura central.

¿Cómo organizar el proyecto y el QuestManager?

Primero, crea un objeto vacío llamado “quest manager” como hijo del canvas. Bajo él, añade tres GameObjects vacíos: “quest 0”, “quest 1” y “quest 2”. Para nuevas misiones, solo crea más objetos “quest” y configúralos como se muestra.

¿Qué es el QuestManager y qué guarda?

El QuestManager es el “director” que coordina todas las misiones. Mantiene:

  • Un arreglo de quests activas.
  • Un arreglo de estados completados con bool por cada quest.
public class QuestManager : MonoBehaviour
{
    public Quest[] quests;              // Misiones configuradas.
    public bool[] questCompleted;       // Estado de cada misión.

    private DialogManager dialogManager; // Referencia al sistema de diálogos.

    void Start()
    {
        questCompleted = new bool[quests.Length];
        dialogManager = FindObjectOfType<DialogManager>();
    }

    public void ShowQuestText(string questText)
    {
        // Adaptar a formato del DialogManager (array de líneas):
        string[] dialogLines = new string[] { questText };
        dialogManager.ShowDialog(dialogLines);
    }
}

¿Cómo inicializar estados y exponer el arreglo de quests?

En el editor, asigna el tamaño del arreglo de quests (por ejemplo, 3) y arrastra “quest 0”, “quest 1” y “quest 2” a sus posiciones. El arreglo questCompleted se dimensiona automáticamente en Start() con quests.Length.

  • Estados independientes. Cada índice del arreglo representa una misión única.
  • Repetibilidad opcional. Podrás decidir si una misión se repite o no.

¿Cómo mostrar el texto de misión con el DialogManager?

Las misiones suelen mostrar una sola línea al iniciar o completar. Para reutilizar el sistema de diálogos de NPCs, se convierte ese único texto a un arreglo de una línea y se pasa al DialogManager mediante ShowQuestText.

  • Integración directa. El QuestManager centraliza las llamadas al DialogManager.
  • Compatibilidad. Se respeta el formato de datos del diálogo existente.

¿Qué datos y métodos necesita cada quest?

Cada quest es un objeto con sus parámetros y lógica mínima. Se identifica con un questId, se conecta al QuestManager y expone textos de inicio y de completado.

¿Cómo identificar y completar una quest?

Usa un identificador único y marca el estado en el manager. Opcionalmente, desactiva el GameObject para que la misión sea única.

public class Quest : MonoBehaviour
{
    public int questId;            // Identificador único de la misión.
    public string startText;       // Mensaje al iniciar.
    public string completeText;    // Mensaje al completar.

    private QuestManager manager;  // Referencia al director de misiones.

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

    public void CompleteQuest()
    {
        manager.questCompleted[questId] = true;
        manager.ShowQuestText(completeText);
        gameObject.SetActive(false); // Opcional: evitar repetir la misión.
    }
}
  • Marcado de estado. questCompleted[questId] = true asegura trazabilidad.
  • Control de ciclo. Desactivar la misión evita duplicados no deseados.

¿Cómo iniciar y comunicar mensajes al jugador?

Al arrancar una misión, muestra su texto de inicio usando el manager.

public void StartQuest()
{
    manager.ShowQuestText(startText);
}
  • Mensajes claros. Inicio y fin comunican progreso al jugador.
  • Reutilización. Todo pasa por ShowQuestText del manager.

¿Qué patrón organizativo estás aplicando?

Se usa una estructura “por departamentos”: las quests son “empleados” que reportan a su manager de misiones; el QuestManager se coordina con otro manager (el DialogManager) para textos. No hay comunicación directa entre quests. Esto aporta:

  • Orden y mantenimiento. Menos dependencias cruzadas.
  • Escalabilidad. Añadir misiones es inmediato.
  • Reutilización. El sistema de diálogos sirve también para misiones.

¿Quieres que profundicemos en los tres tipos de misiones (ir, recoger, derrotar) o en cómo permitir quests repetibles? Cuéntame en comentarios qué te gustaría implementar primero.

      QuestManager para misiones de RPG en Unity