Sequenziatore di Eventi

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Sequenziatore di Eventi è un potente framework che ti consente di costruire eventi dal vivo e cutscene cross-server su una sequenza strutturata di azioni e trigger. Più specificamente, questo modulo ti aiuta a:

  • Costruire un evento o una cutscene su un framework strutturato attraverso configurazioni programmate di audio, animazioni e tweens.
  • Passare tra più scene su più server, sincronizzando animazioni e visuali complesse a una timeline.
  • Cercare attraverso un evento e visualizzare il gioco per scopi di test e sviluppo.

Questo framework è stato testato in eventi di Roblox come i concerti dei Twenty One Pilots e 24kGoldn, così come in molti giochi molto visitati.

Per vedere Sequenziatore di Eventi in azione all'interno di un luogo modificabile, dai un'occhiata al template Concerto in Roblox Studio. Questo template è un punto di partenza completo per gli sviluppatori per creare eventi/concerti e familiarizzare con le varie funzionalità e componenti coinvolti.

Utilizzo del modulo

Installazione

Per utilizzare il framework Sequenziatore di Eventi in un gioco:

  1. Dal menu Finestra di Studio o dalla barra degli strumenti della scheda Home, apri il Toolbox e seleziona la scheda Negozio Creatore.

  2. Assicurati che sia selezionato l'ordinamento Modelli, quindi fai clic sul pulsante Vedi Tutti per le Categorie.

  3. Individua e fai clic sulla tessera Pacchetti.

  4. Individua il modulo Sequenziatore di Eventi e fai clic su di esso, oppure trascinalo nella vista 3D.

  5. Nella finestra Esplora, sposta l'intero modello Sequenziatore di Eventi in ServerScriptService. Una volta avviato il gioco, il modulo inizierà a funzionare.

Modalità del framework

Modalità di sostituzione

La modalità predefinita del framework è la modalità di sostituzione in cui progetti scene uniche scenes posizionando oggetti 3D, terreno, proprietà di illuminazione, effetti ambientali e oggetti dell'interfaccia utente nella cartella Environment di quella scena. Quando una scena viene caricata, quegli oggetti e proprietà vengono distribuiti in Workspace, Terrain e Lighting, sostituendo oggetti/proprietà esistenti per formare uno spazio clonato.

Modalità inline

Una modalità alternativa del framework è la modalità inline in cui progetti anch'essa scene uniche scenes con logica di scripting per il loro flusso/eventi, ma il framework non distruggerà oggetti 3D esistenti, terreno, proprietà di illuminazione, effetti ambientali e oggetti dell'interfaccia utente per clonare asset/proprietà dalla cartella Environment di una scena al momento del caricamento.

Per abilitare la modalità inline:

  1. All'interno del modello Sequenziatore di Eventi che hai posizionato in ServerScriptService, espandi e seleziona il valore Inline all'interno della cartella ReplicatedStorage.

  2. Nella finestra Proprietà, attiva la casella di controllo Value.

Creare scene

Una scena è essenzialmente parte di un evento complessivo o di una cutscene avvolta in una serie di cartelle. Ogni scena contiene logica di scripting che definisce il suo flusso/eventi, e una scena può memorizzare i propri oggetti 3D, terreno, proprietà di illuminazione, effetti ambientali e oggetti dell'interfaccia utente.

Per iniziare rapidamente, puoi trovare una scena vuota all'interno della cartella principale del modulo:

  1. Espandi la cartella Sequenziatore di Eventi e individua la cartella BlankScene.

  2. Sposta o copia l'intera cartella BlankScene in ReplicatedStorage.

Durata

Ogni scena dovrebbe avere una durata, in secondi, che definisce la sua durata — proprio come un film o un concerto ha una durata prestabilita. La durata è definita come un attributo numerico attribute sulla cartella della scena chiamata TimeLength che puoi impostare direttamente in Studio o programmaticamente tramite Instance:SetAttribute().

Ambiente

