Ciclo Día-Noche
Construye un sistema de tiempo que avanza automáticamente — cada 3 turnos, el tiempo avanza (Mañana → Mediodía → Atardecer → Noche → Mañana). Diferentes horas del día activan diferentes entradas de lore y música de fondo, cambiando la atmósfera de escritura de la IA para que coincida. El jugador no tiene que hacer nada — el tiempo simplemente fluye.
Lo que vas a construir
Un sistema de ciclo día-noche integrado en el chat:
- Conteo automático — en cada turno de diálogo, un contador interno se incrementa en 1. En el 3er turno, el tiempo avanza una hora del día
- Cuatro horas del día — Mañana → Mediodía → Atardecer → Noche → Mañana (y así sucesivamente)
- Cambio de atmósfera — cada hora del día tiene su propia entrada de lore que describe la iluminación, temperatura, comportamiento de los NPCs, etc. Cuando cambia la hora del día, la entrada antigua se deshabilita y la nueva se habilita
- Cambio de BGM — la Mañana reproduce cantos de pájaros, la Noche cambia a grillos y ranas. Las transiciones usan crossfade para que no haya corte abrupto
- Distintivo de tiempo — un pequeño icono en el último mensaje del chat (☀️🌤️🌅🌙) para que el jugador siempre sepa qué hora es
Cómo funciona
Todo el sistema se reduce a: contador +1 cada turno → contador llega a 3 → cambiar la hora del día → reiniciar contador → alternar entradas y música.
El jugador envía un mensaje → la IA responde → el turno termina
→ el comportamiento "every turn +1" se dispara: turn_counter va de 0 a 1
→ siguiente turno: turn_counter va de 1 a 2
→ siguiente turno: turn_counter va de 2 a 3
→ el comportamiento "variable crossed threshold" se dispara: turn_counter sube por encima de 2
→ se ejecutan acciones: time_period se establece a la siguiente hora del día, turn_counter se reinicia a 0
→ entrada de la hora del día antigua deshabilitada, entrada de la nueva hora del día habilitada
→ crossfade a la BGM de la nueva hora del día
→ el Root Component lee la variable y actualiza el distintivo de tiempoHay dos formas de implementar esto. Mismo resultado, modelos mentales distintos:
| Enfoque | Disparadores usados | Número de comportamientos | Mejor para |
|---|---|---|---|
| Enfoque A: every-turn +1 + variable crossed | every-turn + variable-crossed | 2 | Personas que quieren entender la mecánica subyacente |
| Enfoque B: disparar directamente cada N turnos | turn-count (everyNTurns=3) | 1 | Personas que solo quieren que funcione |
Esta receta enseña el Enfoque A (más versátil, y te ayuda a entender cómo los comportamientos se encadenan). El Enfoque B se cubre brevemente al final.
Paso a paso
Paso 1: Crea variables
Necesitamos 2 variables — una para seguir la hora del día actual, una como contador.
Editor → barra lateral → pestaña Variables → haz clic en "Add Variable" para cada una
Variable 1: Hora del día actual
| Campo | Valor | Por qué |
|---|---|---|
| Nombre | Hora del día actual | Para tu propia referencia |
| ID | time_period | Los comportamientos y el Root Component leen/escriben este ID |
| Tipo | String | Porque los valores son texto ("Morning", "Noon", "Evening", "Night") |
| Valor por defecto | Morning | Las nuevas sesiones empiezan por la mañana |
| Categoría | Custom | Categoría dedicada para el sistema de tiempo |
| Reglas de comportamiento | No modifiques esta variable. Está controlada automáticamente por el sistema de ciclo día-noche. Su valor actual representa la hora del día dentro del juego. | Le dice a la IA que no cambie el tiempo por su cuenta — solo los comportamientos pueden |
Variable 2: Contador de turnos
| Campo | Valor | Por qué |
|---|---|---|
| Nombre | Contador de turnos | Para tu propia referencia |
| ID | turn_counter | Se incrementa cada turno, se reinicia en 3 |
| Tipo | Number | Necesita aritmética |
| Valor por defecto | 0 | Empieza a contar desde 0 |
| Categoría | Custom | Categoría dedicada para el sistema de tiempo |
| Reglas de comportamiento | No modifiques esta variable. Está controlada automáticamente por el sistema de ciclo día-noche. | Evita que la IA lo manipule |
¿Por qué usar un contador en lugar de dispararse cada 3 turnos directamente?
El enfoque de contador + variable-crossed es más flexible. Digamos que más tarde quieres "3 turnos durante el día, 5 turnos por la noche" — solo añades una comprobación de condición al comportamiento. El disparador turn-count es más simple pero menos adaptable. Ambos enfoques tienen sus fortalezas; elige el que se ajuste a tus necesidades.
Paso 2: Crea cuatro entradas de lore para las horas del día
Cada hora del día necesita una entrada de lore que describa su atmósfera. Solo "Morning" está habilitada por defecto; las otras tres empiezan deshabilitadas.
Editor → pestaña Lore → crea entradas una por una
Entrada 1: Atmósfera matutina
| Campo | Valor | Por qué |
|---|---|---|
| Nombre | Atmósfera matutina | Para tu propia referencia |
| Sección | Presets | Las entradas preestablecidas se envían a la IA cada vez |
| Habilitada | Sí (activado) | El juego empieza por la mañana, por lo que esta está activa por defecto |
Contenido:
[Período actual: Mañana]
Es temprano por la mañana. Refleja la siguiente atmósfera al describir la escena:
- Una luz suave de la mañana se cuela desde el este; el aire es fresco y frío
- Las gotas de rocío se aferran a las hojas de hierba y a los pétalos de las flores, refractando pequeños destellos de luz
- Los pájaros cantan en las ramas; un gallo canta a lo lejos
- Los NPCs apenas se están despertando, las tiendas abren una a una, el tránsito de gente empieza a aumentar
- El ambiente general es apacible y lleno de esperanzaEntrada 2: Atmósfera del mediodía
| Campo | Valor | Por qué |
|---|---|---|
| Nombre | Atmósfera del mediodía | Para tu propia referencia |
| Sección | Presets | Sección de presets |
| Habilitada | No (desactivado) | Los comportamientos la habilitarán cuando cambie la hora del día |
Contenido:
[Período actual: Mediodía]
Es mediodía. Refleja la siguiente atmósfera al describir la escena:
- El sol cae a plomo directamente arriba; la luz es abrasadora y brillante, el suelo refleja un resplandor blanco cegador
- El aire es sofocante; el paisaje distante tiembla y se deforma en la bruma del calor
- La mayoría de la gente se ha refugiado a la sombra para descansar; las calles están más silenciosas que por la mañana
- Las tabernas y los comedores están en su momento más concurrido, el olor a comida flota en el aire
- El ambiente general es lánguido y bochornosoEntrada 3: Atmósfera del atardecer
| Campo | Valor | Por qué |
|---|---|---|
| Nombre | Atmósfera del atardecer | Para tu propia referencia |
| Sección | Presets | Sección de presets |
| Habilitada | No (desactivado) | Los comportamientos la habilitarán |
Contenido:
[Período actual: Atardecer]
Es el atardecer. Refleja la siguiente atmósfera al describir la escena:
- El sol poniente pinta el cielo en tonos de naranja-rojo y púrpura, las nubes bordeadas de oro
- Largas sombras se extienden desde los edificios y los árboles
- Bandadas de pájaros cruzan el cielo de vuelta a casa; volutas de humo de cocina se alzan desde los tejados
- Los NPCs están terminando la jornada, regresando a casa; los niños se persiguen por las calles
- El ambiente general es cálido, nostálgico, teñido de una melancolía suaveEntrada 4: Atmósfera nocturna
| Campo | Valor | Por qué |
|---|---|---|
| Nombre | Atmósfera nocturna | Para tu propia referencia |
| Sección | Presets | Sección de presets |
| Habilitada | No (desactivado) | Los comportamientos la habilitarán |
Contenido:
[Período actual: Noche]
Es noche cerrada. Refleja la siguiente atmósfera al describir la escena:
- La luz de la luna y las estrellas son las únicas fuentes naturales de iluminación, derramando un brillo plateado sobre todo
- La mayoría de los edificios se han apagado; alguna ventana ocasional brilla con la luz tenue de una vela
- Una brisa nocturna fresca arrastra el coro de grillos y ranas
- Las calles están casi desiertas; guardias de la ronda nocturna pasan despacio, con antorchas en la mano
- El peligro puede acechar en las sombras — bestias salvajes, ladrones o algo aún más extraño
- El ambiente general es misterioso, silencioso y cargado de peligros ocultos¿Por qué solo "Morning" está habilitada por defecto? Porque el juego empieza por la mañana. Si las cuatro entradas estuvieran habilitadas a la vez, la IA recibiría las descripciones de mañana, mediodía, atardecer y noche simultáneamente y no sabría cuál seguir. Habilitar solo una a la vez mantiene a la IA bloqueada en la atmósfera correcta.
Paso 3: (Opcional) Sube BGM para las horas del día
Si quieres que cada hora del día tenga su propia música de fondo, sube primero los archivos de audio.
Editor → pestaña Audio → añadir pistas
| ID de pista | Nombre | Tipo | Bucle | Fade In | Fade Out |
|---|---|---|---|---|---|
bgm_morning | Morning Theme | BGM | Sí | 2s | 2s |
bgm_noon | Afternoon Theme | BGM | Sí | 2s | 2s |
bgm_evening | Dusk Theme | BGM | Sí | 2s | 2s |
bgm_night | Night Theme | BGM | Sí | 2s | 2s |
¿No tienes archivos de audio? Omite este paso. El núcleo del ciclo día-noche es el cambio de entradas de lore — la BGM es un bonus agradable. Siempre puedes añadirla después.
En la playlist de BGM, establece autoPlay a true y por defecto a bgm_morning. Cuando la hora del día cambie más tarde, los comportamientos usarán la acción crossfade para una transición suave entre pistas.
Paso 4: Crea comportamientos
Este es el corazón del sistema. Necesitamos 2 comportamientos — bueno, en realidad 6. Sigue leyendo.
Editor → pestaña Behaviors → añade comportamientos uno por uno
Comportamiento 1: Contar cada turno
Este es muy simple — tras cada turno de diálogo, el contador sube en 1.
WHEN (cuándo comprobar):
| Campo | Valor | Por qué |
|---|---|---|
| Trigger type | Every turn | Se dispara automáticamente tras cada intercambio jugador-IA |
DO (qué hacer):
| Tipo de acción | Configuración | Efecto |
|---|---|---|
| Modificar variable | turn_counter add 1 | Contador +1 |
Esa es la única acción. Sin condiciones, sin configuración extra. Fielmente añade 1 cada turno.
¿Por qué no comprobar "¿ya llegó a 3?" aquí mismo? Porque la filosofía de diseño del sistema de comportamientos es un comportamiento, una tarea. Incrementar el contador es el trabajo de un comportamiento; comprobar si llegó a 3 es el trabajo de otro. El motor los encadena automáticamente — tras incrementar el contador, si el valor cruza el umbral, el otro comportamiento se dispara.
Comportamiento 2: Avanzar la hora del día
Este comportamiento se dispara cuando el contador llega a 3 y ejecuta toda la lógica de cambio.
WHEN (cuándo comprobar):
| Campo | Valor | Por qué |
|---|---|---|
| Trigger type | Variable crossed threshold | Se dispara cuando turn_counter sube por encima del umbral |
| Variable | turn_counter | La variable que estamos vigilando |
| Direction | Rises above | Se dispara cuando el valor pasa de estar por debajo del umbral a por encima |
| Threshold | 2 | Se dispara cuando turn_counter va de 2 a 3 (sube por encima de 2) |
¿Por qué el umbral es 2, no 3? La dirección "rises above" en
variable-crosseddetecta el momento en que un valor pasa de <= umbral a > umbral. Cuando turn_counter va de 2 a 3, "rises above 2" — es decir, va de <=2 a >2. Si pones el umbral a 3, necesitarías que turn_counter pase de 3 a 4 antes de dispararse, y eso no es lo que queremos.
DO (qué hacer):
Este comportamiento necesita hacer mucho. Añade estas acciones en orden:
| # | Tipo de acción | Configuración | Efecto |
|---|---|---|---|
| 1 | Modificar variable | turn_counter set a 0 | Reinicia el contador para la siguiente cuenta atrás de 3 turnos |
| 2 | Deshabilitar entrada de lore | Morning Atmosphere | Apaga todas las entradas de las horas del día |
| 3 | Deshabilitar entrada de lore | Noon Atmosphere | Apaga todas |
| 4 | Deshabilitar entrada de lore | Evening Atmosphere | Apaga todas |
| 5 | Deshabilitar entrada de lore | Night Atmosphere | Apaga todas |
Espera — eso apaga las cuatro. ¿Cómo sabe cuál habilitar?
Buena pregunta. Aquí es donde entran en juego las condiciones ONLY IF para la ramificación. Pero un único comportamiento solo puede tener un conjunto de acciones. Así que dividimos "avanzar la hora del día" en 5 comportamientos: 1 para reiniciar el contador y deshabilitar todas las entradas, y 4 para habilitar la hora del día correspondiente.
Déjame reorganizar:
Lista completa de comportamientos (6 en total):
Comportamiento 1: Contar cada turno
(Igual que arriba — no se repite.)
Comportamiento 2: Avanzar — Mañana → Mediodía
WHEN:
| Campo | Valor |
|---|---|
| Trigger type | Variable crossed threshold |
| Variable | turn_counter |
| Direction | Rises above |
| Threshold | 2 |
ONLY IF:
| Variable | Operador | Valor |
|---|---|---|
time_period | igual (eq) | Morning |
DO:
| # | Tipo de acción | Configuración | Efecto |
|---|---|---|---|
| 1 | Modificar variable | turn_counter set a 0 | Reinicia el contador |
| 2 | Modificar variable | time_period set a Noon | Avanza a la siguiente hora del día |
| 3 | Deshabilitar entrada de lore | Morning Atmosphere | Apaga la entrada de la hora del día antigua |
| 4 | Habilitar entrada de lore | Noon Atmosphere | Enciende la entrada de la nueva hora del día |
| 5 | Reproducir música | bgm_noon, acción: crossfade, duración 3s | Crossfade a la BGM del mediodía |
| 6 | Tell AI | Contenido: El tiempo ha avanzado de Mañana a Mediodía. Refleja naturalmente este cambio de tiempo en tus próximas descripciones. | Permite a la IA una transición suave |
Comportamiento 3: Avanzar — Mediodía → Atardecer
WHEN: Igual que el Comportamiento 2 (variable crossed threshold, turn_counter sube por encima de 2)
ONLY IF:
| Variable | Operador | Valor |
|---|---|---|
time_period | igual (eq) | Noon |
DO:
| # | Tipo de acción | Configuración | Efecto |
|---|---|---|---|
| 1 | Modificar variable | turn_counter set a 0 | Reinicia el contador |
| 2 | Modificar variable | time_period set a Evening | Avanza a Atardecer |
| 3 | Deshabilitar entrada de lore | Noon Atmosphere | Apaga la entrada del mediodía |
| 4 | Habilitar entrada de lore | Evening Atmosphere | Enciende la entrada del atardecer |
| 5 | Reproducir música | bgm_evening, acción: crossfade, duración 3s | Crossfade BGM |
| 6 | Tell AI | Contenido: El tiempo ha avanzado de Mediodía a Atardecer. Refleja naturalmente este cambio de tiempo en tus próximas descripciones. | Transición de IA |
Comportamiento 4: Avanzar — Atardecer → Noche
WHEN: Igual que arriba
ONLY IF:
| Variable | Operador | Valor |
|---|---|---|
time_period | igual (eq) | Evening |
DO:
| # | Tipo de acción | Configuración | Efecto |
|---|---|---|---|
| 1 | Modificar variable | turn_counter set a 0 | Reinicia el contador |
| 2 | Modificar variable | time_period set a Night | Avanza a Noche |
| 3 | Deshabilitar entrada de lore | Evening Atmosphere | Apaga la entrada del atardecer |
| 4 | Habilitar entrada de lore | Night Atmosphere | Enciende la entrada de la noche |
| 5 | Reproducir música | bgm_night, acción: crossfade, duración 3s | Crossfade BGM |
| 6 | Tell AI | Contenido: El tiempo ha avanzado de Atardecer a Noche. Refleja naturalmente este cambio de tiempo en tus próximas descripciones. | Transición de IA |
Comportamiento 5: Avanzar — Noche → Mañana
WHEN: Igual que arriba
ONLY IF:
| Variable | Operador | Valor |
|---|---|---|
time_period | igual (eq) | Night |
DO:
| # | Tipo de acción | Configuración | Efecto |
|---|---|---|---|
| 1 | Modificar variable | turn_counter set a 0 | Reinicia el contador |
| 2 | Modificar variable | time_period set a Morning | Cicla de vuelta a Mañana |
| 3 | Deshabilitar entrada de lore | Night Atmosphere | Apaga la entrada de la noche |
| 4 | Habilitar entrada de lore | Morning Atmosphere | Enciende la entrada de la mañana |
| 5 | Reproducir música | bgm_morning, acción: crossfade, duración 3s | Crossfade BGM |
| 6 | Tell AI | Contenido: El tiempo ha avanzado de Noche a Mañana — un nuevo día comienza. Refleja naturalmente este cambio de tiempo en tus próximas descripciones. | Transición de IA |
¿Por qué dividir en 4 comportamientos? Porque cada transición de hora del día necesita habilitar una entrada diferente y reproducir una BGM diferente. Un único comportamiento solo puede tener un conjunto de condiciones y un conjunto de acciones — no soporta ramificación if-else. Así que usamos 4 comportamientos con diferentes condiciones ONLY IF para simular la ramificación: cuando se dispara el mismo disparador (contador sube por encima de 2), el motor los comprueba todos, pero solo el que coincide con
time_periodse ejecutará.
Comportamiento 6: Inicialización de sesión
Este comportamiento establece el estado inicial cuando comienza una sesión, asegurando que las variables estén en los valores iniciales correctos para nuevas sesiones o reentradas.
WHEN:
| Campo | Valor | Por qué |
|---|---|---|
| Trigger type | Session start (session-start) | Se dispara una vez automáticamente cuando comienza una nueva sesión |
DO:
| # | Tipo de acción | Configuración | Efecto |
|---|---|---|---|
| 1 | Modificar variable | time_period set a Morning | Asegura que empiece en Mañana |
| 2 | Modificar variable | turn_counter set a 0 | Reinicia el contador de turnos |
¿Por qué necesitamos un comportamiento de inicialización de sesión? Los valores predeterminados de las variables solo surten efecto cuando se crean por primera vez. Si un jugador sale a mitad de sesión e inicia una nueva, las variables podrían retener sus valores anteriores (por ejemplo,
time_periodatascado en "Night",turn_counteratascado en 2). El comportamiento de inicialización de sesión asegura que cada nueva sesión empiece desde Mañana con el contador en 0.
Prioridad de comportamientos
Los 4 comportamientos de avance pueden mantener la prioridad predeterminada (0). Sus condiciones ONLY IF son mutuamente exclusivas — la hora del día actual solo puede coincidir con uno de ellos, así que no hay conflicto.
Paso 5: Añade el distintivo de tiempo al Root Component
Muestra el icono de la hora del día actual en el último mensaje del chat, para que el jugador siempre sepa de un vistazo qué hora es.
Editor → sección Custom UI → abre index.tsx → pega lo siguiente (reemplaza el predeterminado return <Chat />):
export default function MyWorld() {
const api = useYumina();
// ---- Lee la variable ----
const timePeriod = String(api.variables.time_period || "Morning");
// ---- Icono y mapa de colores por hora ----
const timeConfig = {
"Morning": { icon: "☀️", label: "Morning", color: "#fbbf24", bg: "rgba(251,191,36,0.15)" },
"Noon": { icon: "🌤️", label: "Noon", color: "#f59e0b", bg: "rgba(245,158,11,0.15)" },
"Evening": { icon: "🌅", label: "Evening", color: "#f97316", bg: "rgba(249,115,22,0.15)" },
"Night": { icon: "🌙", label: "Night", color: "#818cf8", bg: "rgba(129,140,248,0.15)" },
};
const current = timeConfig[timePeriod] || timeConfig["Morning"];
const msgs = api.messages || [];
return (
<Chat renderBubble={(msg) => {
const isLastMsg = msg.messageIndex === msgs.length - 1;
return (
<div>
{/* Renderiza el texto del mensaje normalmente — contentHtml ya es HTML renderizado */}
<div
style={{ color: "#e2e8f0", lineHeight: 1.7 }}
dangerouslySetInnerHTML={{ __html: msg.contentHtml }}
/>
{/* Distintivo de hora — solo en el último mensaje */}
{isLastMsg && (
<div style={{
display: "inline-flex",
alignItems: "center",
gap: "6px",
marginTop: "12px",
padding: "4px 12px",
background: current.bg,
border: `1px solid ${current.color}33`,
borderRadius: "999px",
fontSize: "13px",
color: current.color,
fontWeight: "600",
}}>
<span style={{ fontSize: "16px" }}>{current.icon}</span>
<span>{current.label}</span>
</div>
)}
</div>
);
}} />
);
}Desglose línea por línea:
api.variables.time_period— lee la variable de la hora del día actualtimeConfig— una tabla de búsqueda que mapea cada hora del día a un icono, etiqueta de texto y color. Siéntete libre de cambiar los colores para que coincidan con el estilo de tu mundoisLastMsg— solo muestra el distintivo en el último mensaje, no en cada mensaje- El distintivo usa
inline-flex+border-radius: 999pxpara una forma de píldora — sutil pero inmediatamente visible
¿Quieres mostrar el tiempo en cada mensaje?
Quita la comprobación {isLastMsg && ...} y pon el distintivo directamente en el return. Cada mensaje llevará entonces un sello de tiempo, como las marcas de tiempo en un registro de chat.
Paso 6: Guarda y prueba
- Haz clic en Save en la parte superior del editor
- Haz clic en Start Game o vuelve a la página de inicio y abre una nueva sesión
- Chatea normalmente con la IA. Durante los primeros 2 turnos, el distintivo de tiempo muestra "☀️ Morning" y nada cambia
- Tras el turno 3 — el tiempo avanza a "🌤️ Noon", y la próxima respuesta de la IA refleja naturalmente el cambio de tiempo
- 3 turnos más — avanza a "🌅 Evening"
- 3 turnos más — avanza a "🌙 Night". Si configuraste BGM, deberías escuchar el crossfade
- 3 turnos más — cicla de vuelta a "☀️ Morning", comienza un nuevo día
Si algo sale mal:
| Síntoma | Causa probable | Solución |
|---|---|---|
| El tiempo nunca cambia | El comportamiento "Count each turn" no se está disparando | Comprueba que el disparador del Comportamiento 1 esté establecido en "Every turn" y el comportamiento esté habilitado |
| No hay cambio en el turno 3 | El umbral es incorrecto | Confirma que el umbral de "variable crossed threshold" sea 2 (no 3), dirección "rises above" |
| Las entradas no cambian tras el cambio | Los nombres de las entradas no coinciden | Comprueba que las acciones "Enable lore entry" / "Disable lore entry" en tus comportamientos hagan referencia a los nombres correctos de las entradas |
| Los 4 comportamientos se disparan a la vez | Faltan las condiciones ONLY IF | Cada comportamiento de avance debe tener una condición ONLY IF que restrinja el valor actual de time_period |
| Distintivo de tiempo no visible | Error de sintaxis en el Root Component | Comprueba el estado de compilación en la parte inferior del panel Custom UI — debería mostrar un "OK" verde |
| La BGM no cambia | ID de pista no coincide o no hay audio subido | Confirma que el trackId en el comportamiento coincida con el ID de pista en la pestaña Audio |
Comparación del Enfoque B: usando el disparador turn-count
Si el Enfoque A te parece demasiados comportamientos, puedes usar el Enfoque B más simple.
Diferencias:
| Enfoque A (esta receta) | Enfoque B | |
|---|---|---|
| Disparadores | every-turn + variable-crossed | turn-count (everyNTurns=3) |
Necesita variable turn_counter | Sí | No |
| Número de comportamientos | 6 (1 conteo + 4 avance + 1 inicialización opcional) | 4 (4 avance) |
| Flexibilidad | Alta (el intervalo se puede ajustar dinámicamente) | Baja (intervalo fijo en N) |
| Mejor para | Mundos que necesitan velocidad de flujo de tiempo dinámica | Mundos con un ritmo fijo |
Cómo hacer el Enfoque B:
Elimina la variable turn_counter y el comportamiento "Count each turn". Cambia el disparador en los 4 comportamientos de avance a:
| Campo | Valor |
|---|---|
| Trigger type | Every N turns |
| everyNTurns | 3 |
Todo lo demás (condiciones ONLY IF, acciones DO) se mantiene exactamente igual que el Enfoque A. El disparador turn-count se dispara automáticamente cada 3 turnos — no se necesita conteo manual.
Cómo funciona el disparador
turn-count: El motor mantiene un conteo de turnos global interno. Cuando estableceseveryNTurns: 3, el motor dispara automáticamente el comportamiento en los turnos 3, 6, 9, 12 y así sucesivamente. No necesitas gestionar tú mismo una variable de contador.
Referencia rápida
| Qué quieres | Cómo hacerlo |
|---|---|
| Hacer algo cada turno | Disparador del comportamiento: "Every turn" (every-turn) |
| Hacer algo cada N turnos | Disparador del comportamiento: "Every N turns" (turn-count), establece everyNTurns |
| Detectar que una variable cruza un valor | Disparador del comportamiento: "Variable crossed threshold" (variable-crossed), establece variable, dirección y umbral |
| Cambiar entradas de lore | Acciones: "Enable lore entry" / "Disable lore entry" |
| Crossfade de música | Acción: "Play music", operación: crossfade, establece duración de fade |
| Hacer saber a la IA que algo pasó | Acción: "Tell AI", escribe una instrucción de sistema temporal |
| Mostrar un distintivo de estado en un mensaje | Lee una variable dentro del <Chat renderBubble> del Root Component y renderiza con JSX |
| Simular ramificación if-else | Múltiples comportamientos compartiendo el mismo disparador + diferentes condiciones ONLY IF |
Pruébalo tú mismo — mundo demo importable
Descarga este JSON e impórtalo como un nuevo mundo para ver todo en acción:
Cómo importar:
- Ve a Yumina → My Worlds → Create New World
- En el editor, haz clic en More Actions → Import Package
- Selecciona el archivo
.jsondescargado - Se crea un nuevo mundo con todas las variables, entradas, comportamientos y el Root Component preconfigurados
- Inicia una nueva sesión y pruébalo
Qué incluye:
- 2 variables (
time_periodsigue la hora del día actual,turn_countercomo contador de turnos) - 4 entradas de lore (atmósfera de Mañana / Mediodía / Atardecer / Noche, solo Mañana habilitada por defecto)
- 6 comportamientos (1 de conteo por turno + 4 de avance de hora del día + 1 de inicialización de sesión)
- Un Root Component (distintivo de icono de la hora del día en
<Chat renderBubble>) - 4 pistas de BGM (tendrás que subir tus propios archivos de audio para reemplazar las URLs)
Esta es la Receta #9
Esta receta muestra el poder del encadenamiento del sistema de comportamientos — con un simple contador + disparador de umbral + ramificación condicional, puedes construir un sistema de tiempo totalmente automático. El mismo patrón funciona para cambios de clima, ciclos estacionales, cambios de humor de NPCs, o cualquier otra cosa que "cambie automáticamente en un ritmo".
