Easy Chapter Generator
EnglishEspañol

El objetivo ordenado es el contrato de progresión

ChapterObjective no es un MonoBehaviour. Es el registro serializado que aporta a una posición su título, ID estable, condiciones, espera, acciones, sonido y estado. La posición de la fila decide el orden; la jerarquía de GameObjects no lo hace.

Puede completarse desde un componente incluido, una subclase propia de Objective, un UnityEvent o código externo. Por eso sigue siendo válido aunque no necesite un detector en la escena.

Desde las condiciones hasta las acciones de inicio

  1. Comprobar condicionesRequired True State debe ser true y Required False State debe ser false.
  2. Omitir o activarUna fila no apta pasa a Skipped; una apta pasa a Active.
  3. EsperarTranscurre Start Delay con tiempo no escalado y, si procede, se espera la señal de animación externa.
  4. Ejecutar el inicioTransporte, activaciones, desactivaciones y On Objective Start.

La fila ya está Active mientras espera. Si otra señal completa el objetivo durante ese intervalo, la corrutina se detiene y las acciones de inicio no se ejecutan tarde.

Orden de una finalización aceptada

  1. Evento tipadoObjectiveCompleted(index) se emite antes de las acciones.
  2. Estado y progresoLa fila pasa a Completed y se guarda.
  3. Objetos y UnityEventSe activan/desactivan objetos y se invoca On Objective Completion.
  4. Transporte y sonidoSe ejecutan las acciones de transporte y el sonido opcional.
  5. AvanceSe evalúa la siguiente fila o termina el capítulo.

TryCompleteObjective(id, false) marca la fila Skipped y omite sus acciones. No equivale a una finalización normal silenciosa.

ID estables y duplicados

Los ID se comparan de forma ordinal y deben coincidir exactamente, incluidas mayúsculas. El Editor genera valores y permite copiarlos, pero para componentes de escena es mejor utilizar los selectores de Objective Link. Duplicar una fila crea otra posición; duplicar un componente enlazado puede producir dos detectores para la misma fila y Validation lo señalará.

Eliminar la fila deja los componentes asociados sin destino. Mover un componente a otro capítulo no cambia su ID automáticamente. Repara el enlace de forma deliberada y vuelve a validar.

El orden y los controles de edición cambian el comportamiento

ControlResultado serializadoConsecuencia en la escena
Add ObjectiveAñade una fila con un ID estable generadoCrea o reutiliza el contenedor opcional Objective XX
DuplicateCopia condiciones, tiempos, acciones, eventos y sonido con un ID nuevoCopiar un GameObject no garantiza que su detector apunte a la fila nueva
Move Up / Move DownCambia la siguiente posición que puede activarseLos enlaces siguen basados en ID, pero el orden del recorrido cambia
DeleteElimina el registro de progresiónTodo componente que conserve ese ID queda en estado Missing

El contenedor generado facilita la organización, pero no es el registro. Puede contener cero, uno o varios componentes, y la fila puede funcionar sin contenedor si se completa mediante UnityEvents o código. Mantén fuera los objetos de juego que no pertenezcan al objetivo para que las operaciones de copia y borrado sean claras.

Cinco estados y una sola posición activa

EstadoCómo se alcanza¿Acepta finalización normal?¿Se restaura?
NotStartedEl Chapter todavía no ha llegado a la filaNoEs el valor inicial sin registro final
ActiveLas condiciones se cumplen y es la posición actualSí, con el ID exactoNo
CompletedUna solicitud aceptada ejecutó el cierreNoSí
SkippedNo se cumplieron las condiciones o el código pidió omitir las accionesNoSí
FailedEstaba activa o esperando cuando falló el ChapterNoNo

Solo una fila puede estar Active, también durante Start Delay o Wait For External Animation. Esas opciones retrasan las acciones de inicio; no habilitan otra fila. SignalExternalAnimationCompleted() libera la espera, pero no completa el objetivo.

Tres formas admitidas de completar

Objective Link

Utiliza un componente incluido o propio cuando el detector necesite campos, estado temporal, reinicio y una respuesta OnCompleted.

UnityEvent

Utiliza Objective.CompleteFromEvent() o un puente pequeño si otro componente ya ofrece la señal exacta.

Código del proyecto

Consulta CurrentChapter y CurrentObjectiveId, llama a TryCompleteObjective(idExacto) y comprueba el bool devuelto.

Las tres opciones pasan por la misma comprobación. Una señal temprana, repetida o dirigida a otra fila no puede completar una posición posterior ni volver a ejecutar eventos. Consulta Enlace del objetivo y el ejemplo compilado de finalización externa en Completar y controlar la progresión.

Persistencia e idempotencia

Completed y Skipped se escriben con los identificadores exactos del Chapter y de la fila. Al restaurarlos no se repiten acciones de inicio o finalización, UnityEvents, transportes ni sonidos. Active y Failed son temporales. Al reanudar, se omiten las filas restauradas y se evalúa la primera que no tenga un estado final.

La primera solicitud exacta válida avanza; las siguientes devuelven false porque la posición actual ya cambió. El estado local IsCompleted de los detectores también evita repetir OnCompleted tras una aceptación. Los efectos del proyecto deben reaccionar al resultado aceptado o al evento de ciclo de vida documentado.

Ejemplo: cuatro filas distintas dentro de un Chapter

  1. 1
    Añade Revisar panel y complétalo con ButtonObjective. Su cierre activa un generador.
  2. 2
    Añade Cargar generador con Required True State panel_read, Start Delay de dos segundos y MultiActionObjective para POWER y COOLING.
  3. 3
    Añade Esperar animación de puerta, habilita Wait For External Animation y libera la espera desde Animation Event. El controlador de la puerta completa la fila después.
  4. 4
    Añade Llegar a la salida con TriggerObjective. Mantén el sonido y oculta el marcador desde On Objective Completion.
  5. 5
    Prueba con panel_read a true y a false. La segunda fila debe estar Active en el primer caso y Skipped en el segundo; nunca debe coincidir con otra fila activa.

Validation y diagnóstico concreto

La fila indica Missing

No hay un Objective de escena que resuelva su ID. Solo es correcto si un UnityEvent o código deliberado va a completarla; en otro caso crea o repara el detector.

La fila indica Duplicate Binding

Más de un Objective resuelve los mismos ID de Chapter y fila. Conserva uno o enlaza cada copia con una fila distinta.

No se ejecutan las acciones de inicio

Comprueba si la fila se completó durante Start Delay, continúa esperando la animación externa o pasó a Skipped por sus condiciones.

La finalización devuelve false

Compara el ID solicitado con CurrentObjectiveId, incluidas mayúsculas, y confirma que el Chapter y la fila están Active.

El Chapter termina antes de lo previsto

Revisa las filas Skipped y las entradas nulas. Una serie de condiciones no satisfechas puede llevar de forma válida al final de la lista.