Sequenciador de Eventos é uma estrutura poderosa que permite construir eventos ao vivo e cenas cortadas em uma sequência estruturada de ações e gatilhos. Mais especificamente, este módulo ajuda você a:
- Construir um evento ou cena cortada em uma estrutura organizada através de configurações programadas de áudio, animações e tweens.
- Fazer a transição entre várias cenas em múltiplos servidores, sincronizando animações e visuais complexos a uma linha do tempo.
- Navegar por um evento e visualizar o jogo para fins de teste e desenvolvimento.
Esta estrutura foi testada em eventos do Roblox, como os concertos de Twenty One Pilots e 24kGoldn, além de muitos jogos altamente visitados.
Para ver o Sequenciador de Eventos em ação dentro de um lugar editável, confira o template de Concerto no Roblox Studio. Este template é um ponto de partida abrangente para desenvolvedores criarem eventos/concertos e se familiarizarem com os vários recursos e componentes envolvidos.

Uso do módulo
Instalação
Para usar a estrutura Sequenciador de Eventos em um jogo:
No menu Janela do Studio ou na barra de ferramentas da aba Início, abra a Caixa de Ferramentas e selecione a aba Loja do Criador.

Certifique-se de que a ordenação Modelos esteja selecionada, em seguida, clique no botão Ver Todos para Categorias.

Localize e clique no bloco Pacotes.
Localize o módulo Sequenciador de Eventos e clique nele, ou arraste e solte-o na visualização 3D.

Na janela Explorador, mova todo o modelo Sequenciador de Eventos para ServerScriptService. Ao executar o jogo, o módulo começará a rodar.
Modos de estrutura
Modo de substituição
O modo de estrutura padrão é o modo de substituição, no qual você projeta cenas únicas cenas colocando objetos 3D, terreno, propriedades de iluminação, efeitos ambientais e objetos de interface do usuário na pasta Ambiente dessa cena. Quando uma cena é carregada, esses objetos e propriedades são distribuídos em Workspace, Terrain e Lighting, substituindo objetos/propriedades existentes para formar um espaço clonado.
Modo inline
Um modo alternativo de estrutura é o modo inline, no qual você também projeta cenas únicas cenas com lógica de script para seu fluxo/eventos, mas a estrutura não destruirá objetos 3D, terreno, propriedades de iluminação, efeitos ambientais e objetos de interface do usuário existentes para clonar ativos/propriedades da pasta Ambiente de uma cena ao carregá-la.
Para habilitar o modo inline:
Dentro do modelo Sequenciador de Eventos que você colocou em ServerScriptService, expanda e selecione o valor Inline dentro da pasta ReplicatedStorage.

Na janela Propriedades, ative a caixa de seleção Valor.

Criar cenas
Uma cena é essencialmente parte de um evento geral ou uma cena cortada envolvida em uma série de pastas. Cada cena contém lógica de script que define seu fluxo/eventos, e uma cena pode armazenar seus próprios objetos 3D, terreno, propriedades de iluminação, efeitos ambientais e objetos de interface do usuário.
Para começar rapidamente, você pode encontrar uma cena vazia dentro da pasta principal do módulo:
Expanda a pasta Sequenciador de Eventos e localize a pasta BlankScene.

Mova ou copie toda a pasta BlankScene para ReplicatedStorage.

Duração do tempo
Cada cena deve ter uma duração de tempo, em segundos, definindo sua duração — assim como um filme ou concerto tem uma duração definida. A duração do tempo é definida como um atributo numérico na pasta da cena chamada TimeLength, que você pode definir diretamente no Studio ou programaticamente através de Instance:SetAttribute().


