Easy Chapter Generator
EnglishEspañol

Un Chapter representa una secuencia completa

Un Chapter contiene la lista ordenada, decide qué fila es actual, omite las que no cumplen sus condiciones, ejecuta las acciones de inicio y final, conserva su estado y comunica la finalización al Manager. Es una buena unidad para una misión, una parte de tutorial, una fase de nivel o un bloque narrativo con principio y final claros.

Crea varios capítulos cuando necesites identidades, puntos de entrada, transiciones o registros de finalización independientes. No dividas una secuencia corta únicamente para multiplicar apartados.

Identidad, ciclo y cierre

CampoSignificadoRegla
TitleNombre legible en el EditorPuede cambiar sin utilizarse como clave
IdentifierID exacto para selección, enlaces, transferencias y progresoDebe ser único y estable
On Chapter StartSe invoca en un inicio o una reanudación activaNo garantiza que la primera fila sea apta
Ordered ObjectivesSecuencia linealEl orden y los ID son significativos
On Chapter CompletionSe invoca tras guardar la finalizaciónPrecede a la transición del Manager
Completion ActionDecisión al terminarEl Editor muestra solo los campos necesarios

Estados del capítulo

Not StartedActiveCompleted

Failed se alcanza únicamente mediante un fallo explícito aceptado. Seleccionar un capítulo de nuevo inicia una ejecución limpia y borra su progreso conocido. Restaurar progreso no vuelve a ejecutar eventos históricos. El valor antiguo CanFail se conserva para compatibilidad, pero ya no bloquea el comando de fallo de V1.

Elegir Completion Action

None

Los eventos o el código del proyecto deciden lo siguiente.

Load Scene

Carga la escena y deja que su Manager aplique su inicio habitual.

Load Scene and Start Chapter

Guarda una transferencia de un solo uso con el capítulo de destino.

Restore Checkpoint

Añade el objetivo de destino a la transferencia y respeta los estados terminales ya guardados.

Consulta Transiciones de escena y transferencia antes de combinar estas opciones con persistencia.

Capítulo predeterminado y orden de la lista

Default Chapter es una elección del Manager, no un modo especial del componente ni una comparación con Title. Solo uno de los capítulos encontrados puede ser el destino predeterminado cuando no existe una transferencia válida y tampoco hay una selección de pruebas habilitada en el Editor. Cambiarlo no inicia el capítulo ni modifica el progreso guardado.

El orden de Chapter List facilita la lectura y mantiene selectores predecibles, pero no encadena capítulos automáticamente. Para pasar de uno a otro, Completion Action debe indicar un destino o el código del proyecto debe seleccionarlo. El avance automático ocurre dentro de la lista Ordered Objectives de cada Chapter.

Añadir, duplicar, mover y eliminar con seguridad

ControlEfectoQué revisar
Add ChapterCrea un GameObject Chapter bajo el Manager y genera un ID únicoDefine Title, añade objetivos y elige el predeterminado si corresponde
DuplicateCopia la configuración y las filas, pero genera identidades nuevasVuelve a enlazar los componentes copiados y evita enlaces duplicados
Move Up / Move DownCambia el orden de la lista y la jerarquía con UndoEl orden interno de los objetivos de cada Chapter no cambia
DeleteElimina el Chapter y sus contenedores mediante Unity UndoSelecciona otro predeterminado y repara transferencias, enlaces y código
Title sirve para presentar; Identifier forma parte del contrato

Puedes cambiar Title sin afectar a las integraciones. Cambia Identifier solo como una migración, porque los enlaces de escena, el código, las claves guardadas y las transferencias comparan el valor exacto.

Un Chapter puede contener muchos objetivos ordenados

La lista puede ser larga, pero solo existe una posición actual. On Chapter Start se invoca una vez después de pasar a Active y antes de que termine la espera inicial del primer objetivo disponible. Cada fila gestiona después sus propias acciones. On Chapter Completion solo se invoca cuando todas las filas no nulas están Completed o Skipped y ya se ha escrito la finalización del capítulo.

