Sequenciador de Eventos

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

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:

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

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

  3. Localize e clique no bloco Pacotes.

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

  5. 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:

  1. Dentro do modelo Sequenciador de Eventos que você colocou em ServerScriptService, expanda e selecione o valor Inline dentro da pasta ReplicatedStorage.

  2. 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:

  1. Expanda a pasta Sequenciador de Eventos e localize a pasta BlankScene.

  2. 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êinerDescrição
ClienteConté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.
PlayerSpawnsContém partes onde os usuários aparecem ao entrar. Qualquer parte nesta pasta se comporta de forma semelhante a um SpawnLocation.
ServidorConté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.
TerrenoContém o terreno da cena.
IluminaçãoConté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.

  1. Crie um novo Script dentro de ServerScriptService.

  2. Cole o seguinte código no novo script.

    Script - Definir Permissões de Busca
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    EventSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Preencha as seguintes tabelas dentro da chamada setSeekingPermissions da seguinte forma:

    placeIDsLista delimitada por vírgulas de valores PlaceId para suportar busca dentro.
    userIDsLista delimitada por vírgulas de UserIds para aqueles que podem buscar dentro dos lugares suportados.
    groupsLista 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:

  1. No menu Janela do Studio ou na barra de ferramentas da aba Início, abra a Caixa de Ferramentas.

  2. Com a aba Loja do Criador selecionada, selecione Plugins no menu suspenso.

  3. No campo de busca, digite Gerenciador de Cenas e pressione Enter para localizar o plugin.

  4. Clique no ícone do plugin para ver seus detalhes e, em seguida, clique no botão Instalar.

  5. 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 pluginDescrição
Carregar ClienteSe o conteúdo do cliente da cena estiver descarregado, move sua pasta Ambiente/Cliente para a pasta Workspace/ScenesClient.
Carregar ServidorSe o conteúdo do servidor da cena estiver descarregado, move sua pasta Ambiente/Servidor para a pasta Workspace/ScenesServer.
Descarregar ClienteSe o conteúdo do cliente da cena estiver carregado, move sua pasta Cliente de Workspace/ScenesClient de volta para a pasta [Cena]/Ambiente.
Descarregar ServidorSe 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 CenasMova 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.

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

  2. Na janela do plugin Gerenciador de Cenas, clique em Salvar Iluminação para a cena desejada.

  3. 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.

  1. Configure o terreno da cena através do serviço Terreno de nível superior.

  2. Na janela do plugin Gerenciador de Cenas, clique em Salvar Terreno para a cena desejada.

  3. 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.

Esquema do Cliente
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)
end
Esquema do Servidor
local 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)
end

OnRun

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.

Esquema do Cliente
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
})
end

OnEndScene

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.

Esquema do Servidor
Schema.OnEndScene = function()
print("OnEndScene (Servidor)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end

Configuraçõ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çãoDescrição
StartTimeQuando tocar o áudio em relação à duração da cena, em segundos.
SoundIdID do ativo do áudio a ser tocado.
OnStartFunção personalizada a ser chamada quando o áudio começa a tocar.
OnEndFunção personalizada a ser chamada quando o áudio termina de tocar.
VolumeVolume do objeto Sound; o padrão é 0.5.
Esquema do Cliente
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
})
end

animate

Cria uma Animation que toca em um determinado momento.

Chave de ConfiguraçãoDescrição
StartTimeQuando tocar a animação em relação à duração da cena, em segundos.
EndTimeTempo opcional quando terminar a animação em relação à duração da cena, em segundos.
RigO rig de animação para tocar a animação.
AnimationIdID do ativo da animação a ser tocada.
SpeedVelocidade de reprodução da animação; o padrão é 1.
FadeInTimeQuantidade de tempo para desvanecer a animação, em segundos; o padrão é 0.2 (segundos).
FadeOutTimeQuantidade de tempo para desvanecer a animação, em segundos; o padrão é 0.2 (segundos).
OnStartFunção personalizada a ser chamada quando a animação começa a tocar.
OnEndFunção personalizada a ser chamada quando a animação termina de tocar.
LoopedSe a animação deve ser repetida; o padrão é false.
SyncToAudioTabela definindo se a animação deve ser sincronizada com uma configuração de áudio. Aceita as seguintes chaves:
  • Audio – Referência a uma configuração de áudio.
  • StartAtAudioTime – Quando tocar a animação em relação à duração do áudio.
  • EndAtAudioTime – Tempo opcional em que terminar a animação em relação à duração do áudio.
