Secuenciador de Eventos

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Secuenciador de Eventos es un marco poderoso que te permite construir eventos y escenas cortadas en vivo y entre servidores sobre una secuencia estructurada de acciones y disparadores. Más específicamente, este módulo te ayuda a:

  • Construir un evento o escena cortada sobre 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 el juego para propósitos de prueba y desarrollo.

Este marco ha sido probado en eventos de Roblox como los conciertos de Twenty One Pilots y 24kGoldn, así como en muchos juegos muy visitados.

Para ver Secuenciador de Eventos en acción dentro de un lugar editable, consulta la plantilla de Concierto en Roblox Studio. Esta plantilla es un punto de partida integral 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 usar el marco Secuenciador de Eventos en un juego:

  1. 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 de Creadores.

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

  3. Localiza y haz clic en el mosaico de Paquetes.

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

  5. En la ventana de Explorador, mueve todo el modelo Secuenciador de Eventos a ServerScriptService. Al ejecutar el juego, el módulo comenzará a ejecutarse.

Modos del marco

Modo de reemplazo

El modo de marco predeterminado es modo de reemplazo en el que diseñas escenas únicas escenas colocando objetos 3D, terreno, propiedades de iluminación, efectos ambientales y objetos de interfaz de usuario en la carpeta Entorno de esa escena. Cuando se carga una escena, 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 alternativo del marco es el modo en línea en el que igualmente diseñas escenas únicas escenas con lógica de scripting para su flujo/eventos, pero el marco no destruirá los objetos 3D, terreno, propiedades de iluminación, efectos ambientales y objetos de interfaz de usuario existentes para clonar activos/propiedades de la carpeta Entorno de una escena al cargar.

Para habilitar el modo en línea:

  1. Dentro del modelo Secuenciador de Eventos que colocaste en ServerScriptService, profundiza y selecciona el valor En línea dentro de la carpeta ReplicatedStorage.

  2. 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 cortada envuelta en una serie de carpetas. Cada escena contiene lógica de scripting que define su flujo/eventos, y una escena puede almacenar sus propios objetos 3D, terreno, propiedades de iluminación, efectos ambientales y objetos de interfaz de usuario.

Para comenzar rápidamente, puedes encontrar una escena vacía dentro de la carpeta principal del módulo:

  1. Expande la carpeta Secuenciador de Eventos y localiza la carpeta BlankScene.

  2. Mueve o copia toda la carpeta BlankScene a ReplicatedStorage.

Duración del tiempo

Cada escena debe tener una duración de tiempo, en segundos, que define su duración — al igual que una película o un concierto tiene una duración establecida. La duración del tiempo se define como un atributo numérico en la carpeta de la escena llamado TimeLength 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, incluidos objetos 3D, terreno, propiedades de iluminación y efectos ambientales, y objetos de interfaz de usuario. Cuando se carga una escena, 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:

ContenedorDescripción
ClienteContiene todos los activos que se cargan cuando cualquier usuario (cliente) se une al evento, como objetos de interfaz de usuario o un rig de animación.
PlayerSpawnsContiene partes donde los usuarios aparecen al unirse. Cualquier parte en esta carpeta se comporta de manera similar a un SpawnLocation.
ServidorContiene todos los activos que se cargan cuando se crea una escena por primera vez en un servidor. Se recomienda que la mayoría de los activos visuales vayan aquí.
TerrenoContiene el terreno de la escena.
IluminaciónContiene 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 de posición para RemoteEvents que se comunican entre los módulos Cliente y Servidor. No es un requisito colocar nada en esta carpeta.

Cliente

Este script ejecuta la lógica de esquema en el cliente.

Servidor

Este script ejecuta la 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 sus módulos 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 típicamente se ejecutará en el flujo más simple:

OnRun puede ser interrumpido al buscar:

Los tres ganchos también pueden repetirse si la escena se vuelve a reproducir:

Configuraciones

