SecuenciadorDeEventos es un potente marco que te permite construir eventos y escenas cortas en vivo, a través de una secuencia estructurada de acciones y disparadores. Más específicamente, este módulo te ayuda a:
- Construir un evento o escena corta en un marco estructurado a través de configuraciones programadas de audio, animaciones y tweens.
- Transitar entre múltiples escenas a través de múltiples servidores, sincronizando animaciones y visuales complejos a una línea de tiempo.
- Buscar a través de un evento y previsualizar la experiencia para pruebas y propósitos de desarrollo.
Este marco ha sido probado en eventos de Roblox como los conciertos de Twenty One Pilots y 24kGoldn, así como en muchas experiencias de alta afluencia.
Para ver SecuenciadorDeEventos en acción dentro de un lugar editable, consulta la plantilla de Concierto en Roblox Studio. Esta plantilla es un punto de partida completo para que los desarrolladores creen eventos/conciertos y se familiaricen con las diversas características y componentes involucrados.

Uso del módulo
Instalación
Para utilizar el marco SecuenciadorDeEventos en una experiencia:
Desde el menú Ventana de Studio o la barra de herramientas de la pestaña Inicio, abre el Toolbox y selecciona la pestaña Tienda del Creador.

Asegúrate de que la opción de ordenación Modelos esté seleccionada, luego haz clic en el botón Ver Todo para Categorías.

Localiza y haz clic en el mosaico Paquetes.
Localiza el módulo Secuenciador de Eventos y haz clic en él, o arrástralo y suéltalo en la vista 3D.

En la ventana del Explorador, mueve el modelo completo SecuenciadorDeEventos a ServerScriptService. Al ejecutar la experiencia, el módulo comenzará a funcionar.
Modos del marco
Modo de reemplazo
El modo de marco predeterminado es modo de reemplazo, en el que diseñarás escenas únicas escenas colocando objetos 3D, terrain, propiedades de iluminación, efectos ambientales y objetos de interfaz de usuario en la carpeta Entorno de esa escena. Cuando una escena se carga, esos objetos y propiedades se distribuyen en Workspace, Terrain y Lighting, reemplazando objetos/propiedades existentes para formar un espacio clonado.
Modo en línea
Un modo de marco alternativo es el modo en línea, en el que igualmente diseñarás escenas únicas escenas con lógica de scripting para su flujo/eventos, pero el marco no destruirá objetos 3D, terrain, propiedades de iluminación, efectos ambientales, y objetos de interfaz de usuario para clonar activos/propiedades desde la carpeta Entorno de una escena al cargar.
Para habilitar el modo en línea:
Dentro del modelo SecuenciadorDeEventos que colocaste en ServerScriptService, profundiza y selecciona el valor En Línea dentro de la carpeta ReplicatedStorage.

En la ventana de Propiedades, activa la casilla de verificación Valor.

Crear escenas
Una escena es esencialmente parte de un evento general o una escena corta envuelta en una serie de carpetas. Cada escena contiene una lógica de scripting que define su flujo/eventos, y una escena puede almacenar sus propios objetos 3D, terrain, propiedades de iluminación, efectos ambientales y objetos de interfaz de usuario.
Para empezar rápidamente, puedes encontrar una escena vacía dentro de la carpeta principal del módulo:
Expande la carpeta SecuenciadorDeEventos y localiza la carpeta EscenaEnBlanco.

Mueve o copia toda la carpeta EscenaEnBlanco dentro de ReplicatedStorage.

Duración
Cada escena debe tener una duración, en segundos, que defina su duración — así como una película o concierto tiene una duración determinada. La duración se define como un atributo numérico en la carpeta de la escena llamada Duración que puedes establecer directamente en Studio o programáticamente a través de Instance:SetAttribute().


