Sequenciador de Eventos

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

EventSequencer é uma poderosa estrutura que permite criar eventos ao vivo e cenas cortadas entre servidores em uma sequência estruturada de ações e gatilhos. Mais especificamente, este módulo ajuda você a:

  • Criar 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 a experiência para propósitos de teste e desenvolvimento.

Esta estrutura foi testada em eventos do Roblox como os concertos de Twenty One Pilots e 24kGoldn, bem como em muitas experiências altamente visitadas.

Para ver EventSequencer em ação dentro de um local 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 diversos recursos e componentes envolvidos.

Uso do Módulo

Instalação

Para usar a estrutura EventSequencer em uma experiência:

  1. No menu Janela do Studio ou na barra de ferramentas da guia Início, abra a Caixa de Ferramentas e selecione a guia Loja do Criador.

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

  3. Localize e clique no cartão 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 o modelo EventSequencer inteiro para ServerScriptService. Ao executar a experiência, o módulo começará a ser executado.

Modos de Estrutura

Modo de Substituição

O modo de estrutura padrão é o modo de substituição, no qual você projeta cenas únicas 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 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 para clonar ativos/propriedades da pasta Ambiente de uma cena ao carregar.

Para habilitar o modo inline:

  1. Dentro do modelo EventSequencer que você colocou em ServerScriptService, desça e selecione o valor Inline dentro da pasta ReplicatedStorage.

  2. Na janela Propriedades, ative a caixa de seleção de 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 EventSequencer 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, que define sua duração — assim como um filme ou um concerto tem uma duração definida. A duração é 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 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:

ContainerDescriçã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 é obrigatório colocar nada nesta pasta.

Cliente

Este script executa lógica de esquema no cliente.

Servidor

Este script executa lógica de esquema no servidor.

Esquemas de Cena

O esquema de uma cena define o que acontece em que ponto da linha do tempo da cena. Você deve definir o esquema de uma cena tanto em seus módulos Cliente quanto 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 geralmente é executada no fluxo mais simples:

OnRun pode ser interrompido ao buscar:

Todos os três ganchos também podem ser repetidos se a cena for reproduzida:

Configurações

As configurações de esquema definem as operações principais de uma cena, como reproduzir á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 de configuração.

Um recurso exclusivo do EventSequencer é a capacidade de "navegar" pelas cenas, assim como você faria com um vídeo. No Modo de Substituição, você também pode alternar entre cenas para visualizar um evento de múltiplas cenas inteiras antes de implantá-lo em produção.

A busca pela cena não é acessível a todos, já que 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 em 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 na chamada de setSeekingPermissions da seguinte forma:

    placeIDsLista delimitada por vírgulas de valores de PlaceId para suportar busca.
    userIDsLista delimitada por vírgulas de UserIds para aqueles que podem buscar nos lugares suportados.
    groupsLista delimitada por vírgulas de tabelas, cada uma contendo um ID de grupo e o mínimo grau dos membros desse grupo que podem buscar nos lugares suportados.

Plugin de Gerenciamento de Cena

O plugin Gerenciador de Cena é uma ferramenta útil para carregar e descarregar cenas, iluminação e terreno. A menos que você esteja usando o Modo Inline, é altamente recomendável que você use este plugin em vez de colocar/editá-los manualmente objetos e propriedades de cena.

Para instalar o plugin:

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

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

  3. No campo de pesquisa, digite Gerenciador de Cena e pressione Enter para localizar o plugin.

  4. Clique no ícone do plugin para visualizar seus detalhes e depois clique no botão Instalar.

  5. Assim que o plugin for instalado, ele aparecerá na guia Plugins do Studio.

Carregar e descarregar cenas

Como descrito em criar cenas, a pasta Ambiente de uma cena contém tudo 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 cada 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 local. 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, efeitos de pós-processamento, efeitos atmosféricos e skyboxes da cena através do serviço de nível superior Lighting.

  2. Na janela do plugin Gerenciador de Cena, 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 de nível superior Lighting.

    Instâncias clonadas
    Atributos salvos

    Uma vez que as propriedades e filhos de iluminação sejam salvos para uma cena, você pode carregá-los de volta rapidamente para o serviço de nível superior Lighting 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 de nível superior Terreno.

  2. Na janela do plugin Gerenciador de Cena, 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 seja salvo para uma cena, você pode carregá-lo de volta rapidamente para o serviço de nível superior Terrain 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 para inicializar ativos e variáveis que serão referenciados em OnRun ou OnEndScene, configurando conexões que estão destinadas a 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)")
-- Acesse os ambientes da cena; não se aplica ao Modo Inline
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- Aguardar por 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)")
-- Acesse o 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 o áudio reproduzido ou uma animação até o agendamento de um evento como uma exibição 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 reproduzido")
end,
OnEnd = function(self)
print("Áudio finalizado")
end
})
end

OnEndScene

O gancho de ciclo de vida OnEndScene é útil para limpar quaisquer pendências 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 final da cena ou após a conclusão da reprodução do objeto Sound.

