Easy Chapter Generator
EnglishEspañol

Objetivo y contrato

Esta guía crea un detector de reliquias que completa el objetivo activo cuando recibe tres recogidas. Un capítulo puede contener muchos objetivos ordenados, pero solo activa el siguiente registro elegible. La subclase detecta una condición del juego; Chapter sigue decidiendo si el ID, el estado y la posición permiten avanzar.

Clase base verificada

La clase pública real es OverFuture.ChapterObjectiveSystem.Objectives.Objective. El método protegido RequestObjectiveCompletion() devuelve true solo cuando el Chapter acepta la solicitud.

Implementar el componente

  1. 1
    Crea CollectRelicObjective.cs en una carpeta de scripts propia del juego, fuera de la carpeta del complemento.
  2. 2
    Añade using OverFuture.ChapterObjectiveSystem.Objectives; y hereda de Objective.
  3. 3
    Declara un campo serializado requiredRelics y un contador temporal privado.
  4. 4
    En el método que recibe una recogida, comprueba IsCompleted, incrementa el contador y llama a RequestObjectiveCompletion() al alcanzar el límite.
  5. 5
    Sobrescribe ResetObjective(), llama primero a base.ResetObjective() y limpia el contador.

Inspector y CustomEditor predeterminado

No necesitas escribir un CustomEditor para obtener Objective Link, Completion y los diagnósticos comunes. El editor alternativo admite subclases de Objective y dibuja después sus campos serializados propios. Crea un CustomEditor solo si tu componente necesita controles especializados; en ese caso, conserva la superficie de enlace y no llames al Inspector de otro editor dentro del tuyo.

Alternativa sin herencia

Si el sistema externo no puede heredar de Objective, no crees una segunda jerarquía de progresión. Obtén ChapterManager.Instance, comprueba HasActiveObjective y llama a CurrentChapter.TryCompleteObjective(CurrentObjectiveId). Esta vía es adecuada para las notificaciones de diálogo, inventario o middleware.

La llamada devuelve false si no hay objetivo activo, el capítulo no coincide o la solicitud ya fue aceptada. Consulta el ejemplo compilado de Completar y controlar la progresión.

Comprobaciones cuando no completa

RequestObjectiveCompletion devuelve false

Comprueba ObjectiveId, el estado Linked y que ese registro sea el objetivo activo, no solo uno existente.

El contador conserva datos tras reiniciar

La subclase no ha sobrescrito ResetObjective() o no ha llamado a la implementación base.

On Completed se repite

No emitas efectos antes de conocer el resultado. Ejecuta las consecuencias solo cuando RequestObjectiveCompletion() devuelve true.

Crear un Objective de coleccionables

Dónde colocarlo
Guárdalo como CollectRelicObjective.cs y añádelo dentro del contenedor Objective XX generado.
Cuándo llamarlo
Llama a NotifyRelicCollected cuando el juego confirme que se ha recogido una reliquia.
Comportamiento
El componente solo cuenta las señales que le proporciona tu juego. Tras aceptar la finalización, una señal repetida devuelve false; ResetObjective limpia el contador temporal.
using System;
using System.Collections;
using System.Collections.Generic;
using OverFuture.ChapterObjectiveSystem.Chapters;
using OverFuture.ChapterObjectiveSystem.Events;
using OverFuture.ChapterObjectiveSystem.Objectives;
using OverFuture.ChapterObjectiveSystem.Persistence;
using OverFuture.ChapterObjectiveSystem.Progression;
using UnityEngine;

public sealed class CollectRelicObjective : Objective
{
    [SerializeField, Min(1)]
    private int requiredRelics = 3;

    private int collectedRelics;

    public bool NotifyRelicCollected()
    {
        if (IsCompleted)
        {
            return false;
        }

        collectedRelics++;
        return collectedRelics >= Mathf.Max(1, requiredRelics) &&
               RequestObjectiveCompletion();
    }

    public override void ResetObjective()
    {
        base.ResetObjective();
        collectedRelics = 0;
    }
}