La cartella Environment di una scena contiene tutto ciò che gli utenti vedono e sentono, inclusi oggetti 3D, terreno, proprietà di illuminazione e effetti ambientali, e oggetti dell'interfaccia utente. Quando una scena viene caricata, quegli oggetti e proprietà vengono distribuiti in Workspace, Terrain e Lighting, sostituendo oggetti/proprietà esistenti per formare uno spazio clonato.

La cartella Environment contiene i seguenti contenitori:

ContenitoreDescrizione
ClientContiene tutti gli asset da caricare quando un utente (client) partecipa all'evento, come oggetti dell'interfaccia utente o un rig di animazione.
PlayerSpawnsContiene parti dove gli utenti spawnano al momento dell'ingresso. Qualsiasi parte in questa cartella si comporta in modo simile a un SpawnLocation.
ServerContiene tutti gli asset da caricare quando una scena viene creata per la prima volta su un server. È consigliabile che la maggior parte degli asset visivi vada qui.
TerrainContiene il terreno della scena.
LightingContiene proprietà di illuminazione globali come attributi, così come modificatori come effetti atmosferici e effetti di post-processing.

Eventi

La cartella Events di una scena è puramente un segnaposto per RemoteEvents che comunicano tra i moduli Client e Server. Non è necessario posizionare nulla in questa cartella.

Client

Questo script esegue la logica schema sul client.

Server

Questo script esegue la logica schema sul server.

Schemi delle scene

Lo schema di una scena definisce cosa succede a quale punto nella timeline della scena. Dovresti definire lo schema di una scena sia nei suoi moduli Client che Server e includere hook di ciclo di vita per gestire quando avvengono le configurazioni.

Hook di ciclo di vita

Gli hook di ciclo di vita schema ti consentono di gestire quando si verificano le operazioni della scena. Una scena in produzione funzionerà tipicamente nel flusso più semplice:

OnRun può essere interrotto quando si cerca:

Tutti e tre gli hook possono anche ripetersi se la scena viene riprodotta:

Configurazioni

Le configurazioni dello schema definiscono le operazioni principali di una scena, ad esempio riprodurre audio a 00:32, mettere in coda un' animazione per sincronizzarsi con quell'audio, programmando un evento di scena come uno spettacolo di fuochi d'artificio, e altro ancora. Ogni configurazione supporta determinate funzioni di callback dove il primo parametro (self) è l'istanza di configurazione.

Cercare scene

Una caratteristica unica del Sequenziatore di Eventi è la possibilità di "cercare" tra le scene come faresti cercando in un video. In Modalità di Sostituzione, puoi anche passare tra le scene per visualizzare un intero evento multi-scena prima di distribuirlo in produzione.

La ricerca delle scene non è accessibile a tutti poiché gli utenti che semplicemente godono dell'evento non dovrebbero avere la possibilità di controllare il flusso temporale. Invece, devi concedere il permesso di ricerca in base al PlaceId dell'evento, così come a specifici UserIds e/o gruppi e ruoli al loro interno.

  1. Crea un nuovo Script all'interno di ServerScriptService.

  2. Incolla il seguente codice nel nuovo script.

    Script - Imposta Permessi di Ricerca
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    SequenziatoreDiEventi.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Compila le seguenti tabelle all'interno della chiamata setSeekingPermissions come segue:

    placeIDsElenco delimitato da virgole di valori PlaceId per supportare la ricerca all'interno.
    userIDsElenco delimitato da virgole di UserIds per coloro che possono cercare all'interno dei luoghi supportati.
    groupsElenco delimitato da virgole di tabelle, ciascuna contenente un ID di gruppo e il rango minimo dei membri di quel gruppo che possono cercare all'interno dei luoghi supportati.

Plugin di gestione delle scene

Il plugin Scene Manager è uno strumento utile per caricare e scaricare scene, illuminazione e terreno. A meno che tu non stia utilizzando la Modalità Inline, è altamente consigliato utilizzare questo plugin invece di posizionare/modificare manualmente oggetti e proprietà delle scene.