Las configuraciones del esquema definen las operaciones centrales de una escena, por ejemplo, reproducir audio a las 00:32, encolar una animación para sincronizar 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 devolución de llamada donde el primer parámetro (self) es la instancia de configuración.

Buscar escenas

Una característica única de Secuenciador de Eventos es la capacidad de "buscar" a través 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 completo antes de desplegarlo en producción.

La búsqueda de escenas no es accesible para todos ya que los usuarios que simplemente disfrutan del evento no deberían 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.

  1. Crea un nuevo Script dentro de ServerScriptService.

  2. Pega el siguiente código en el nuevo script.

    Script - Establecer Permisos de Búsqueda
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
    SecuenciadorDeEventos.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Completa las siguientes tablas dentro de la llamada a setSeekingPermissions de la siguiente manera:

    placeIDsLista delimitada por comas de valores de PlaceId para soportar la búsqueda dentro.
    userIDsLista delimitada por comas de UserIds para aquellos que pueden buscar dentro de los lugares soportados.
    groupsLista 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 administrador de escenas

El plugin Administrador 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 escena.

Para instalar el plugin:

  1. Desde el menú Ventana de Studio o la barra de herramientas de la pestaña Inicio, abre el Toolbox.

  2. Con la pestaña Tienda de Creadores seleccionada, selecciona Plugins del menú desplegable.

  3. En el campo de búsqueda, escribe Administrador de Escenas y presiona Enter para localizar el plugin.

  4. Haz clic en el ícono del plugin para ver sus detalles y luego haz clic en el botón Instalar.

  5. Una vez que el plugin esté instalado, aparecerá 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, incluidos 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 pluginDescripción
Cargar ClienteSi el contenido del cliente de la escena está descargado, mueve su carpeta Entorno/Cliente a la carpeta Workspace/ScenesClient.
Cargar ServidorSi el contenido del servidor de la escena está descargado, mueve su carpeta Entorno/Servidor a la carpeta Workspace/ScenesServer.
Descargar ClienteSi el contenido del cliente de la escena está cargado, mueve su carpeta Cliente de Workspace/ScenesClient de vuelta a la carpeta [Escena]/Entorno.
Descargar ServidorSi 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 EscenasMueve 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.

  1. Configura las propiedades de iluminación de la escena, los efectos de post-procesamiento, los efectos atmosféricos y los skyboxes a través del servicio Lighting de nivel superior.

  2. En la ventana del plugin Administrador de Escenas, haz clic en Guardar Iluminación para la escena deseada.

  3. Selecciona y expande la configuración de Entorno/Iluminación de esa escena 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 y los hijos se guardan para una escena, puedes cargarlos rápidamente de nuevo en el 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 la 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.

  1. Configura el terreno de la escena a través del servicio Terreno de nivel superior.

  2. En la ventana del plugin Administrador de Escenas, haz clic en Guardar Terreno para la escena deseada.

  3. Selecciona y expande la carpeta Entorno/Terreno de esa escena y verás un objeto TerrainRegion que representa el terreno guardado.

    Una vez que el terreno se guarda para una escena, puedes cargarlo rápidamente de nuevo en el 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

OnSetup

El gancho de ciclo de vida OnSetup está destinado a inicializar activos y variables que se referenciarán en OnRun o OnEndScene, configurando 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.OnSetup = function(timePositionObject)
print("OnSetup (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 parteColorConnection
local cambiarColorParteEvento = script.Parent.Events.ChangePartColor
Esquema.OnSetup = function(timePositionObject)
print("OnSetup (Servidor)")
-- Acceder al entorno de la escena; no se aplica al Modo en Línea
entornoServidor = SecuenciadorDeEventos.getCurrentSceneEnvironment()
parteColorConnection = cambiarColorParteEvento.OnServerEvent:Connect(function(player, changedPart, newColor)
entornoServidor.changedPart.Color = newColor
end)
print("El tiempo actual es:", timePositionObject.Value)
end

OnRun

OnRun es el gancho de ciclo de vida operativo principal dentro de un esquema. Debe contener todas las configuraciones temporizadas para la escena, desde reproducir audio o una animación hasta programar un evento como un espectáculo de fuegos artificiales.

Esquema del Cliente
Esquema.OnRun = function()
print("OnRun (Cliente)")
local AudioPrincipal = Esquema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio reproduciéndose")
end,
OnEnd = function(self)
print("Audio finalizado")
end
})
end