Ambiente
A pasta Ambiente de uma cena contém tudo o que os usuários veem e ouvem, incluindo objetos 3D, terreno, propriedades de iluminação e efeitos ambientais, e objetos de interface do usuário. Quando uma cena é carregada, esses objetos e propriedades são distribuídos em Workspace, Terrain e Lighting, substituindo objetos/propriedades existentes para formar um espaço clonado.
A pasta Ambiente contém os seguintes contêineres:
| Contêiner | Descrição |
|---|---|
| Cliente | Contém todos os ativos a serem carregados quando qualquer usuário (cliente) entra no evento, como objetos de interface do usuário ou um rig de animação. |
| PlayerSpawns | Contém partes onde os usuários aparecem ao entrar. Qualquer parte nesta pasta se comporta de forma semelhante a um SpawnLocation. |
| Servidor | Contém todos os ativos a serem carregados quando uma cena é criada pela primeira vez em um servidor. É recomendável que a maioria dos ativos visuais vá aqui. |
| Terreno | Contém o terreno da cena. |
| Iluminação | Contém propriedades de iluminação global como atributos, bem como modificadores como efeitos atmosféricos e efeitos de pós-processamento. |
Eventos
A pasta Eventos de uma cena é puramente um espaço reservado para RemoteEvents que se comunicam entre os módulos Cliente e Servidor. Não é necessário colocar nada nesta pasta.
Cliente
Este script executa a lógica de esquema no cliente.
Servidor
Este script executa a lógica de esquema no servidor.
Esquemas de cena
O esquema de uma cena define o que acontece em que ponto na linha do tempo da cena. Você deve definir o esquema de uma cena em seus módulos Cliente e Servidor e incluir ganchos de ciclo de vida para gerenciar quando as configurações ocorrem.
Ganchos de ciclo de vida
Os ganchos de ciclo de vida do esquema permitem que você gerencie quando as operações da cena ocorrem. Uma cena em produção normalmente será executada no fluxo mais simples:
OnRun pode ser interrompido ao buscar:
Todos os três ganchos também podem se repetir se a cena for reproduzida:
Configurações
As configurações do esquema definem as operações principais de uma cena, por exemplo, tocar áudio em 00:32, enfileirar uma animação para sincronizar com esse áudio, agendar um evento de cena como um show de fogos de artifício, e mais. Cada configuração suporta certas funções de retorno de chamada onde o primeiro parâmetro (self) é a instância da configuração.
Buscar cenas
Um recurso exclusivo do Sequenciador de Eventos é a capacidade de "buscar" em torno das cenas, assim como você faria ao buscar em um vídeo. No Modo de Substituição, você também pode alternar entre cenas para visualizar um evento de múltiplas cenas antes de implantá-lo em produção.
A busca de cenas não está acessível a todos, uma vez que os usuários que simplesmente estão desfrutando do evento não devem ter a capacidade de controlar seu fluxo de tempo. Em vez disso, você deve conceder permissão de busca com base no PlaceId do evento, bem como em UserIds específicos e/ou grupos e funções dentro deles.
Crie um novo Script dentro de ServerScriptService.
Cole o seguinte código no novo script.
Script - Definir Permissões de Buscalocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})Preencha as seguintes tabelas dentro da chamada setSeekingPermissions da seguinte forma:
placeIDs Lista delimitada por vírgulas de valores PlaceId para suportar busca dentro. userIDs Lista delimitada por vírgulas de UserIds para aqueles que podem buscar dentro dos lugares suportados. groups Lista delimitada por vírgulas de tabelas, cada uma contendo um ID de grupo e a classificação mínima dos membros desse grupo que podem buscar dentro dos lugares suportados.
Plugin de gerenciador de cenas
O plugin Gerenciador de Cenas é uma ferramenta útil para carregar e descarregar cenas, iluminação e terreno. A menos que você esteja usando Modo Inline, é altamente recomendável que você use este plugin em vez de colocar/editar manualmente objetos e propriedades de cena.
Para instalar o plugin:
No menu Janela do Studio ou na barra de ferramentas da aba Início, abra a Caixa de Ferramentas.
Com a aba Loja do Criador selecionada, selecione Plugins no menu suspenso.
No campo de busca, digite Gerenciador de Cenas e pressione Enter para localizar o plugin.