Per installare il plugin:

  1. Dal menu Finestra di Studio o dalla barra degli strumenti della scheda Home, apri il Toolbox.

  2. Con la scheda Negozio Creatore selezionata, seleziona Plugin dal menu a discesa.

  3. Nella casella di ricerca, digita Scene Manager e premi Invio per localizzare il plugin.

  4. Fai clic sull'icona del plugin per visualizzarne i dettagli e poi fai clic sul pulsante Installa.

  5. Una volta installato, il plugin appare nella scheda Plugin di Studio.

Caricare e scaricare scene

Come delineato in creare scene, la cartella Environment di una scena contiene tutto ciò che gli utenti vedono e sentono, inclusi oggetti 3D. Il plugin ti aiuta a caricare rapidamente gli asset di una scena dentro o fuori da cartelle organizzate all'interno dello spazio di lavoro.

Azioni del pluginDescrizione
Carica ClientSe il contenuto client della scena è scaricato, sposta la sua cartella Environment/Client nella cartella Workspace/ScenesClient.
Carica ServerSe il contenuto server della scena è scaricato, sposta la sua cartella Environment/Server nella cartella Workspace/ScenesServer.
Scarica ClientSe il contenuto client della scena è caricato, sposta la sua cartella Client da Workspace/ScenesClient di nuovo nella cartella [Scene]/Environment.
Scarica ServerSe il contenuto server della scena è caricato, sposta la sua cartella Server da Workspace/ScenesServer di nuovo nella cartella [Scene]/Environment.
Scarica Tutte le SceneSposta la cartella Client e Server di ogni scena caricata di nuovo nella sua cartella Environment.

Salvare e caricare l'illuminazione

Il servizio di livello superiore Lighting memorizza tutte le proprietà di illuminazione e gli effetti visivi di un luogo. Poiché è un servizio di livello superiore, non puoi spostarlo manualmente in una cartella Environment/Server o Environment/Client di una scena particolare. Invece, puoi utilizzare il plugin per copiare le sue proprietà e i suoi figli nella cartella Environment/Lighting della scena.

  1. Configura le proprietà di illuminazione, gli effetti di post-processing, gli effetti atmosferici e le skybox attraverso il servizio di livello superiore Lighting.

  2. Nella finestra del plugin Scene Manager, fai clic su Salva Illuminazione per la scena desiderata.

  3. Seleziona ed espandi la configurazione Environment/Lighting di quella scena e vedrai le stesse proprietà di illuminazione come attributi della cartella, così come i figli clonati del servizio di livello superiore Lighting.

    Istanza clonata
    Attributi salvati

    Una volta che le proprietà di illuminazione e i figli sono stati salvati per una scena, puoi rapidamente caricarli di nuovo nel servizio di livello superiore Lighting facendo clic su Carica Illuminazione dalla finestra del plugin.

Salvare e caricare il terreno

Poiché Terrain è una classe di livello superiore all'interno di Workspace, non puoi spostare manualmente il terreno generato o scolpito in una cartella Environment/Server o Environment/Client di una scena particolare. Invece, puoi utilizzare il plugin per copiarlo nella cartella Environment/Terrain della scena.

  1. Configura il terreno della scena attraverso il servizio di livello superiore Terrain.

  2. Nella finestra del plugin Scene Manager, fai clic su Salva Terreno per la scena desiderata.

  3. Seleziona ed espandi la cartella Environment/Terrain di quella scena e vedrai un oggetto TerrainRegion che rappresenta il terreno salvato.

    Una volta che il terreno è stato salvato per una scena, puoi rapidamente caricarlo di nuovo nel servizio di livello superiore Terrain facendo clic su Carica Terreno dalla finestra del plugin.

Riferimento API

Hook di ciclo di vita dello schema

OnSetup