Entorno
La carpeta Entorno de una escena contiene todo lo que los usuarios ven y oyen, incluyendo objetos 3D, terrain, propiedades de iluminación y efectos ambientales, y objetos de interfaz de usuario. Cuando una escena se carga, esos objetos y propiedades se distribuyen en Workspace, Terrain y Lighting, reemplazando objetos/propiedades existentes para formar un espacio clonado.
La carpeta Entorno contiene los siguientes contenedores:
| Contenedor | Descripción |
|---|---|
| Cliente | Contiene todos los activos que cargar cuando cualquier usuario (cliente) se une al evento, como objetos de interfaz de usuario o un rig de animación. |
| GeneraciónDeJugadores | Contiene partes donde los usuarios aparecen al unirse. Cualquier parte en esta carpeta se comporta de manera similar a un SpawnLocation. |
| Servidor | Contiene todos los activos que cargar cuando una escena se crea por primera vez en un servidor. Se recomienda que la mayoría de los activos visuales vayan aquí. |
| Terreno | Contiene terreno de la escena. |
| Iluminación | Contiene propiedades de iluminación globales como atributos, así como modificadores como efectos atmosféricos y efectos de post-procesamiento. |
Eventos
La carpeta Eventos de una escena es puramente un marcador para RemoteEvents que se comunican entre los módulos del Cliente y Servidor. No es un requisito colocar nada en esta carpeta.
Cliente
Este script ejecuta lógica de esquema en el cliente.
Servidor
Este script ejecuta lógica de esquema en el servidor.
Esquemas de escena
El esquema de una escena define qué sucede en qué punto de la línea de tiempo de la escena. Debes definir el esquema de una escena en ambos, sus módulos de Cliente y Servidor, e incluir ganchos de ciclo de vida para gestionar cuándo ocurren las configuraciones.
Ganchos de ciclo de vida
Los ganchos de ciclo de vida del esquema te permiten gestionar cuándo ocurren las operaciones de la escena. Una escena en producción normalmente funcionará en el flujo más simple:
EnEjecución puede ser interrumpida al buscar:
Los tres ganchos también pueden repetirse si la escena se vuelve a reproducir:
- EnConfiguración → EnEjecución → EnFinEscena… reproducir → EnConfiguración → EnEjecución → EnFinEscena
Configuraciones
Las configuraciones del esquema definen las operaciones esenciales de una escena, por ejemplo reproducir audio a las 00:32, encolar una animación para sincronizarse con ese audio, programar un evento de escena como un espectáculo de fuegos artificiales, y más. Cada configuración admite ciertas funciones de callback donde el primer parámetro (self) es la instancia de configuración.
Buscar escenas
Una característica única de SecuenciadorDeEventos es la capacidad de "buscar" alrededor de escenas como podrías buscar a través de un video. En Modo de Reemplazo, también puedes cambiar entre escenas para previsualizar un evento de múltiples escenas antes de implementarlo en producción.
La búsqueda de escenas no es accesible para todos ya que los usuarios que simplemente disfrutan del evento no deben tener la capacidad de controlar su flujo de tiempo. En su lugar, debes otorgar permiso de búsqueda basado en el PlaceId del evento, así como en UserIds específicos y/o grupos y roles dentro de ellos.
Crea un nuevo Script dentro de ServerScriptService.
Pega el siguiente código en el nuevo script.
Script - Establecer Permisos de Búsquedalocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))SecuenciadorDeEventos.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})Completa las siguientes tablas dentro de la llamada a setSeekingPermissions de la siguiente manera:
placeIDs Lista delimitada por comas de valores de PlaceId para soportar búsqueda dentro. userIDs Lista delimitada por comas de UserIds para aquellos que pueden buscar dentro de los lugares soportados. groups Lista delimitada por comas de tablas, cada una conteniendo un ID de grupo y el rango mínimo de los miembros de ese grupo que pueden buscar dentro de los lugares soportados.
Plugin de gestor de escenas
El plugin Gestor de Escenas es una herramienta útil para cargar y descargar escenas, iluminación y terreno. A menos que estés usando Modo en Línea, se recomienda encarecidamente que uses este plugin en lugar de colocar/editar manualmente objetos y propiedades de la escena.
Para instalar el plugin:
Desde el menú Ventana de Studio o la barra de herramientas de la pestaña Inicio, abre el Toolbox.
Con la pestaña Tienda del Creador seleccionada, escoge Plugins del menú desplegable.
En el campo de búsqueda, escribe Gestor de Escenas y presiona Enter para localizar el plugin.