Clique no ícone do plugin para ver seus detalhes e, em seguida, clique no botão Instalar.
Uma vez que o plugin esteja instalado, ele aparece na aba Plugins do Studio.
Carregar e descarregar cenas
Como descrito em criar cenas, a pasta Ambiente de uma cena contém tudo o que os usuários veem e ouvem, incluindo objetos 3D. O plugin ajuda você a carregar rapidamente os ativos de uma cena para dentro ou fora de pastas organizadas dentro do espaço de trabalho.
| Ação do plugin | Descrição |
|---|---|
| Carregar Cliente | Se o conteúdo do cliente da cena estiver descarregado, move sua pasta Ambiente/Cliente para a pasta Workspace/ScenesClient. |
| Carregar Servidor | Se o conteúdo do servidor da cena estiver descarregado, move sua pasta Ambiente/Servidor para a pasta Workspace/ScenesServer. |
| Descarregar Cliente | Se o conteúdo do cliente da cena estiver carregado, move sua pasta Cliente de Workspace/ScenesClient de volta para a pasta [Cena]/Ambiente. |
| Descarregar Servidor | Se o conteúdo do servidor da cena estiver carregado, move sua pasta Servidor de Workspace/ScenesServer de volta para a pasta [Cena]/Ambiente. |
| Descarregar Todas as Cenas | Mova a pasta Cliente e Servidor de cada cena carregada de volta para sua pasta Ambiente. |
Salvar e carregar iluminação
O serviço Lighting de nível superior armazena todas as propriedades de iluminação e efeitos visuais de um lugar. Como é um serviço de nível superior, você não pode movê-lo manualmente para a pasta Ambiente/Servidor ou Ambiente/Cliente de uma cena específica. Em vez disso, você pode utilizar o plugin para copiar suas propriedades e filhos para a pasta Ambiente/Iluminação da cena.
Configure as propriedades de iluminação da cena, efeitos de pós-processamento, efeitos atmosféricos e skyboxes através do serviço Lighting de nível superior.

Na janela do plugin Gerenciador de Cenas, clique em Salvar Iluminação para a cena desejada.
Selecione e expanda a configuração Ambiente/Iluminação dessa cena e você verá as mesmas propriedades de iluminação como atributos da pasta, bem como filhos clonados do serviço Lighting de nível superior.

Instâncias clonadas 
Atributos salvos Uma vez que as propriedades e filhos de iluminação são salvos para uma cena, você pode carregá-los rapidamente de volta para o serviço Lighting de nível superior clicando em Carregar Iluminação na janela do plugin.
Salvar e carregar terreno
Como Terrain é uma classe de nível superior dentro de Workspace, você não pode mover manualmente o terreno gerado ou esculpido para a pasta Ambiente/Servidor ou Ambiente/Cliente de uma cena específica. Em vez disso, você pode utilizar o plugin para copiá-lo para a pasta Ambiente/Terreno da cena.
Configure o terreno da cena através do serviço Terreno de nível superior.

Na janela do plugin Gerenciador de Cenas, clique em Salvar Terreno para a cena desejada.
Selecione e expanda a pasta Ambiente/Terreno dessa cena e você verá um objeto TerrainRegion que representa o terreno salvo.