L'hook di ciclo di vita OnSetup è destinato all'inizializzazione di asset e variabili che saranno referenziati in OnRun o OnEndScene, impostando connessioni che sono destinate a durare per la durata della scena, ecc. Questo hook riceve il parametro timePositionObject che ti consente di leggere il tempo attuale all'impostazione.

Schema Client
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = SequenziatoreDiEventi.createSchema()
local clientEnvironment
local serverEnvironment
local dummy
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Accedi agli ambienti della scena; non si applica alla Modalità Inline
clientEnvironment = SequenziatoreDiEventi.getCurrentSceneEnvironment()
serverEnvironment = SequenziatoreDiEventi.getCurrentServerEnvironmentFromClient()
-- Aspetta gli asset
dummy = clientEnvironment:WaitForChild("Dummy")
print("Il tempo attuale è:", timePositionObject.Value)
end
Schema Server
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = SequenziatoreDiEventi.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
-- Accedi all'ambiente della scena; non si applica alla Modalità Inline
serverEnvironment = SequenziatoreDiEventi.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Il tempo attuale è:", timePositionObject.Value)
end

OnRun

OnRun è l'hook di ciclo di vita operativo principale all'interno di uno schema. Dovrebbe contenere tutte le configurazioni temporizzate per la scena, dalla riproduzione di audio o di un' animazione alla programmazione di un evento come uno spettacolo di fuochi d'artificio.

Schema Client
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio in riproduzione")
end,
OnEnd = function(self)
print("Audio terminato")
end
})
end

OnEndScene

L'hook di ciclo di vita OnEndScene è utile per ripulire qualsiasi cosa in sospeso nella scena, come disconnettere connessioni create in OnSetup o OnRun che rimangono per la durata della scena.

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

Configurazioni dello schema

audio

Crea un oggetto Sound nello spazio di lavoro che viene riprodotto a un certo tempo. Il suono viene quindi eliminato dopo che la scena è finita o dopo che l'oggetto Sound ha terminato la riproduzione.

Chiave di configurazione Descrizione
StartTimeQuando riprodurre l'audio in relazione alla durata della scena, in secondi.
SoundIdID asset dell'audio da riprodurre.
OnStartFunzione personalizzata da attivare quando l'audio inizia a riprodursi.
OnEndFunzione personalizzata da attivare quando l'audio termina la riproduzione.
VolumeVolume dell'oggetto Sound; il valore predefinito è 0.5.
Schema Client
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio in riproduzione")
end,
OnEnd = function(self)
print("Audio terminato")
end
})
end

animate

Crea un' Animation che viene riprodotta a un certo tempo.

Chiave di configurazione Descrizione
StartTimeQuando riprodurre l'animazione in relazione alla durata della scena, in secondi.
EndTimeTempo facoltativo in cui terminare l'animazione in relazione alla durata della scena, in secondi.
RigIl rig di animazione su cui riprodurre l'animazione.
AnimationIdID asset dell'animazione da riprodurre.
SpeedVelocità di riproduzione dell'animazione; il valore predefinito è 1.
FadeInTimeQuantità di tempo per sfumare l'animazione, in secondi; il valore predefinito è 0.2 (secondi).
FadeOutTimeQuantità di tempo per sfumare l'animazione, in secondi; il valore predefinito è 0.2 (secondi).
OnStartFunzione personalizzata da attivare quando l'animazione inizia a riprodursi.
OnEndFunzione personalizzata da attivare quando l'animazione termina la riproduzione.
LoopedSe ripetere l'animazione; il valore predefinito è false.
SyncToAudioTabella che definisce se sincronizzare l'animazione a una configurazione di audio. Accetta le seguenti chiavi:
  • Audio – Riferimento a una configurazione di audio.
  • StartAtAudioTime – Quando riprodurre l'animazione in relazione alla durata dell'audio.
  • EndAtAudioTime – Tempo facoltativo in cui terminare l'animazione in relazione alla durata dell'audio.
Schema Client
Schema.OnRun = function()
print("OnRun (Client)")
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("Animazione in riproduzione")
end,
OnEnd = function(self)
print("Animazione fermata")
end
})
end

