Quests por triggers en Unity

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

Resumen

Crear misiones por ubicación en Unity es más simple de lo que parece: con zonas de trigger, un _Box Collider 2D_ y un script claro, puedes activar y completar una quest al llegar a puntos del mapa. Aquí verás cómo configurar “Ir a casa de Ricardo”, cómo escribir el Quest Trigger y qué ajustes evitan errores comunes.

¿Cómo crear una quest de ir a un lugar con triggers en Unity?

Para una misión basada en lugar, define un inicio y un fin claros. El ejemplo usa la quest con ID 0: texto de inicio “Ir a casa de Ricardo” y texto de finalización “Has llegado a casa de Ricardo”. El sistema de quests admite textos genéricos y permite ajustarlos con información adicional.

  • Crea dos objetos: “Quest Start” y “Quest End”.
  • Añade a cada uno un Box Collider 2D marcado como isTrigger.
  • Coloca el inicio cerca de Ricardo y el fin en el exterior de su casa.
  • Ajusta el tamaño del collider para delimitar la zona. Puedes hacerlo amplio.
  • Asegúrate de que ambas zonas sean invisibles y sin colisión: solo trigger.
  • Activa la misión al entrar en “Start” y complétala al entrar en “End”.

Además, los triggers sirven para más que quests: también pueden lanzar cinemáticas, hacer aparecer un boss o disparar una animación cuando el jugador entra en una zona.

¿Dónde colocar los triggers y por qué?

  • Inicio junto a Ricardo: permite activar la misión al acercarse.
  • Fin en la entrada de la casa: facilita completar la misión sin precisión milimétrica.
  • Si quieres que el inicio se mueva con Ricardo, hazlo hijo suyo.

¿Cómo evitar que el fin no funcione?

  • Desactiva el GameObject de la quest en la jerarquía antes de empezar.
  • Saca “Quest Start” y “Quest End” fuera de la quest desactivada: deben ser GameObjects independientes (no hijos), así sus triggers siguen activos.
  • Si los creaste dentro del canvas, puedes recrearlos como objetos de escena normales.

¿Qué scripts y lógica C# necesitas para el Quest Trigger?

El Quest Trigger requiere un Box Collider 2D y distingue si la zona es de inicio o fin. Al detectar al Player con OnTriggerEnter2D, activa la quest si está inactiva o la completa si está activa.

using UnityEngine;

[RequireComponent(typeof(BoxCollider2D))]
public class QuestTrigger : MonoBehaviour
{
    private QuestManager manager; // Referencia al *Quest Manager*.

    public int questID;           // Identificador de la quest.
    public bool endPoint;         // false: inicio. true: fin.

    void Start()
    {
        // Referencia al manager (ver ajuste más abajo sobre el orden de creación).
        manager = FindObjectOfType<QuestManager>();
    }

    void OnTriggerEnter2D(Collider2D collision)
    {
        if (!collision.gameObject.tag.Equals("Player")) return;

        // Opcional: impedir que se repita si ya fue completada.
        if (manager.questsCompleted[questID]) return;

        // Inicio: activar si aún no está activa.
        if (!endPoint && !manager.quests[questID].gameObject.activeInHierarchy)
        {
            manager.quests[questID].gameObject.SetActive(true);
            manager.quests[questID].startQuest(); // Muestra texto de inicio.
            return;
        }

        // Fin: completar si está activa.
        if (endPoint && manager.quests[questID].gameObject.activeInHierarchy)
        {
            // Completar la misión desde el manager/quest correspondiente.
            // Ej.: manager.quests[questID].completeQuest();
        }
    }
}

Ajuste recomendado sobre el orden de creación: en lugar de buscar el Quest Manager en Start del Trigger, se sugiere hacerlo al iniciar la misión dentro del propio método startQuest de la quest. Así siempre obtienes la referencia cuando realmente la necesitas.

// Dentro del script de la quest
void startQuest()
{
    var manager = FindObjectOfType<QuestManager>();
    // ... lógica de inicio y UI.
}

¿Qué buenas prácticas evitan errores y mejoran la experiencia?

Para que todo funcione de forma consistente, revisa estos puntos clave durante la implementación.

  • Desactivar antes de iniciar: la quest debe empezar desactivada en la jerarquía.
  • Triggers independientes: “Start” y “End” como GameObjects sueltos, no hijos.
  • Colisiones desactivadas: ambos Box Collider 2D en modo trigger.
  • Verificación del jugador: usa la tag "Player" en OnTriggerEnter2D.
  • Activación única: condición con activeInHierarchy antes de SetActive(true).
  • Repetición opcional: elimina la comprobación de “completada” para misiones repetibles.
  • Variación de repeticiones: usar un array de enteros en lugar de booleanos para contar cuántas veces completar.
  • Área de fin generosa: un collider más grande evita frustración al completar.
  • Feedback claro: el texto de inicio y fin confirma el estado de la misión.
  • Mejora propuesta: al completar, entrega experiencia al personaje con una variable de recompensa y la actualización correspondiente.

¿Te animas a ampliar el sistema con recompensas o misiones repetibles? Comparte tus ideas, dudas o mejoras y comenta cómo lo implementarías en tu proyecto.