Haz clic en el icono del plugin para ver sus detalles y luego haz clic en el botón Instalar.
Una vez que el plugin esté instalado, aparece en la pestaña Plugins de Studio.
Cargar y descargar escenas
Como se describe en crear escenas, la carpeta Entorno de una escena contiene todo lo que los usuarios ven y oyen, incluyendo objetos 3D. El plugin te ayuda a cargar rápidamente los activos de una escena dentro o fuera de carpetas organizadas dentro del espacio de trabajo.
| Acción del plugin | Descripción |
|---|---|
| Cargar Cliente | Si el contenido del cliente de la escena está descargado, mueve su carpeta Entorno/Cliente a la carpeta Workspace/ScenesClient. |
| Cargar Servidor | Si el contenido del servidor de la escena está descargado, mueve su carpeta Entorno/Servidor a la carpeta Workspace/ScenesServer. |
| Descargar Cliente | Si el contenido del cliente de la escena está cargado, mueve su carpeta Cliente de Workspace/ScenesClient de vuelta a la carpeta [Escena]/Entorno. |
| Descargar Servidor | Si el contenido del servidor de la escena está cargado, mueve su carpeta Servidor de Workspace/ScenesServer de vuelta a la carpeta [Escena]/Entorno. |
| Descargar Todas las Escenas | Mueve la carpeta Cliente y Servidor de cada escena cargada de vuelta a su carpeta Entorno. |
Guardar y cargar iluminación
El servicio Lighting de nivel superior almacena todas las propiedades de iluminación y efectos visuales de un lugar. Dado que es un servicio de nivel superior, no puedes moverlo manualmente a la carpeta Entorno/Servidor o Entorno/Cliente de una escena en particular. En su lugar, puedes utilizar el plugin para copiar sus propiedades e hijos a la carpeta Entorno/Iluminación de la escena.
Configura las propiedades de iluminación, efectos de post-procesamiento, efectos atmosféricos y skyboxes de la escena a través del servicio Lighting de nivel superior.

En la ventana del plugin Gestor de Escenas, haz clic en Guardar Iluminación para la escena deseada.
Selecciona y expande la Iluminación de la escena en la configuración de Entorno, y verás las mismas propiedades de iluminación como atributos de la carpeta, así como hijos clonados del servicio Lighting de nivel superior.

Instancias clonadas 
Atributos guardados Una vez que las propiedades de iluminación e hijos están guardados para una escena, puedes cargarlos rápidamente de vuelta al servicio Lighting de nivel superior haciendo clic en Cargar Iluminación desde la ventana del plugin.
Guardar y cargar terreno
Dado que Terrain es una clase de nivel superior dentro de Workspace, no puedes mover manualmente el terreno generado o esculpido a una carpeta Entorno/Servidor o Entorno/Cliente de una escena en particular. En su lugar, puedes utilizar el plugin para copiarlo a la carpeta Entorno/Terreno de la escena.
Configura el terreno de la escena a través del servicio Terreno de nivel superior.

En la ventana del plugin Gestor de Escenas, haz clic en Guardar Terreno para la escena deseada.
Selecciona y expande la carpeta Terreno de la escena en Entorno y verás un objeto TerrainRegion que representa el terreno guardado.