OnEndScene

El gancho de ciclo de vida OnEndScene es útil para limpiar cualquier cosa pendiente en la escena, como desconectar conexiones creadas en OnSetup o OnRun que permanecen durante la duración de la escena.

Esquema del Servidor
Esquema.OnEndScene = function()
print("OnEndScene (Servidor)")
if parteColorConnection then
parteColorConnection:Disconnect()
parteColorConnection = nil
end
end

Configuraciones del esquema

audio

Crea un objeto Sound en el espacio de trabajo que se reproduce en un momento determinado. El sonido se elimina después de que la escena termina o después de que el objeto Sound termina de reproducirse.

Clave de configuraciónDescripción
StartTimeCuándo reproducir el audio en relación con la duración de la escena, en segundos.
SoundIdID de activo del audio a reproducir.
OnStartFunción personalizada que se activa cuando el audio comienza a reproducirse.
OnEndFunción personalizada que se activa cuando el audio termina de reproducirse.
VolumeVolumen del objeto Sound; el valor predeterminado es 0.5.
Esquema del Cliente
Esquema.OnRun = function()
print("OnRun (Cliente)")
local AudioPrincipal = Esquema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio reproduciéndose")
end,
OnEnd = function(self)
print("Audio finalizado")
end
})
end

animate

Crea una Animation que se reproduce en un momento determinado.

Clave de configuraciónDescripción
StartTimeCuándo reproducir la animación en relación con la duración de la escena, en segundos.
EndTimeTiempo opcional en el que finalizar la animación en relación con la duración de la escena, en segundos.
RigEl rig de animación en el que reproducir la animación.
AnimationIdID de activo de la animación a reproducir.
SpeedVelocidad de reproducción de la animación; el valor predeterminado es 1.
FadeInTimeCantidad de tiempo para desvanecer la animación, en segundos; el valor predeterminado es 0.2 (segundos).
FadeOutTimeCantidad de tiempo para desvanecer la animación, en segundos; el valor predeterminado es 0.2 (segundos).
OnStartFunción personalizada que se activa cuando la animación comienza a reproducirse.
OnEndFunción personalizada que se activa cuando la animación termina de reproducirse.
LoopedSi se debe repetir la animación; el valor predeterminado es false.
SyncToAudioTabla que define si sincronizar la animación con una configuración de audio. Acepta las siguientes claves:
  • Audio – Referencia a una configuración de audio.
  • StartAtAudioTime – Cuándo reproducir la animación en relación con la duración del audio.
  • EndAtAudioTime – Tiempo opcional en el que finalizar la animación en relación con la duración del audio.
Esquema del Cliente
Esquema.OnRun = function()
print("OnRun (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 reproduciéndose")
end,
OnEnd = function(self)
print("Animación detenida")
end
})
end

tween

Crea un Tween configurable que se conserva 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 debería reproducirse y sincronizarse como se espera.

Clave de configuraciónDescripción
StartTimesTabla de tiempos de inicio en relación con la duración de la escena, en segundos.
TweenTabla que define el objeto y las propiedades a tween. Acepta las siguientes claves:
  • Object – El objeto a tween.
  • Info – Instancia de TweenInfo para el tween, definiendo su duración, Enum.EasingStyle, Enum.EasingDirection, etc.
  • Properties – Propiedades del objeto y valores objetivo asociados para el tween.
OnStartFunción personalizada que se activa cuando el tween comienza a reproducirse.
OnHeartbeatFunción personalizada que se activa en cada Heartbeat; recibe el alfa del tween como su segundo parámetro.
OnEndFunción personalizada que se activa cuando el tween termina de reproducirse.
SyncToAudioTabla que define si sincronizar el tween con una configuración de audio. Acepta las siguientes claves:
  • Audio – Referencia a una configuración de audio.
  • StartAtAudioTimes – Tabla de tiempos de inicio que definen cuándo reproducir el tween en relación con la duración del audio.