tween

Crea un Tween configurabile che viene preservato nella ricerca e nell'ingresso dinamico, il che significa che puoi concatenare tweens in punti separati nel tempo e tutto dovrebbe riprodursi e sincronizzarsi come previsto.

Chiave di configurazione Descrizione
StartTimesTabella di tempi di inizio in relazione alla durata della scena, in secondi.
TweenTabella che definisce l'oggetto e le proprietà da tweenare. Accetta le seguenti chiavi:
  • Object – L'oggetto da tweenare.
  • Info – istanza TweenInfo per il tween, che definisce la sua durata, Enum.EasingStyle, Enum.EasingDirection, ecc.
  • Properties – Proprietà dell'oggetto e valori target associati per il tween.
OnStartFunzione personalizzata da attivare quando il tween inizia a riprodursi.
OnHeartbeatFunzione personalizzata da attivare a ogni Heartbeat; riceve l'alpha del tween come secondo parametro.
OnEndFunzione personalizzata da attivare quando il tween termina la riproduzione.
SyncToAudioTabella che definisce se sincronizzare il tween a una configurazione di audio. Accetta le seguenti chiavi:
  • Audio – Riferimento a una configurazione di audio.
  • StartAtAudioTimes – Tabella di tempi di inizio che definiscono quando riprodurre il tween in relazione alla durata dell'audio.
Schema Client
Schema.OnRun = function()
print("OnRun (Client)")
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 in riproduzione")
end,
OnHeartbeat = function(self, alpha)
print("Alpha del tween", alpha)
end,
OnEnd = function(self)
print("Tween completato")
end,
})
end

interval

Esegue una funzione di callback personalizzata su una durata specificata a una frequenza specificata, in secondi. Utile per eventi ripetitivi come luci lampeggianti, pulsare l'intensità di un audio, ecc. La frequenza più bassa possibile è di 0 secondi, ma tecnicamente la frequenza minima è sempre limitata a Heartbeat.

Chiave di configurazione Descrizione
StartTimeInizio della durata dell'intervallo in relazione alla durata della scena, in secondi.
EndTimeFine della durata dell'intervallo in relazione alla durata della scena, in secondi.
FrequencyQuanto spesso la funzione OnInterval dovrebbe attivarsi, in secondi, con la prima esecuzione che avviene a StartTime.
OnStartFunzione personalizzata da attivare quando inizia la serie di intervalli.
OnIntervalFunzione personalizzata da attivare a ogni intervallo all'interno della durata specificata (StartTime a EndTime).
OnEndFunzione personalizzata da attivare quando termina la serie di intervalli.
SyncToAudioTabella che definisce se sincronizzare la durata dell'intervallo a una configurazione di audio. Accetta le seguenti chiavi:
  • Audio – Riferimento a una configurazione di audio.
  • StartAtAudioTime – Quando avviare la durata dell'intervallo in relazione alla durata dell'audio.
  • EndAtAudioTime – Tempo facoltativo in cui terminare la durata dell'intervallo in relazione alla durata dell'audio.
Schema Client
Schema.OnRun = function()
print("OnRun (Client)")
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

Simile a interval tranne per il fatto che puoi definire più tempi di inizio specifici per lo stesso evento, come programmare un'esibizione di fuochi d'artificio due volte in una scena.

Chiave di configurazione Descrizione
StartTimesTabella di tempi di inizio in relazione alla durata della scena, in secondi.
OnStartFunzione personalizzata da attivare a ogni tempo specificato nella tabella StartTimes.
SkippableBooleano che definisce se l'evento programmato può essere saltato per gli utenti che si uniscono in ritardo, o per quando si cerca avanti rispetto a un tempo di inizio programmato. Se impostato su false, tutti i tempi di inizio dell'evento programmati prima del tempo di unione/ricerca si verificheranno a quel tempo di unione/ricerca. Se impostato su true, solo i tempi di inizio programmati dopo l'unione/ricerca si verificheranno. Il valore predefinito è false.
SyncToAudioTabella che definisce se sincronizzare la programmazione a una configurazione di audio. Accetta le seguenti chiavi:
  • Audio – Riferimento a una configurazione di audio.
  • StartAtAudioTimes – Tabella di tempi di inizio che definiscono quando attivare la funzione OnStart in relazione alla durata dell'audio.
