Objective Link
Utiliza un componente incluido o propio cuando el detector necesite campos, estado temporal, reinicio y una respuesta OnCompleted.
Conceptos
Separa los registros de progresión de los componentes de escena y comprende sus condiciones, orden, identidad y estados finales.
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.
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.
ObjectiveCompleted(index) se emite antes de las acciones.TryCompleteObjective(id, false) marca la fila Skipped y omite sus acciones. No equivale a una finalización normal silenciosa.
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.
| Control | Resultado serializado | Consecuencia en la escena |
|---|---|---|
| Add Objective | Añade una fila con un ID estable generado | Crea o reutiliza el contenedor opcional Objective XX |
| Duplicate | Copia condiciones, tiempos, acciones, eventos y sonido con un ID nuevo | Copiar un GameObject no garantiza que su detector apunte a la fila nueva |
| Move Up / Move Down | Cambia la siguiente posición que puede activarse | Los enlaces siguen basados en ID, pero el orden del recorrido cambia |
| Delete | Elimina el registro de progresión | Todo 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.
| Estado | Cómo se alcanza | ¿Acepta finalización normal? | ¿Se restaura? |
|---|---|---|---|
| NotStarted | El Chapter todavía no ha llegado a la fila | No | Es el valor inicial sin registro final |
| Active | Las condiciones se cumplen y es la posición actual | Sí, con el ID exacto | No |
| Completed | Una solicitud aceptada ejecutó el cierre | No | Sí |
| Skipped | No se cumplieron las condiciones o el código pidió omitir las acciones | No | Sí |
| Failed | Estaba activa o esperando cuando falló el Chapter | No | No |
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.
Utiliza un componente incluido o propio cuando el detector necesite campos, estado temporal, reinicio y una respuesta OnCompleted.
Utiliza Objective.CompleteFromEvent() o un puente pequeño si otro componente ya ofrece la señal exacta.
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.
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.
Revisar panel y complétalo con ButtonObjective. Su cierre activa un generador.Cargar generador con Required True State panel_read, Start Delay de dos segundos y MultiActionObjective para POWER y COOLING.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.Llegar a la salida con TriggerObjective. Mantén el sonido y oculta el marcador desde On Objective Completion.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.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.
Más de un Objective resuelve los mismos ID de Chapter y fila. Conserva uno o enlaza cada copia con una fila distinta.
Comprueba si la fila se completó durante Start Delay, continúa esperando la animación externa o pasó a Skipped por sus condiciones.
Compara el ID solicitado con CurrentObjectiveId, incluidas mayúsculas, y confirma que el Chapter y la fila están Active.
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.