Esquema del Cliente
Esquema.OnRun = function()
print("OnRun (Cliente)")
local AudioPrincipal = Esquema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local DesvanecimientoDeLuz = 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 reproduciéndose")
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 devolución de llamada personalizada durante una duración especificada a una frecuencia especificada, en segundos. Útil para eventos repetidos como luces intermitentes, pulsando la intensidad de un audio, etc. La frecuencia más baja posible es 0 segundos, pero técnicamente la frecuencia mínima siempre se limita a Heartbeat.

Clave de configuraciónDescripción
StartTimeInicio de la duración del intervalo en relación con la duración de la escena, en segundos.
EndTimeFin de la duración del intervalo en relación con la duración de la escena, en segundos.
FrequencyCon qué frecuencia debe activarse la función OnInterval, en segundos, siendo la primera ejecución en StartTime.
OnStartFunción personalizada que se activa cuando comienza la serie de intervalos.
OnIntervalFunción personalizada que se activa en cada intervalo dentro de la duración especificada (StartTime a EndTime).
OnEndFunción personalizada que se activa cuando termina la serie de intervalos.
SyncToAudioTabla que define si sincronizar la duración del intervalo con una configuración de audio. Acepta las siguientes claves:
  • Audio – Referencia a una configuración de audio.
  • StartAtAudioTime – Cuándo comenzar la duración del intervalo en relación con la duración del audio.
  • EndAtAudioTime – Tiempo opcional en el que finalizar la duración del intervalo en relación con la duración del audio.
Esquema del Cliente
Esquema.OnRun = function()
print("OnRun (Cliente)")
local AudioPrincipal = Esquema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local ActualizaciónTemporizadorCliente = 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ónDescripción
StartTimesTabla de tiempos de inicio en relación con la duración de la escena, en segundos.
OnStartFunción personalizada que se activa en cada tiempo especificado en la tabla StartTimes.
SkippableBooleano que define si el evento programado puede ser omitido para los usuarios que se unen tarde, o para cuando se busca adelante de un tiempo de inicio programado. Si se establece en false, todos los tiempos de inicio del evento programados antes del tiempo de unión/búsqueda ocurrirán en ese tiempo de unión/búsqueda. Si se establece en true, solo ocurrirán los tiempos de inicio programados después de la unión/búsqueda. El valor predeterminado es false.
SyncToAudioTabla que define si sincronizar el horario con una configuración de audio. Acepta las siguientes claves:
  • Audio – Referencia a una configuración de audio.
  • StartAtAudioTimes – Tabla de tiempos de inicio que definen cuándo activar la función OnStart en relación con la duración del audio.
Esquema del Cliente
Esquema.OnRun = function()
print("OnRun (Cliente)")
Esquema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Inicializar conexión temporal de latido
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, objeto de UI, conexiones, etc. que se crean en el gancho de ciclo de vida OnRun, asegurando que se limpien adecuadamente al buscar. Los casos de uso incluyen:

  • Informar al marco sobre una conexión temporal ad-hoc como RunService.Heartbeat para que la conexión se limpie al buscar un punto anterior en la duración de la escena.

    Esquema del Servidor
    Esquema.OnRun = function()
    print("OnRun (Servidor)")
    Esquema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Inicializar conexión temporal de latido
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Informar al marco de la conexión
    Esquema:inform(tempConnection)
    end
    })
    end
  • Llamar 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 OnRun.

    Esquema del Servidor
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local RunService = game:GetService("RunService")
    local customModule = require(ReplicatedStorage:WaitForChild("CustomModule"))
    local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
    local Esquema = SecuenciadorDeEventos.createSchema()
    Esquema.OnRun = function()
    print("OnRun (Servidor)")
    Esquema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Llamar a la función "init" en el módulo personalizado
    customModule.init()
    -- Llamar a la función "clean" en el módulo personalizado en la limpieza de la escena
    Esquema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule
    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Inicializar conexión de latido
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Desconectar y limpiar conexión de latido
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return CustomModule