Schema Client
Schema.OnRun = function()
print("OnRun (Client)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Inizializza la connessione temporanea di heartbeat
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Informare il framework della connessione
Schema:inform(tempConnection)
end
})
end

inform

Informare il framework di eventuali moduli, oggetti UI, connessioni, ecc. che vengono creati nell'hook di ciclo di vita OnRun, assicurando che vengano puliti correttamente quando si cerca. I casi d'uso includono:

  • Informare il framework di una connessione temporanea ad hoc come RunService.Heartbeat in modo che la connessione venga pulita quando si cerca a un punto precedente nella durata della scena.

    Schema Server
    Schema.OnRun = function()
    print("OnRun (Server)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Inizializza la connessione temporanea di heartbeat
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Informare il framework della connessione
    Schema:inform(tempConnection)
    end
    })
    end
  • Chiamare una funzione di "pulizia" personalizzata in un ModuleScript che inizializza una connessione o altro riferimento durante l'hook di ciclo di vita OnRun.

    Schema Server
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local RunService = game:GetService("RunService")
    local customModule = require(ReplicatedStorage:WaitForChild("CustomModule"))
    local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    local Schema = SequenziatoreDiEventi.createSchema()
    Schema.OnRun = function()
    print("OnRun (Server)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Chiama la funzione "init" nel modulo personalizzato
    customModule.init()
    -- Chiama la funzione "clean" nel modulo personalizzato durante la pulizia della scena
    Schema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule
    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Inizializza la connessione di heartbeat
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Disconnetti e cancella la connessione di heartbeat
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return CustomModule

Funzioni

loadScene

loadScene(sceneName: string, startTime: number ?)

Carica programmaticamente una scena per sceneName e la avvia a startTime dall'inizio. Ci sarà un "periodo di grazia" di 5 secondi per caricare la scena dal server prima che avvenga la ricerca e la scena inizi a riprodursi. Ciò significa che se chiami loadScene("[SceneName]", 20) esattamente alle 16:15:00, il framework attenderà 5 secondi oltre ai 20 richiesti, avviando la scena alle 16:15:25.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Scopri la prossima scena da caricare quando la scena corrente finisce
SequenziatoreDiEventi.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" è finito; carica la prima scena del concerto
SequenziatoreDiEventi.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" è finito; carica la seconda scena del concerto
SequenziatoreDiEventi.loadScene("Track2")
else
-- Torna alla scena pre-show
SequenziatoreDiEventi.loadScene("PreShow")
end
end)

createSchema

createSchema(): table

Restituisce un'istanza dello schema della scena per creare logica per la scena.

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

seek

seek(time: number)

Cerca il valore time, in secondi, dall'inizio della scena attualmente caricata.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
SequenziatoreDiEventi.seek(95.58)

setSceneWarningTime

setSceneWarningTime(endSceneTimeWindow: number)

Imposta la quantità di tempo dalla fine di tutte le scene in cui viene inviato un avviso. Puoi rilevare l'avviso sia lato client tramite onSceneEndingWarningForClient che lato server tramite onSceneEndingWarningForServer.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Carica la scena
SequenziatoreDiEventi.loadScene("BeautifulScene")
-- Imposta il tempo di avviso a 5 secondi prima che la scena finisca
SequenziatoreDiEventi.setSceneWarningTime(5)
-- Rileva quando la scena sta per finire
SequenziatoreDiEventi.onSceneEndingWarningForServer:Connect(function()
warn("La scena sta per finire!")
end)

setSeekingPermissions

setSeekingPermissions(permissions: table)