No todas las filas necesitan un componente de escena. Pueden completarse desde una interfaz, un diálogo, un Objective propio o código externo. En sentido contrario, colocar un detector bajo el GameObject del Chapter no lo incorpora a la secuencia si no tiene un Objective Link exacto.

Inicio limpio, retroceso y restauración son operaciones distintas

OperaciónResultadoNo hace
StartChapter() o selección del ManagerReinicia el progreso conocido de ese Chapter, lo activa, invoca On Chapter Start y comienza en la fila solicitada o la primeraNo restaura Active ni Failed antiguos
TryStepBack(currentObjectiveId)Exige el ID activo exacto, cierra la posición actual en modo de retroceso, reinicia el detector anterior y lo activaNo es un historial libre ni permite ir antes de la primera fila
Reanudación restauradaAplica Completed/Skipped y continúa por la primera fila pendiente sin repetir eventos históricosNo restaura Active o Failed ni deduce que el Chapter terminó solo por sus filas
ClearProgress()Elimina las claves conocidas del Manager y reinicia el estado en memoriaNo borra otros perfiles, otros ámbitos ni la partida general

Consulta Reinicio y retroceso y Persistencia del progreso para conocer el contrato completo.

Ejemplo sin código: tutorial de tres pasos

  1. 1
    Pulsa Add Chapter, utiliza Tutorial de energía como Title, conserva el Identifier generado y selecciónalo como predeterminado.
  2. 2
    Añade tres filas: Leer el panel, Activar el generador y Llegar a la salida. Ordénalas con Move Up/Down.
  3. 3
    Utiliza On Chapter Start para mostrar la ayuda. Enlaza un ButtonObjective, un MultiActionObjective y un TriggerObjective con las tres filas.
  4. 4
    Haz que las acciones finales oculten el marcador actual y muestren el siguiente. Deja Completion Action en None y utiliza On Chapter Completion para mostrar el panel final.
  5. 5
    Actualiza Validation. Prueba el recorrido normal, una solicitud repetida, TryStepBack desde la segunda fila y un inicio nuevo tras borrar el perfil seleccionado.

El ejemplo C# compilado que aparece al final selecciona un Chapter por su Identifier exacto y comprueba el resultado. Para completar objetivos desde código, continúa con Completar y controlar la progresión.

Validation y problemas propios del Chapter

No empieza ningún objetivo

Confirma que existe al menos una fila no nula, que el ID inicial resuelve y que las condiciones permiten continuar o marcan la fila como Skipped.

Tras cargar una escena empieza otro Chapter

Revisa primero la transferencia de un solo uso, después la selección de pruebas y por último Default Chapter. La transferencia tiene prioridad.

El Chapter no termina

Busca la primera fila sin estado final. Una entrada nula se omite con una advertencia; una fila Active todavía necesita una solicitud exacta aceptada.

La copia tiene enlaces duplicados

Duplicar los datos no cambia automáticamente el destino de todos los detectores copiados. Enlázalos con las filas nuevas o elimina el componente sobrante.

El progreso guardado es incoherente

Si un Chapter figura Completed pero conserva una fila pendiente, se mantiene el dato y se informa del problema. La reanudación empieza en la primera fila pendiente.

Seleccionar e iniciar un Chapter

Dónde colocarlo
Utiliza este componente en un menú, selector de nivel o controlador de integración propio del proyecto.
Cuándo llamarlo
Llama a TryStartChapter con el ID estable exacto después de que exista el Manager.
Comportamiento
La selección inicia y reinicia el Chapter elegido según el contrato público. No utilices su título ni un ID parcial.
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 ChapterSelectionExample : MonoBehaviour
{
    public bool TryStartChapter(string chapterId)
    {
        ChapterManager manager = ChapterManager.Instance;
        return manager != null &&
               !string.IsNullOrWhiteSpace(chapterId) &&
               manager.TrySelectChapter(chapterId);
    }
}