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?