Concede il permesso di ricerca in base al PlaceId dell'evento, così come a specifici UserIds e/o gruppi e ruoli al loro interno. Vedi cercare e passare tra le scene per ulteriori informazioni.

getCurrentSceneEnvironment

getCurrentSceneEnvironment(): Folder (YIELDS)

Restituisce la cartella Environment della scena attuale lato client o server, a seconda di se viene chiamata dallo script dello schema Client o dallo script dello schema Server.

Schema Client
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = SequenziatoreDiEventi.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Accedi agli ambienti della scena; non si applica alla Modalità Inline
clientEnvironment = SequenziatoreDiEventi.getCurrentSceneEnvironment()
serverEnvironment = SequenziatoreDiEventi.getCurrentServerEnvironmentFromClient()
print("Il tempo attuale è:", timePositionObject.Value)
end
Schema Server
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = SequenziatoreDiEventi.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
serverEnvironment = SequenziatoreDiEventi.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
end

getCurrentServerEnvironmentFromClient

getCurrentServerEnvironmentFromClient(): Folder (YIELDS)

Restituisce la cartella server-side Environment della scena attuale. A differenza di getCurrentSceneEnvironment, puoi chiamare questa funzione dallo script dello schema Client.

Schema Client
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = SequenziatoreDiEventi.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Accedi agli ambienti della scena; non si applica alla Modalità Inline
clientEnvironment = SequenziatoreDiEventi.getCurrentSceneEnvironment()
serverEnvironment = SequenziatoreDiEventi.getCurrentServerEnvironmentFromClient()
print("Il tempo attuale è:", timePositionObject.Value)
end

isLoadingScene

isLoadingScene(): boolean

Chiamato dal server per sapere se una scena è attualmente in fase di caricamento.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(SequenziatoreDiEventi.isLoadingScene())
while SequenziatoreDiEventi.isLoadingScene() do
task.wait()
end
print("Scena caricata")

Eventi

onSceneEndingWarningForClient

Si attiva sul client prima che la scena stia per finire. Il tempo predefinito è di 3 secondi, ma puoi configurarlo tramite setSceneWarningTime. Questo evento può essere connesso solo in un LocalScript.

LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Rileva quando la scena sta per finire (lato client)
SequenziatoreDiEventi.onSceneEndingWarningForClient:Connect(function()
warn("La scena sta per finire!")
end)

onSceneEndingWarningForServer

Si attiva sul server prima che la scena stia per finire. Il tempo predefinito è di 3 secondi, ma puoi configurarlo tramite setSceneWarningTime. Questo evento può essere connesso solo in un Script.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Rileva quando la scena sta per finire (lato server)
SequenziatoreDiEventi.onSceneEndingWarningForServer:Connect(function()
warn("La scena sta per finire!")
end)

onSceneLoadedForClient

Si attiva sul client quando la scena sta per iniziare. Questo evento può essere connesso solo in un LocalScript.

LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Rileva quando la scena sta per iniziare (lato client)
SequenziatoreDiEventi.onSceneLoadedForClient:Connect(function()
warn("La scena sta per iniziare!")
end)

onOrchestrationFinished

Si attiva sul server quando una scena ha raggiunto la sua durata e ha effettivamente terminato. Questo evento riceve un argomento stringa endedSceneName per il nome della scena appena finita e puoi concatenare questo evento per caricare condizionatamente un'altra scena. Può essere connesso solo in un Script.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SequenziatoreDiEventi = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Scopri la prossima scena da caricare quando la scena corrente finisce
SequenziatoreDiEventi.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" è finito; carica la prima scena del concerto
SequenziatoreDiEventi.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" è finito; carica la seconda scena del concerto
SequenziatoreDiEventi.loadScene("Track2")
else
-- Torna alla scena pre-show
SequenziatoreDiEventi.loadScene("PreShow")
end
end)
© 2026 Roblox Corporation. Roblox, il logo Roblox e Powering Imagination sono tra i nostri marchi registrati e non registrati negli Stati Uniti. e altri paesi.