Easy Chapter Generator
EnglishEspañol

Elegir el evento según el contexto

NecesidadEventoContexto
Respuesta desde InspectorUnityEvents del ManagerSin parámetros
Motivo y elementos del falloChapterFailedChapterFailureInfo
Índice aceptado antes de accionesChapter.ObjectiveCompletedint
Detector aceptadoObjective.OnCompletedLocal y posterior al avance
Ciclo configuradoEventos de Chapter/filaSe editan en la ventana

Controlar la vida de la suscripción

Guarda la instancia exacta, suscríbete una vez y elimina el mismo delegado. Durante la destrucción, buscar el singleton otra vez puede devolver null u otra instancia. Para eventos del Chapter, deja de observar el antiguo antes de enlazar el nuevo.

OnEnable/OnDisable funciona cuando la vida del componente coincide con la observación. Un objeto persistente debe reenlazar de forma explícita al cambiar de escena.

Una notificación no sincroniza el estado anterior

Después de suscribirte, lee las propiedades actuales una vez. Esto es imprescindible tras restaurar progreso, porque no se repiten finalizaciones. OnManagerReady indica que se intentó seleccionar; comprueba después CurrentChapter. OnBeforeSceneLoad indica que la transición ya está bloqueada.

Diagnosticar notificaciones duplicadas

Se ejecuta dos veces al habilitar la UI

Se añadió sin retirar. Comprueba listeners por código y persistentes por separado.

El listener de fallo sobrevive

Puede conservar el Manager antiguo; cancela antes de descargar.

No hay eventos iniciales

Es correcto tras la restauración; lee el estado.

Aparece otro objetivo en OnCompleted

Utiliza el evento tipado previo o guarda el ID antes de llamar.

Observar el estado Ready y la finalización de objetivos

Dónde colocarlo
Añade el observador a un objeto de integración persistente en la misma escena que el Manager.
Cuándo llamarlo
OnEnable crea las suscripciones; el estado Ready permite seleccionar el Chapter actual; ObjectiveCompleted informa del índice aceptado.
Comportamiento
Los UnityEvents de inicio y finalización del Chapter se configuran en el Inspector. ObjectiveCompleted se lanza antes de la lista de acciones de finalización del objetivo.
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 LifecycleSubscriptionExample : MonoBehaviour
{
    private ChapterManager manager;
    private Chapter observedChapter;

    private void OnEnable()
    {
        manager = ChapterManager.Instance;
        if (manager == null)
        {
            return;
        }

        manager.OnManagerReady.AddListener(HandleManagerReady);
        ObserveCurrentChapter();
    }

    private void OnDisable()
    {
        manager?.OnManagerReady.RemoveListener(HandleManagerReady);
        StopObservingChapter();
        manager = null;
    }

    private void HandleManagerReady()
    {
        ObserveCurrentChapter();
    }

    private void ObserveCurrentChapter()
    {
        StopObservingChapter();
        observedChapter = manager != null ? manager.CurrentChapter : null;
        if (observedChapter != null)
        {
            observedChapter.ObjectiveCompleted += HandleObjectiveCompleted;
        }
    }

    private void StopObservingChapter()
    {
        if (observedChapter != null)
        {
            observedChapter.ObjectiveCompleted -= HandleObjectiveCompleted;
        }

        observedChapter = null;
    }

    private void HandleObjectiveCompleted(int objectiveIndex)
    {
        Debug.Log($"Completed objective index: {objectiveIndex}", this);
    }
}

Eliminar correctamente una suscripción tipada

Dónde colocarlo
Coloca el receptor en el objeto responsable de responder al fallo del capítulo.
Cuándo llamarlo
OnEnable se conecta a ChapterFailed y OnDisable elimina exactamente el mismo delegado.
Comportamiento
Conserva el Manager utilizado al suscribirte. Buscar otra instancia durante la limpieza puede dejar conectado el evento original.
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 FailureSubscriptionExample : MonoBehaviour
{
    private ChapterManager manager;

    private void OnEnable()
    {
        manager = ChapterManager.Instance;
        if (manager != null)
        {
            manager.ChapterFailed += HandleChapterFailed;
        }
    }

    private void OnDisable()
    {
        if (manager != null)
        {
            manager.ChapterFailed -= HandleChapterFailed;
        }

        manager = null;
    }

    private void HandleChapterFailed(ChapterFailureInfo information)
    {
        Debug.Log($"{information.Chapter?.Identifier}: {information.Reason}", this);
    }
}