Funciones

loadScene

loadScene(sceneName: string, startTime: number ?)

Carga programáticamente una escena por sceneName y la inicia en startTime desde su comienzo. 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, comenzando la escena a las 4:15:25 PM.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Averiguar la siguiente escena a cargar cuando la escena actual termine
SecuenciadorDeEventos.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" terminó; cargar la primera escena en el concierto
SecuenciadorDeEventos.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" terminó; cargar la segunda escena en el concierto
SecuenciadorDeEventos.loadScene("Track2")
else
-- Volver a la escena de pre-show
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.OnSetup = function(timePositionObject)
print("OnSetup (Cliente)")
end

seek

seek(time: number)

Busca el valor de time, en segundos, desde el comienzo de la escena actualmente cargada.

Script
local 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 final 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"))
-- Cargar escena
SecuenciadorDeEventos.loadScene("BeautifulScene")
-- Establecer tiempo de advertencia a 5 segundos antes de que la escena termine
SecuenciadorDeEventos.setSceneWarningTime(5)
-- Detectar cuándo 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 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 del lado del cliente o del lado del servidor de la escena actual, dependiendo de si se llama desde el script del esquema Cliente o del esquema 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.OnSetup = function(timePositionObject)
print("OnSetup (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 parteColorConnection
local cambiarColorParteEvento = script.Parent.Events.ChangePartColor
Esquema.OnSetup = function(timePositionObject)
print("OnSetup (Servidor)")
entornoServidor = SecuenciadorDeEventos.getCurrentSceneEnvironment()
parteColorConnection = cambiarColorParteEvento.OnServerEvent:Connect(function(player, changedPart, newColor)
entornoServidor.changedPart.Color = newColor
end)
end

getCurrentServerEnvironmentFromClient

getCurrentServerEnvironmentFromClient(): Folder (YIELDS)

Devuelve la carpeta de entorno del servidor de la escena actual. A diferencia de getCurrentSceneEnvironment, puedes llamar a esto desde el script del esquema Cliente.

Esquema del Cliente
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
local Esquema = SecuenciadorDeEventos.createSchema()
local entornoCliente
local entornoServidor
Esquema.OnSetup = function(timePositionObject)
print("OnSetup (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.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
print(SecuenciadorDeEventos.isLoadingScene())
while SecuenciadorDeEventos.isLoadingScene() do
task.wait()
end
print("Escena cargada")

Eventos

onSceneEndingWarningForClient

Se activa en el cliente antes de que la escena esté a punto de terminar. El tiempo predeterminado es de 3 segundos, pero puedes configurarlo a través de setSceneWarningTime. Este evento solo puede conectarse en un LocalScript.

LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Detectar cuándo 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 de 3 segundos, pero puedes configurarlo a través de setSceneWarningTime. Este evento solo puede conectarse en un Script.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Detectar cuándo 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 puede conectarse en un LocalScript.

LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SecuenciadorDeEventos = require(ReplicatedStorage:WaitForChild("SecuenciadorDeEventos"))
-- Detectar cuándo la escena está comenzando (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 duración de tiempo y ha terminado efectivamente. Este evento recibe un argumento de cadena endedSceneName para la escena que acaba de finalizar 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"))
-- Averiguar la siguiente escena a cargar cuando la escena actual termine
SecuenciadorDeEventos.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" terminó; cargar la primera escena en el concierto
SecuenciadorDeEventos.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" terminó; cargar la segunda escena en el concierto
SecuenciadorDeEventos.loadScene("Track2")
else
-- Volver a la escena de pre-show
SecuenciadorDeEventos.loadScene("PreShow")
end
end)
©2026 Roblox Corporation. Roblox, el logotipo de Roblox y "Powering Imagination" son algunas de nuestras marcas registradas y no registradas en los Estados Unidos y otros países.