Uma vez que o terreno é salvo para uma cena, você pode carregá-lo rapidamente de volta para o serviço Terrain de nível superior clicando em Carregar Terreno na janela do plugin.
Referência da API
Ganchos de ciclo de vida do esquema
OnSetup
O gancho de ciclo de vida OnSetup é destinado à inicialização de ativos e variáveis que serão referenciados em OnRun ou OnEndScene, configurando conexões que devem durar durante a cena, etc. Este gancho recebe o parâmetro timePositionObject, que permite que você leia o tempo atual na configuração.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
local dummy
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Cliente)")
-- Acessar ambientes de cena; não se aplica ao Modo Inline
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- Aguardar ativos
dummy = clientEnvironment:WaitForChild("Dummy")
print("O tempo atual é:", timePositionObject.Value)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Servidor)")
-- Acessar ambiente da cena; não se aplica ao Modo Inline
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("O tempo atual é:", timePositionObject.Value)
endOnRun
OnRun é o gancho de ciclo de vida operacional principal dentro de um esquema. Ele deve conter todas as configurações temporizadas para a cena, desde tocar áudio ou uma animação até agendar um evento como um show de fogos de artifício.
Schema.OnRun = function()
print("OnRun (Cliente)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Áudio tocando")
end,
OnEnd = function(self)
print("Áudio terminado")
end
})
endOnEndScene
O gancho de ciclo de vida OnEndScene é útil para limpar qualquer coisa pendente na cena, como desconectar conexões criadas em OnSetup ou OnRun que permanecem durante a cena.
Schema.OnEndScene = function()
print("OnEndScene (Servidor)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
endConfigurações do esquema
audio
Cria um objeto Sound no espaço de trabalho que toca em um determinado momento. O som é então excluído após o término da cena ou após o objeto Sound terminar de tocar.
| Chave de Configuração | Descrição |
|---|---|
| StartTime | Quando tocar o áudio em relação à duração da cena, em segundos. |
| SoundId | ID do ativo do áudio a ser tocado. |
| OnStart | Função personalizada a ser chamada quando o áudio começa a tocar. |
| OnEnd | Função personalizada a ser chamada quando o áudio termina de tocar. |
| Volume | Volume do objeto Sound; o padrão é 0.5. |
Schema.OnRun = function()
print("OnRun (Cliente)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Áudio tocando")
end,
OnEnd = function(self)
print("Áudio terminado")
end
})
endanimate
Cria uma Animation que toca em um determinado momento.
| Chave de Configuração | Descrição |
|---|---|
| StartTime | Quando tocar a animação em relação à duração da cena, em segundos. |
| EndTime | Tempo opcional quando terminar a animação em relação à duração da cena, em segundos. |
| Rig | O rig de animação para tocar a animação. |
| AnimationId | ID do ativo da animação a ser tocada. |
| Speed | Velocidade de reprodução da animação; o padrão é 1. |
| FadeInTime | Quantidade de tempo para desvanecer a animação, em segundos; o padrão é 0.2 (segundos). |
| FadeOutTime | Quantidade de tempo para desvanecer a animação, em segundos; o padrão é 0.2 (segundos). |
| OnStart | Função personalizada a ser chamada quando a animação começa a tocar. |
| OnEnd | Função personalizada a ser chamada quando a animação termina de tocar. |
| Looped | Se a animação deve ser repetida; o padrão é false. |
| SyncToAudio | Tabela definindo se a animação deve ser sincronizada com uma configuração de áudio. Aceita as seguintes chaves:
|
Schema.OnRun = function()
print("OnRun (Cliente)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local DanceAnimation = Schema:animate({
AnimationId = "rbxassetid://3695333486",
Rig = Dummy,
Speed = 1,
FadeInTime = 0.1,
FadeOutTime = 0.3,
SyncToAudio = {
Audio = MainAudio,
StartAtAudioTime = 5,
},
OnStart = function(self)
print("Animação tocando")
end,
OnEnd = function(self)
print("Animação parada")
end
})
endtween
Cria um Tween configurável que é preservado na busca e na entrada dinâmica, o que significa que você pode encadear tweens em pontos separados no tempo e tudo deve tocar e sincronizar como esperado.
| Chave de Configuração | Descrição |
|---|---|
| StartTimes | Tabela de tempos de início em relação à duração da cena, em segundos. |
| Tween | Tabela definindo o objeto e propriedades a serem animadas. Aceita as seguintes chaves:
|
| OnStart | Função personalizada a ser chamada quando a animação começa a tocar. |
| OnHeartbeat | Função personalizada a ser chamada em cada Heartbeat; recebe a alpha da animação como seu segundo parâmetro. |
| OnEnd | Função personalizada a ser chamada quando a animação termina de tocar. |
| SyncToAudio | Tabela definindo se a animação deve ser sincronizada com uma configuração de áudio. Aceita as seguintes chaves:
|
Schema.OnRun = function()
print("OnRun (Cliente)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local LightFadeOut = Schema:tween({
StartTimes = {29.884},
Tween = {
Object = game:GetService("Lighting"),
Info = TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.Out),
Properties = {
Brightness = 0,
}
},
SyncToAudio = {
Audio = MainAudio,
StartAtAudioTimes = {5, 7.2, 9.4, 11.6},
},
OnStart = function(self)
print("Tween tocando")
end,
OnHeartbeat = function(self, alpha)
print("Alpha do tween", alpha)
end,
OnEnd = function(self)
print("Tween concluído")
end,
})
endinterval
Executa uma função de retorno de chamada personalizada ao longo de uma duração especificada em uma frequência especificada, em segundos. Útil para eventos repetidos como luzes piscando, pulsando a intensidade de um áudio, etc. A frequência mais baixa possível é 0 segundos, mas tecnicamente a frequência mínima é sempre limitada a Heartbeat.
| Chave de Configuração | Descrição |
|---|---|
| StartTime | Início da duração do intervalo em relação à duração da cena, em segundos. |
| EndTime | Fim da duração do intervalo em relação à duração da cena, em segundos. |
| Frequency | Com que frequência a função OnInterval deve ser chamada, em segundos, com a primeira execução ocorrendo em StartTime. |
| OnStart | Função personalizada a ser chamada quando a série de intervalos começa. |
| OnInterval | Função personalizada a ser chamada em cada intervalo dentro da duração especificada (StartTime a EndTime). |
| OnEnd | Função personalizada a ser chamada quando a série de intervalos termina. |
| SyncToAudio | Tabela definindo se a duração do intervalo deve ser sincronizada com uma configuração de áudio. Aceita as seguintes chaves:
|
Schema.OnRun = function()
print("OnRun (Cliente)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local ClientTimerUpdate = Schema:interval({
Frequency = 1,
SyncToAudio = {
StartAtAudioTime = 2.5,
EndAtAudioTime = 10,
Audio = MainAudio
},
OnInterval = function(self)
print(MainAudio.Sound.TimePosition, MainAudio.CurrentSoundIntensityRatio)
end,
})
endschedule
Semelhante ao interval, exceto que você pode definir vários tempos de início específicos para o mesmo evento, como agendar um show de fogos de artifício duas vezes em uma cena.
| Chave de Configuração | Descrição |
|---|---|
| StartTimes | Tabela de tempos de início em relação à duração da cena, em segundos. |
| OnStart | Função personalizada a ser chamada em cada tempo especificado na tabela StartTimes. |
| Skippable | Booleano definindo se o evento agendado pode ser pulado para usuários que entram tarde ou para quando buscam à frente de um tempo de início agendado. Se definido como false, todos os tempos de início do evento agendados antes do tempo de entrada/busca ocorrerão nesse tempo de entrada/busca. Se definido como true, apenas os tempos de início agendados após a entrada/busca ocorrerão. O padrão é false. |
| SyncToAudio | Tabela definindo se o agendamento deve ser sincronizado com uma configuração de áudio. Aceita as seguintes chaves:
|
Schema.OnRun = function()
print("OnRun (Cliente)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Inicializar conexão temporária de heartbeat
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Informar à estrutura sobre a conexão
Schema:inform(tempConnection)
end
})
endinform
Informa à estrutura sobre quaisquer módulos, objetos de UI, conexões, etc. que são criados no gancho de ciclo de vida OnRun, garantindo que sejam devidamente limpos ao buscar. Os casos de uso incluem:
Informar à estrutura sobre uma conexão temporária ad-hoc, como RunService.Heartbeat, para que a conexão seja limpa ao buscar para um ponto anterior na duração da cena.
Esquema do ServidorSchema.OnRun = function()print("OnRun (Servidor)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Inicializar conexão temporária de heartbeatlocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Informar à estrutura sobre a conexãoSchema:inform(tempConnection)end})endChamar uma função de "limpeza" personalizada em um ModuleScript que inicializa uma conexão ou outra referência durante o gancho de ciclo de vida OnRun.
Esquema do Servidorlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local RunService = game:GetService("RunService")local customModule = require(ReplicatedStorage:WaitForChild("CustomModule"))local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))local Schema = EventSequencer.createSchema()Schema.OnRun = function()print("OnRun (Servidor)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Chamar função "init" no módulo personalizadocustomModule.init()-- Chamar função "clean" no módulo personalizado na limpeza da cenaSchema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- Inicializar conexão de heartbeatCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- Desconectar e limpar conexão de heartbeatif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
Funções
loadScene
loadScene(sceneName: string, startTime: number ?)
Carrega programaticamente uma cena pelo sceneName e a inicia em startTime a partir de seu início. Haverá um "período de graça" de 5 segundos para a cena carregar do servidor antes que a busca ocorra e a cena comece a tocar. Isso significa que se você chamar loadScene("[SceneName]", 20) exatamente às 16:15:00, a estrutura aguardará 5 segundos além dos 20 solicitados, iniciando a cena às 16:15:25.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Descobrir a próxima cena a ser carregada quando a cena atual terminar
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" terminou; carregar a primeira cena do concerto
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" terminou; carregar a segunda cena do concerto
EventSequencer.loadScene("Track2")
else
-- Voltar para a cena de pré-show
EventSequencer.loadScene("PreShow")
end
end)createSchema
createSchema(): table
Retorna uma instância do esquema da cena para criar lógica para a cena.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Cliente)")
endseek
seek(time: number)
Busca para o valor time, em segundos, a partir do início da cena atualmente carregada.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.seek(95.58)setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
Define a quantidade de tempo a partir do fim de todas as cenas em que um aviso é enviado. Você pode detectar o aviso tanto do lado do cliente através de onSceneEndingWarningForClient quanto do lado do servidor através de onSceneEndingWarningForServer.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Carregar cena
EventSequencer.loadScene("BeautifulScene")
-- Definir tempo de aviso para 5 segundos antes do fim da cena
EventSequencer.setSceneWarningTime(5)
-- Detectar quando a cena está prestes a terminar
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("A cena está prestes a terminar!")
end)setSeekingPermissions
setSeekingPermissions(permissions: table)
Concede permissão de busca com base no PlaceId do evento, bem como em UserIds específicos e/ou grupos e funções dentro deles. Veja buscar e alternar cenas para mais informações.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
Retorna a pasta de Ambiente do lado do cliente ou do lado do servidor da cena atual, dependendo de se é chamada do script de esquema Cliente ou Servidor, respectivamente.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Cliente)")
-- Acessar ambientes de cena; não se aplica ao Modo Inline
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("O tempo atual é:", timePositionObject.Value)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Servidor)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
endgetCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
Retorna a pasta de Ambiente do servidor da cena atual. Ao contrário de getCurrentSceneEnvironment, você pode chamar isso a partir do script de esquema Cliente.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Cliente)")
-- Acessar ambientes de cena; não se aplica ao Modo Inline
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("O tempo atual é:", timePositionObject.Value)
endisLoadingScene
isLoadingScene(): boolean
Chamado do servidor para saber se uma cena está atualmente carregando.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("Cena carregada")Eventos
onSceneEndingWarningForClient
Dispara no cliente antes que a cena esteja prestes a terminar. O tempo padrão é 3 segundos, mas você pode configurá-lo através de setSceneWarningTime. Este evento só pode ser conectado em um LocalScript.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Detectar quando a cena está prestes a terminar (lado do cliente)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("A cena está prestes a terminar!")
end)onSceneEndingWarningForServer
Dispara no servidor antes que a cena esteja prestes a terminar. O tempo padrão é 3 segundos, mas você pode configurá-lo através de setSceneWarningTime. Este evento só pode ser conectado em um Script.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Detectar quando a cena está prestes a terminar (lado do servidor)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("A cena está prestes a terminar!")
end)onSceneLoadedForClient
Dispara no cliente quando a cena está começando. Este evento só pode ser conectado em um LocalScript.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Detectar quando a cena está começando (lado do cliente)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("A cena está começando!")
end)onOrchestrationFinished
Dispara no servidor quando uma cena atinge sua duração e efetivamente termina. Este evento recebe um argumento de string endedSceneName para o nome da cena que acabou de terminar e você pode encadear esse evento para condicionalmente carregar outra cena. Só pode ser conectado em um Script.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Descobrir a próxima cena a ser carregada quando a cena atual terminar
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" terminou; carregar a primeira cena do concerto
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" terminou; carregar a segunda cena do concerto
EventSequencer.loadScene("Track2")
else
-- Voltar para a cena de pré-show
EventSequencer.loadScene("PreShow")
end
end)