Esquema do Cliente
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
})
end

tween

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çãoDescrição
StartTimesTabela de tempos de início em relação à duração da cena, em segundos.
TweenTabela definindo o objeto e propriedades a serem animadas. Aceita as seguintes chaves:
  • Object – O objeto a ser animado.
  • Info – Instância de TweenInfo para a animação, definindo sua duração, Enum.EasingStyle, Enum.EasingDirection, etc.
  • Properties – Propriedades do objeto e valores-alvo associados para a animação.
OnStartFunção personalizada a ser chamada quando a animação começa a tocar.
OnHeartbeatFunção personalizada a ser chamada em cada Heartbeat; recebe a alpha da animação como seu segundo parâmetro.
OnEndFunção personalizada a ser chamada quando a animação termina de tocar.
SyncToAudioTabela definindo se a animação deve ser sincronizada com uma configuração de áudio. Aceita as seguintes chaves:
  • Audio – Referência a uma configuração de áudio.
  • StartAtAudioTimes – Tabela de tempos de início definindo quando tocar a animação em relação à duração do áudio.
Esquema do Cliente
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,
})
end

interval

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çãoDescrição
StartTimeInício da duração do intervalo em relação à duração da cena, em segundos.
EndTimeFim da duração do intervalo em relação à duração da cena, em segundos.
FrequencyCom que frequência a função OnInterval deve ser chamada, em segundos, com a primeira execução ocorrendo em StartTime.
OnStartFunção personalizada a ser chamada quando a série de intervalos começa.
OnIntervalFunção personalizada a ser chamada em cada intervalo dentro da duração especificada (StartTime a EndTime).
OnEndFunção personalizada a ser chamada quando a série de intervalos termina.
SyncToAudioTabela definindo se a duração do intervalo deve ser sincronizada com uma configuração de áudio. Aceita as seguintes chaves:
  • Audio – Referência a uma configuração de áudio.
  • StartAtAudioTime – Quando iniciar a duração do intervalo em relação à duração do áudio.
  • EndAtAudioTime – Tempo opcional em que terminar a duração do intervalo em relação à duração do áudio.
Esquema do Cliente
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,
})
end

schedule

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çãoDescrição
StartTimesTabela de tempos de início em relação à duração da cena, em segundos.
OnStartFunção personalizada a ser chamada em cada tempo especificado na tabela StartTimes.
SkippableBooleano 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.
SyncToAudioTabela definindo se o agendamento deve ser sincronizado com uma configuração de áudio. Aceita as seguintes chaves:
  • Audio – Referência a uma configuração de áudio.
  • StartAtAudioTimes – Tabela de tempos de início definindo quando chamar a função OnStart em relação à duração do áudio.
Esquema do Cliente
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
})
end

inform

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 Servidor
    Schema.OnRun = function()
    print("OnRun (Servidor)")
    Schema:schedule({
    StartTimes = {5},
    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
    })
    end
  • Chamar 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 Servidor
    local 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 personalizado
    customModule.init()
    -- Chamar função "clean" no módulo personalizado na limpeza da cena
    Schema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule
    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Inicializar conexão de heartbeat
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Desconectar e limpar conexão de heartbeat
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return 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.

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)

createSchema

createSchema(): table

Retorna uma instância do esquema da cena para criar lógica para a cena.

Esquema do Cliente
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Cliente)")
end

seek

seek(time: number)

Busca para o valor time, em segundos, a partir do início da cena atualmente carregada.

Script
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.

Script
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.

Esquema do 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)
end
Esquema do Servidor
local 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)
end

getCurrentServerEnvironmentFromClient

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.

Esquema do 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)
end

isLoadingScene

isLoadingScene(): boolean

Chamado do servidor para saber se uma cena está atualmente carregando.

Script
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.

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.

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.

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.

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)
©2026 Roblox Corporation, Roblox, o logotipo Roblox e Powering Imagination estão entre nossas marcas registradas e não registradas nos EUA e em outros países.