Creación de Misiones de Recolección en Videojuegos

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

Resumen

Pasar de llegar a una zona a recoger un objeto cambia la lógica del sistema de misiones. Aquí se construye un flujo claro: preparar el objeto con collider, activar la quest al cruzar un start point, detectar la recolección con OnTriggerEnter2D y completar la misión cuando el item coincide. Todo con scripts en C# y referencias simples.

¿Qué cambia en la misión basada en objeto?

La meta ya no es un trigger de zona, sino encontrar y recoger un item. Se coloca una campana en el cementerio y se ajusta su visibilidad con sorting layer en «player» para que quede encima del escenario. Se añade un CircleCollider2D y se marca como isTrigger para poder recogerla con el jugador.

  • Objetivo: recoger la «Campana del despertar»..
  • Inicio: clonar el objeto «quest cero start» a «quest uno start». Indicar que inicia la quest 1 cerca de Ricarda..
  • Textos: inicio «Recoge la campana del despertar». fin «Has conseguido la campana. Que empiece el fin del mundo»..

¿Cómo preparar el objeto con collider y sorting layer?

  • Poner la campana en el cementerio.
  • Asignar sorting layer «player» para que se dibuje encima..
  • Añadir CircleCollider2D y activar «is trigger» para detectar al jugador..
  • Guardar el objeto y nombrarlo «Campana»..

¿Cómo configurar el inicio y fin de la quest 1?

  • Clonar «quest cero start» a «quest uno start» y marcar como start point de la quest 1..
  • Desactivar en jerarquía la quest 1 hasta que el jugador pase por su zona de inicio..
  • Ajustar los textos de inicio y fin según el objetivo de la campana..

¿Cómo crear el script quest item para recolectar?

Se añade un script de C# llamado «quest item» al objeto campana. Este notifica al manager cuando el jugador lo recoge y desactiva el objeto.

using UnityEngine;

[RequireComponent(typeof(CircleCollider2D))]
public class QuestItem : MonoBehaviour
{
    public int questID;                 // ID de la quest.
    public string itemName;             // Identificador del ítem.

    private QuestManager manager;       // Referencia al manager.

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

    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag.Equals("Player"))
        {
            // Solo si la quest está activa y no completada.
            if (manager.quests[questID].gameObject.activeInHierarchy &&
                !manager.questsCompleted[questID])
            {
                manager.itemCollected = itemName;  // Notificar recolección.
                gameObject.SetActive(false);       // Desactivar la campana (no destruir).
            }
        }
    }
}

¿Qué necesita el quest manager para recibir el ítem?

  • Añadir en el manager una variable pública: public string itemCollected;.
  • Esta cadena actúa como identificador del último item recolectado..

¿Cómo adaptar el script de la quest para validar el ítem?

Cada quest puede declarar si necesita un objeto y cuál. Luego, en Update, se compara el recolectado en el manager con el requerido. Si coincide, se completa la misión.

public class Quest : MonoBehaviour
{
    public bool needsItem;      // ¿La quest requiere ítem?
    public string itemNeeded;   // Nombre exacto del ítem requerido.

    private QuestManager manager;

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

    void Update()
    {
        if (needsItem && manager.itemCollected == itemNeeded)
        {
            manager.itemCollected = null; // Marcar como usado.
            CompleteQuest();              // Completar misión.
        }
    }

    void CompleteQuest()
    {
        // Lógica de completar: textos de fin, flags, etc.
    }
}
  • Usa coincidencia exacta entre itemNeeded y itemName. Se pueden usar palabras, números o hashmaps para identificar, según se prefiera..
  • Ventaja: se añade funcionalidad sin romper lo anterior. Solo se suman campos y una verificación en Update..

¿Qué pruebas y errores comunes se corrigen?

  • Desactivar la quest 1 en la jerarquía hasta entrar en su zona de inicio..
  • En la campana: questID = 1 y itemName = "Campana de despertar" (el identificador debe ser idéntico al que espera la quest)..
  • Activar «is trigger» en el CircleCollider2D para permitir la recolección..
  • Flujo de validación: iniciar con Ricarda, completar su primera misión en la casa, activar «Recoge la campana del despertar», ir al cementerio, recoger la campana y ver el texto de fin..

¿Te gustaría compartir cómo nombrarías tus ítems o qué otros objetos añadirías al sistema?

      Creación de Misiones de Recolección en Videojuegos