Una vez que el terreno está guardado para una escena, puedes cargarlo rápidamente de nuevo al servicio Terrain de nivel superior haciendo clic en Cargar Terreno desde la ventana del plugin.
Referencia de API
Ganchos de ciclo de vida del esquema
EnConfiguración
El gancho de ciclo de vida EnConfiguración está destinado a inicializar activos y variables que serán referenciados en EnEjecución o EnFinEscena, estableciendo conexiones que están destinadas a durar durante la duración de la escena, etc. Este gancho recibe el parámetro timePositionObject que te permite leer el tiempo actual en la configuración.
Esquema del Cliente
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
local Esquema = SecuenciadorDeEventos.createSchema()
local entornoCliente
local entornoServidor
local dummy
Esquema.EnConfiguración = function(timePositionObject)
print("EnConfiguración (Cliente)")
-- Acceder a los entornos de la escena; no se aplica al Modo En Línea
entornoCliente = SecuenciadorDeEventos.getCurrentSceneEnvironment()
entornoServidor = SecuenciadorDeEventos.getCurrentServerEnvironmentFromClient()
-- Esperar activos
dummy = entornoCliente:WaitForChild("Dummy")
print("El tiempo actual es:", timePositionObject.Value)
end
Esquema del Servidor
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
local Esquema = SecuenciadorDeEventos.createSchema()
local entornoServidor
local connectionCambioColorParte
local eventoCambioColorParte = script.Parent.Events.ChangePartColor
Esquema.EnConfiguración = function(timePositionObject)
print("EnConfiguración (Servidor)")
-- Acceder al entorno de la escena; no se aplica al Modo En Línea
entornoServidor = SecuenciadorDeEventos.getCurrentSceneEnvironment()
connectionCambioColorParte = eventoCambioColorParte.OnServerEvent:Connect(function(player, changedPart, newColor)
entornoServidor.changedPart.Color = newColor
end)
print("El tiempo actual es:", timePositionObject.Value)
end
EnEjecución
EnEjecución es el gancho de ciclo de vida operativo principal dentro de un esquema. Debe contener todas las configuraciones temporizadas para la escena, desde reproduce audio o una animación hasta programar un evento como un espectáculo de fuegos artificiales.
Esquema del Cliente
Esquema.EnEjecución = function()
print("EnEjecución (Cliente)")
local AudioPrincipal = Esquema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio en reproducción")
end,
OnEnd = function(self)
print("Audio terminado")
end
})
end
EnFinEscena
El gancho de ciclo de vida EnFinEscena es útil para limpiar cualquier cosa pendiente en la escena, como desconectar conexiones creadas en EnConfiguración o EnEjecución que permanecen durante la duración de la escena.
Esquema del Servidor
Esquema.EnFinEscena = function()
print("EnFinEscena (Servidor)")
if connectionCambioColorParte then
connectionCambioColorParte:Disconnect()
connectionCambioColorParte = nil
end
end
Configuraciones de esquema
audio
Crea un objeto de Sound en el espacio de trabajo que se reproduce en un momento determinado. El sonido se elimina después de que la escena ha terminado o después de que el objeto Sound termina de reproducirse.
| Clave de Configuración | Descripción |
|---|---|
| StartTime | Cuándo reproducir el audio en relación con la duración de la escena, en segundos. |
| SoundId | ID de activo del audio para reproducir. |
| OnStart | Función personalizada para disparar cuando el audio comienza a reproducirse. |
| OnEnd | Función personalizada para disparar cuando el audio termina de reproducirse. |
| Volume | Volumen del objeto Sound; el valor predeterminado es 0.5. |
Esquema del Cliente
Esquema.EnEjecución = function()
print("EnEjecución (Cliente)")
local AudioPrincipal = Esquema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
end
animate
Crea una Animation que se reproduce en un momento determinado.
| Clave de Configuración | Descripción |
|---|---|
| StartTime | Cuándo reproducir la animación en relación con la duración de la escena, en segundos. |
| EndTime | Tiempo opcional para finalizar la animación en relación con la duración de la escena, en segundos. |
| Rig | El rig de animación para reproducir la animación. |
| AnimationId | ID de activo de la animación para reproducir. |
| Speed | Velocidad de reproducción de la animación; el valor predeterminado es 1. |
| FadeInTime | Cantidad de tiempo para desvanecer la animación, en segundos; el valor predeterminado es 0.2 (segundos). |
| FadeOutTime | Cantidad de tiempo para desvanecer la animación, en segundos; el valor predeterminado es 0.2 (segundos). |
| OnStart | Función personalizada para disparar cuando la animación comienza a reproducirse. |
| OnEnd | Función personalizada para disparar cuando la animación termina de reproducirse. |
| Looped | Si se debe buclear la animación; el valor predeterminado es false. |
| SyncToAudio | Tabla que define si sincronizar la animación con una configuración de audio. Acepta las siguientes claves:
|
Esquema del Cliente
Esquema.EnEjecución = function()
print("EnEjecución (Cliente)")
local AudioPrincipal = Esquema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local AnimaciónDeBaile = Esquema:animate({
AnimationId = "rbxassetid://3695333486",
Rig = Dummy,
Speed = 1,
FadeInTime = 0.1,
FadeOutTime = 0.3,
SyncToAudio = {
Audio = AudioPrincipal,
StartAtAudioTime = 5,
},
OnStart = function(self)
print("Animación en reproducción")
end,
OnEnd = function(self)
print("Animación detenida")
end
})
end
tween
Crea un Tween configurable que se preserva en la búsqueda y en la unión dinámica, lo que significa que puedes encadenar tweens en puntos separados en el tiempo y todo debe reproducirse y sincronizarse como se espera.
| Clave de Configuración | Descripción |
|---|---|
| StartTimes | Tabla de tiempos de inicio en relación con la duración de la escena, en segundos. |
| Tween | Tabla que define el objeto y las propiedades a tween. Acepta las siguientes claves:
|
| OnStart | Función personalizada para disparar cuando comienza el tween. |
| OnHeartbeat | Función personalizada para disparar en cada Heartbeat; recibe el alfa del tween como su segundo parámetro. |
| OnEnd | Función personalizada para disparar cuando el tween finaliza su reproducción. |
| SyncToAudio | Tabla que define si sincronizar el tween con una configuración de audio. Acepta las siguientes claves:
|
Esquema del Cliente
Esquema.EnEjecución = function()
print("EnEjecución (Cliente)")
local AudioPrincipal = Esquema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local DesvanecimientoDeLuces = Esquema:tween({
StartTimes = {29.884},
Tween = {
Object = game:GetService("Lighting"),
Info = TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.Out),
Properties = {
Brightness = 0,
}
},
SyncToAudio = {
Audio = AudioPrincipal,
StartAtAudioTimes = {5, 7.2, 9.4, 11.6},
},
OnStart = function(self)
print("Tween en reproducción")
end,
OnHeartbeat = function(self, alpha)
print("Alfa del tween", alpha)
end,
OnEnd = function(self)
print("Tween completado")
end,
})
end
interval
Ejecuta una función de callback personalizada a lo largo de una duración especificada a una frecuencia especificada, en segundos. Útil para eventos repetidos como luces parpadeantes, pulsando la intensidad de un audio, etc. La frecuencia más baja posible es de 0 segundos, pero técnicamente la frecuencia mínima siempre se ajusta a Heartbeat.
| Clave de Configuración | Descripción |
|---|---|
| StartTime | Inicio de la duración del intervalo en relación con la duración de la escena, en segundos. |
| EndTime | Fin de la duración del intervalo en relación con la duración de la escena, en segundos. |
| Frequency | Con qué frecuencia debe dispararse la función OnInterval, en segundos, siendo la primera ejecución en StartTime. |
| OnStart | Función personalizada para disparar cuando comienza la serie de intervalos. |
| OnInterval | Función personalizada para disparar en cada intervalo dentro de la duración especificada (StartTime a EndTime). |
| OnEnd | Función personalizada para disparar cuando finaliza la serie de intervalos. |
| SyncToAudio | Tabla que define si sincronizar la duración del intervalo con una configuración de audio. Acepta las siguientes claves:
|
Esquema del Cliente
Esquema.EnEjecución = function()
print("EnEjecución (Cliente)")
local AudioPrincipal = Esquema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local ActualizaciónDeTemporizadorCliente = Esquema:interval({
Frequency = 1,
SyncToAudio = {
StartAtAudioTime = 2.5,
EndAtAudioTime = 10,
Audio = AudioPrincipal
},
OnInterval = function(self)
print(AudioPrincipal.Sound.TimePosition, AudioPrincipal.CurrentSoundIntensityRatio)
end,
})
end
schedule
Similar a interval excepto que puedes definir múltiples tiempos de inicio específicos para el mismo evento, como programar un espectáculo de fuegos artificiales dos veces en una escena.
| Clave de Configuración | Descripción |
|---|---|
| StartTimes | Tabla de tiempos de inicio en relación con la duración de la escena, en segundos. |
| OnStart | Función personalizada para disparar en cada tiempo especificado en la tabla StartTimes. |
| Skippable | Booleano que define si el evento programado puede ser omitido para los usuarios que se unen tarde, o para cuando se busca un tiempo de inicio programado por adelantado. Si se establece en false, todos los tiempos de inicio de eventos programados antes de la unión/búsqueda sucederán en ese tiempo de unión/búsqueda. Si se establece en true, solo sucederán los tiempos de inicio programados después de la unión/búsqueda. El valor predeterminado es false. |
| SyncToAudio | Tabla que define si sincronizar el horario con una configuración de audio. Acepta las siguientes claves:
|
Esquema del Cliente
Esquema.EnEjecución = function()
print("EnEjecución (Cliente)")
Esquema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Inicializar conexión de latido temporal
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Informar al marco de la conexión
Esquema:inform(tempConnection)
end
})
end
inform
Informa al marco sobre cualquier módulo, objetos de UI, conexiones, etc. que se crean en el gancho de ciclo de vida EnEjecución, asegurando que se limpien adecuadamente cuando se busca. Los casos de uso incluyen:
Informar al marco sobre una conexión ad-hoc temporal como RunService.Heartbeat para que la conexión se limpie al buscar a un punto anterior en la duración de la escena.
Esquema del ServidorEsquema.EnEjecución = function()print("EnEjecución (Servidor)")Esquema:schedule({StartTimes = {5},OnStart = function(self)-- Inicializar conexión de latido temporallocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Informar al marco de la conexiónEsquema:inform(tempConnection)end})endLlamar a una función de "limpieza" personalizada en un ModuleScript que inicializa una conexión u otra referencia durante el gancho de ciclo de vida EnEjecución.
Esquema del Servidorlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local RunService = game:GetService("RunService")local moduloPersonalizado = require(ReplicatedStorage:WaitForChild("CustomModule"))local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))local Esquema = SecuenciadorDeEventos.createSchema()Esquema.EnEjecución = function()print("EnEjecución (Servidor)")Esquema:schedule({StartTimes = {5},OnStart = function(self)-- Llama a la función "init" en el módulo personalizadomoduloPersonalizado.init()-- Llama a la función "clean" en el módulo personalizado en la limpieza de la escenaEsquema:inform(moduloPersonalizado, moduloPersonalizado.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local MóduloPersonalizado = {}MóduloPersonalizado.init = function()-- Inicializar conexión de latidoMóduloPersonalizado.connection = RunService.Heartbeat:Connect(function()end)endMóduloPersonalizado.clean = function()-- Desconectar y limpiar conexión de latidoif MóduloPersonalizado.connection thenMóduloPersonalizado.connection:Disconnect()MóduloPersonalizado.connection = nilendendreturn MóduloPersonalizado
Funciones
loadScene
loadScene(sceneName: string, startTime: number ?)
Carga programáticamente una escena por sceneName y comienza en startTime desde su inicio. Habrá un período de "gracia" de 5 segundos para que la escena se cargue desde el servidor antes de que ocurra la búsqueda y la escena comience a reproducirse. Esto significa que si llamas a loadScene("[SceneName]", 20) exactamente a las 4:15:00 PM, el marco esperará 5 segundos además de los 20 solicitados, iniciando la escena a las 4:15:25 PM.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Determina la próxima escena a cargar cuando la escena actual termine
SecuenciadorDeEventos.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" terminó; carga la primera escena del concierto
SecuenciadorDeEventos.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" terminó; carga la segunda escena del concierto
SecuenciadorDeEventos.loadScene("Track2")
else
-- Regresar a la escena del pre-espectáculo
SecuenciadorDeEventos.loadScene("PreShow")
end
end)
createSchema
createSchema(): table
Devuelve una instancia del esquema de la escena para crear lógica para la escena.
Esquema del Cliente
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
local Esquema = SecuenciadorDeEventos.createSchema()
Esquema.EnConfiguración = function(timePositionObject)
print("EnConfiguración (Cliente)")
end
seek
seek(time: number)
Busca el valor de time, en segundos, desde el comienzo de la escena actualmente cargada.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))SecuenciadorDeEventos.seek(95.58)
setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
Establece la cantidad de tiempo desde el fin de todas las escenas en la que se envía una advertencia. Puedes detectar la advertencia ya sea del lado del cliente a través de onSceneEndingWarningForClient o del lado del servidor a través de onSceneEndingWarningForServer.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Carga la escena
SecuenciadorDeEventos.loadScene("BeautifulScene")
-- Establece el tiempo de advertencia a 5 segundos antes de que termine la escena
SecuenciadorDeEventos.setSceneWarningTime(5)
-- Detecta cuando la escena está a punto de terminar
SecuenciadorDeEventos.onSceneEndingWarningForServer:Connect(function()
warn("¡La escena está a punto de terminar!")
end)
setSeekingPermissions
setSeekingPermissions(permissions: table)
Otorga permiso de búsqueda basado en el PlaceId del evento, así como en UserIds específicos y/o en grupos y roles dentro de ellos. Consulta buscar y cambiar escenas para más información.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
Devuelve la carpeta de Entorno actual de la escena, del lado del cliente o servidor, dependiendo de si se llama desde el script del esquema del Cliente o del Servidor respectivamente.
Esquema del Cliente
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
local Esquema = SecuenciadorDeEventos.createSchema()
local entornoCliente
local entornoServidor
Esquema.EnConfiguración = function(timePositionObject)
print("EnConfiguración (Cliente)")
-- Acceder a los entornos de la escena; no se aplica al Modo En Línea
entornoCliente = SecuenciadorDeEventos.getCurrentSceneEnvironment()
entornoServidor = SecuenciadorDeEventos.getCurrentServerEnvironmentFromClient()
print("El tiempo actual es:", timePositionObject.Value)
end
Esquema del Servidor
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
local Esquema = SecuenciadorDeEventos.createSchema()
local entornoServidor
local connectionCambioColorParte
local eventoCambioColorParte = script.Parent.Events.ChangePartColor
Esquema.EnConfiguración = function(timePositionObject)
print("EnConfiguración (Servidor)")
entornoServidor = SecuenciadorDeEventos.getCurrentSceneEnvironment()
connectionCambioColorParte = eventoCambioColorParte.OnServerEvent:Connect(function(player, changedPart, newColor)
entornoServidor.changedPart.Color = newColor
end)
end
getCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
Devuelve la carpeta de Entorno de la escena del lado del servidor actual. A diferencia de getCurrentSceneEnvironment, puedes llamar a esto desde el script del esquema del Cliente.
Esquema del Cliente
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
local Esquema = SecuenciadorDeEventos.createSchema()
local entornoCliente
local entornoServidor
Esquema.EnConfiguración = function(timePositionObject)
print("EnConfiguración (Cliente)")
-- Acceder a los entornos de la escena; no se aplica al Modo En Línea
entornoCliente = SecuenciadorDeEventos.getCurrentSceneEnvironment()
entornoServidor = SecuenciadorDeEventos.getCurrentServerEnvironmentFromClient()
print("El tiempo actual es:", timePositionObject.Value)
end
isLoadingScene
isLoadingScene(): boolean
Se llama desde el servidor para saber si una escena se está cargando actualmente.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))print(SecuenciadorDeEventos.isLoadingScene())while SecuenciadorDeEventos.isLoadingScene() dotask.wait()endprint("Escena cargada")
Eventos
onSceneEndingWarningForClient
Se activa en el cliente antes de que la escena esté a punto de terminar. El tiempo predeterminado es 3 segundos, pero puedes configurarlo a través de setSceneWarningTime. Este evento solo se puede conectar en un LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Detectar cuando la escena está a punto de terminar (del lado del cliente)
SecuenciadorDeEventos.onSceneEndingWarningForClient:Connect(function()
warn("¡La escena está a punto de terminar!")
end)
onSceneEndingWarningForServer
Se activa en el servidor antes de que la escena esté a punto de terminar. El tiempo predeterminado es 3 segundos, pero puedes configurarlo a través de setSceneWarningTime. Este evento solo se puede conectar en un Script.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Detectar cuando la escena está a punto de terminar (del lado del servidor)
SecuenciadorDeEventos.onSceneEndingWarningForServer:Connect(function()
warn("¡La escena está a punto de terminar!")
end)
onSceneLoadedForClient
Se activa en el cliente cuando la escena está comenzando. Este evento solo se puede conectar en un LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Detectar cuándo está comenzando la escena (del lado del cliente)
SecuenciadorDeEventos.onSceneLoadedForClient:Connect(function()
warn("¡La escena está comenzando!")
end)
onOrchestrationFinished
Se activa en el servidor cuando una escena ha alcanzado su longitud de tiempo y ha terminado efectivamente. Este evento recibe un argumento de nombre de cadena endedSceneName para la escena que acaba de terminar y puedes encadenar este evento para cargar condicionalmente otra escena. Solo puede conectarse en un Script.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Determina la próxima escena a cargar cuando la escena actual termine
SecuenciadorDeEventos.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" terminó; carga la primera escena del concierto
SecuenciadorDeEventos.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" terminó; carga la segunda escena del concierto
SecuenciadorDeEventos.loadScene("Track2")
else
-- Regresar a la escena del pre-espectáculo
SecuenciadorDeEventos.loadScene("PreShow")
end
end)