Chave de ConfiguraçãoDescrição
StartTimeQuando reproduzir o áudio em relação à duração da cena, em segundos.
SoundIdID do ativo do áudio a ser reproduzido.
OnStartFunção personalizada a ser ativada quando o áudio começa a tocar.
OnEndFunção personalizada a ser ativada 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 reproduzido")
end,
OnEnd = function(self)
print("Áudio finalizado")
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 reproduzida.
SpeedVelocidade de reprodução da animação; o padrão é 1.
FadeInTimeQuantidade de tempo para o fade-in da animação, em segundos; o padrão é 0.2 (segundos).
FadeOutTimeQuantidade de tempo para o fade-out da animação, em segundos; o padrão é 0.2 (segundos).
OnStartFunção personalizada a ser ativada quando a animação começa a tocar.
OnEndFunção personalizada a ser ativada quando a animação parar de tocar.
LoopedSe a animação deve ser repetida; o padrão é false.
SyncToAudioTabela definindo se sincronizar a animação a 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 reproduzida")
end,
OnEnd = function(self)
print("Animação parada")
end
})
end

tween

Cria um Tween configurável que é preservado na busca e no ingresso dinâmico, significando 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 interpoladas. Aceita as seguintes chaves:
  • Object – O objeto a ser interpolado.
  • Info – Instância de TweenInfo para a interpolação, definindo sua duração, Enum.EasingStyle, Enum.EasingDirection, etc.
  • Properties – Propriedades de objeto e valores alvo associados para a interpolação.
OnStartFunção personalizada a ser ativada quando a interpolação começa a tocar.
OnHeartbeatFunção personalizada a ser ativada em cada Heartbeat; recebe a interpolação alfa como seu segundo parâmetro.
OnEndFunção personalizada a ser ativada quando a interpolação termina de tocar.
SyncToAudioTabela definindo se sincronizar a interpolação a 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 interpolaçã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("Interpolação reproduzida")
end,
OnHeartbeat = function(self, alpha)
print("Interpolação alfa", alpha)
end,
OnEnd = function(self)
print("Interpolação concluída")
end,
})
end

interval

Executa uma função de callback personalizada durante uma duração especificada em uma frequência especificada, em segundos. Útil para eventos repetidos, como luzes piscando ou pulsando a intensidade de um áudio, etc. A menor frequência possível é 0 segundos, mas tecnicamente a frequência mínima é sempre restringida ao 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 ativada, em segundos, com a primeira execução ocorrendo em StartTime.
OnStartFunção personalizada a ser ativada quando a série de intervalos começa.
OnIntervalFunção personalizada a ser ativada em cada intervalo dentro da duração especificada (StartTime a EndTime).
OnEndFunção personalizada a ser ativada quando a série de intervalos termina.
SyncToAudioTabela definindo se sincronizar a duração do intervalo a 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 ao á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 a interval, exceto que você pode definir vários tempos de início específicos para o mesmo evento, como agendar uma exibição 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 ativada em cada tempo especificado na tabela StartTimes.
SkippableBooleano definindo se o evento agendado pode ser pulado para usuários que entram tarde, ou quando se busca à 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 depois da entrada/busca ocorrerão. O padrão é false.
SyncToAudioTabela definindo se sincronizar o agendamento a 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 ativar 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)
-- Inicializa a conexão temporária de heartbeat
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Informa à 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 limpos adequadamente ao buscar. 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)
    -- Inicializa a conexão temporária de heartbeat
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Informa à 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)
    -- Chama a função "init" no módulo personalizado
    customModule.init()
    -- Chama a 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()
    -- Inicializa a conexão de heartbeat
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Desconecta e limpa a 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 por sceneName e a inicia em startTime desde o 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 carregar quando a cena atual terminar
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" terminou; carrega a primeira cena do concerto
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" terminou; carrega a segunda cena do concerto
EventSequencer.loadScene("Track2")
else
-- Retorna à 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)

Navega para o valor de time, em segundos, a partir do começo 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 final de todas as cenas em que um aviso é enviado. Você pode detectar o aviso no lado do cliente através do onSceneEndingWarningForClient ou no lado do servidor através do 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 da cena terminar
EventSequencer.setSceneWarningTime(5)
-- Detectar quando a cena estiver 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, assim como em UserIds e/ou em 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 se é chamada a partir do script do esquema Cliente ou do script do esquema Servidor.

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)")
-- Acesse os ambientes da 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)")
-- Acesse o 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)
end

getCurrentServerEnvironmentFromClient

getCurrentServerEnvironmentFromClient(): Folder (YIELDS)

Retorna a pasta do lado do servidor da cena atual Ambiente. Ao contrário de getCurrentSceneEnvironment, você pode chamar isso a partir do script do 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)")
-- Acesse os ambientes da cena; não se aplica ao Modo Inline
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("O tempo atual é:", timePositionObject.Value)
end

isLoadingScene

isLoadingScene(): boolean

Chamada a partir 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

É acionado 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

É acionado 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

É acionado 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

É acionado no servidor quando uma cena alcançou seu tempo de duração e efetivamente terminou. Este evento recebe um argumento de string endedSceneName para o nome da cena que acabou de terminar e você pode encadear a partir deste 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"))
-- Figurar a próxima cena a carregar quando a cena atual terminar
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" terminou; carrega a primeira cena do concerto
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" terminou; carrega a segunda cena do concerto
EventSequencer.loadScene("Track2")
else
-- Retorna à 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.