Evenement Sequencer

*Deze inhoud is vertaald met behulp van AI (bèta) en kan fouten bevatten. Klik hier om deze pagina in het Engels te bekijken.

EvenementSequencer is een krachtig framework dat je in staat stelt om live, cross-server evenementen en cutscenes te bouwen op een gestructureerde volgorde van acties en triggers. Meer specifiek helpt deze module je:

  • Een evenement of cutscene te bouwen op een gestructureerd framework door middel van geplande configuraties van audio, animaties en tweens.
  • Over te schakelen tussen meerdere scènes op meerdere servers, waarbij complexe animaties en visuals worden gesynchroniseerd met een tijdlijn.
  • Door een evenement te zoeken en het spel te previewen voor test- en ontwikkelingsdoeleinden.

Dit framework is uitvoerig getest in Roblox-evenementen zoals de Twenty One Pilots en 24kGoldn concerten, evenals in veel drukbezochte games.

Om EvenementSequencer in actie te zien binnen een bewerkbare plaats, bekijk de Concert template in Roblox Studio. Deze template is een uitgebreid startpunt voor ontwikkelaars om evenementen/concerten te creëren en zich vertrouwd te maken met de verschillende functies en componenten die betrokken zijn.

Module gebruik

Installatie

Om het EvenementSequencer framework in een game te gebruiken:

  1. Open vanuit het Venster menu of de Start tabblad werkbalk de Toolbox en selecteer het Creator Store tabblad.

  2. Zorg ervoor dat de Modellen sortering is geselecteerd, klik dan op de Bekijk Alle knop voor Categorieën.

  3. Zoek en klik op de Pakketten tegel.

  4. Zoek de Evenement Sequencer module en klik erop, of sleep en laat het in de 3D-weergave vallen.

  5. Verplaats in het Explorer venster het gehele EvenementSequencer model naar ServerScriptService. Bij het uitvoeren van het spel zal de module beginnen te draaien.

Framework modi

Vervangmodus

De standaard framework modus is vervangmodus waarin je unieke scènes ontwerpt door 3D-objecten, terrein, verlichtingsinstellingen, milieu-effecten, en gebruikersinterface-objecten in de Omgeving map van die scène te plaatsen. Wanneer een scène laadt, worden die objecten en eigenschappen verdeeld over Workspace, Terrain, en Lighting, vervangend bestaande objecten/eigenschappen om een gekloond ruimte te vormen.

Inline modus

Een alternatieve framework modus is inline modus waarin je op dezelfde manier unieke scènes ontwerpt met scriptlogica voor hun flow/evenementen, maar het framework zal geen bestaande 3D-objecten, terrein, verlichtingsinstellingen, milieu-effecten, en gebruikersinterface-objecten vernietigen om activa/eigenschappen uit de Omgeving map van een scène te klonen bij het laden.

Om inline modus in te schakelen:

  1. Binnen het EvenementSequencer model dat je in ServerScriptService hebt geplaatst, ga naar beneden en selecteer de Inline waarde binnen de ReplicatedStorage map.

  2. In het Eigenschappen venster, schakel het Waarde selectievakje in.

Scènes maken

Een scène is in wezen een onderdeel van een algemeen evenement of een cutscene verpakt in een reeks mappen. Elke scène bevat scriptlogica die de flow/evenementen definieert, en een scène kan zijn eigen 3D-objecten, terrein, verlichtingsinstellingen, milieu-effecten, en gebruikersinterface-objecten opslaan.

Om snel aan de slag te gaan, kun je een lege scène vinden in de hoofdmap van de module:

  1. Vouw de EvenementSequencer map uit en zoek de BlankScene map.

  2. Verplaats of kopieer de gehele BlankScene map naar ReplicatedStorage.

Tijdlengte

Elke scène moet een tijdlengte hebben, in seconden, die de duur ervan definieert — net zoals een film of concert een vaste duur heeft. De tijdlengte wordt gedefinieerd als een numerieke attribuut op de map van de scène genaamd TimeLength die je direct in Studio of programmatisch kunt instellen via Instance:SetAttribute().

Omgeving

De Omgeving map van een scène bevat alles wat gebruikers zien en horen, inclusief 3D-objecten, terrein, verlichtingsinstellingen en milieu-effecten, en gebruikersinterface-objecten. Wanneer een scène laadt, worden die objecten en eigenschappen verdeeld over Workspace, Terrain, en Lighting, waarbij bestaande objecten/eigenschappen worden vervangen om een gekloond ruimte te vormen.

De Omgeving map bevat de volgende containers:

ContainerBeschrijving
ClientBevat alle activa die moeten worden geladen wanneer een gebruiker (client) zich bij het evenement voegt, zoals gebruikersinterface-objecten of een animatierig.
PlayerSpawnsBevat delen waar gebruikers spawnen bij het joinen. Elk deel in deze map gedraagt zich als een SpawnLocation.
ServerBevat alle activa die moeten worden geladen wanneer een scène voor het eerst op een server wordt gemaakt. Het wordt aanbevolen dat de meeste visuele activa hierheen gaan.
TerrainBevat het terrein van de scène.
LightingBevat globale verlichtingsinstellingen als attributen, evenals modifiers zoals atmosferische effecten en post-processing effecten.

Evenementen

De Evenementen map van een scène is puur een placeholder voor RemoteEvents die communiceren tussen de Client en Server modules. Het is niet verplicht om iets in deze map te plaatsen.

Client

Dit script voert schema logica uit op de client.

Server

Dit script voert schema logica uit op de server.

Scene schema's

Een scène's schema definieert wat er op welk punt in de tijdlijn van de scène gebeurt. Je moet een scène's schema definiëren in zowel zijn Client als Server modules en levenscyclus hooks opnemen om te beheren wanneer configuraties plaatsvinden.

Levenscyclus hooks

Schema levenscyclus hooks stellen je in staat om te beheren wanneer scène-operaties plaatsvinden. Een scène in productie zal typisch draaien in de meest eenvoudige flow:

OnRun kan worden onderbroken bij het zoeken:

Alle drie de hooks kunnen ook herhaald worden als de scène opnieuw wordt afgespeeld:

Configuraties

Schema configuraties definiëren de kernoperaties van een scène, bijvoorbeeld audio afspelen op 00:32, een animatie in de wachtrij zetten om te synchroniseren met die audio, een scène-evenement zoals een vuurwerkshow plannen, en meer. Elke configuratie ondersteunt bepaalde callback-functies waarbij de eerste parameter (self) de configuratie-instantie is.

Scènes zoeken

Een unieke functie van EvenementSequencer is de mogelijkheid om "te zoeken" door scènes zoals je misschien door een video zou zoeken. In Vervangmodus kun je ook tussen scènes schakelen om een volledig multi-scène evenement te previewen voordat je het in productie neemt.

Scène zoeken is niet toegankelijk voor iedereen aangezien gebruikers die gewoon van het evenement genieten, niet de mogelijkheid moeten hebben om de tijdstroom ervan te controleren. In plaats daarvan moet je zoektoestemming verlenen op basis van de PlaceId van het evenement, evenals specifieke UserIds en/of groepen en rollen binnen hen.

  1. Maak een nieuwe Script binnen ServerScriptService.

  2. Plak de volgende code in het nieuwe script.

    Script - Stel Zoektoestemming In
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
    EvenementSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Vul de volgende tabellen in binnen de setSeekingPermissions aanroep als volgt:

    placeIDsKomma-gescheiden lijst van PlaceId waarden om binnen te ondersteunen.
    userIDsKomma-gescheiden lijst van UserIds voor degenen die binnen de ondersteunde plaatsen kunnen zoeken.
    groupsKomma-gescheiden lijst van tabellen, elk met een groep ID en de minimale rang van de leden van die groep die binnen de ondersteunde plaatsen kunnen zoeken.

Scene manager plugin

De Scene Manager plugin is een nuttig hulpmiddel voor het laden en ontladen van scènes, verlichting, en terrein. Tenzij je Inline Mode gebruikt, wordt het ten zeerste aanbevolen dat je deze plugin gebruikt in plaats van handmatig scène-objecten en eigenschappen te plaatsen/bewerken.

Om de plugin te installeren:

  1. Open vanuit het Venster menu of de Start tabblad werkbalk de Toolbox.

  2. Met het Creator Store tabblad geselecteerd, selecteer Plugins uit het dropdownmenu.

  3. Typ in het zoekveld Scene Manager en druk op Enter om de plugin te vinden.

  4. Klik op het pictogram van de plugin om de details te bekijken en klik vervolgens op de Installeren knop.

  5. Zodra de plugin is geïnstalleerd, verschijnt deze in het Plugins tabblad van Studio.

Scènes laden en ontladen

Zoals uiteengezet in scènes maken, bevat de Omgeving map van een scène alles wat gebruikers zien en horen, inclusief 3D-objecten. De plugin helpt je snel de activa van een scène in of uit georganiseerde mappen binnen de werkruimte te laden.

Plugin actieBeschrijving
Laad ClientAls de clientinhoud van de scène is ontladen, verplaatst het zijn Omgeving/Client map naar de Workspace/ScenesClient map.
Laad ServerAls de serverinhoud van de scène is ontladen, verplaatst het zijn Omgeving/Server map naar de Workspace/ScenesServer map.
Ontlaad ClientAls de clientinhoud van de scène is geladen, verplaatst het zijn Client map van Workspace/ScenesClient terug naar de [Scene]/Omgeving map.
Ontlaad ServerAls de serverinhoud van de scène is geladen, verplaatst het zijn Server map van Workspace/ScenesServer terug naar de [Scene]/Omgeving map.
Ontlaad Alle ScènesVerplaatst de Client en Server map van elke geladen scène terug naar zijn Omgeving map.

Verlichting opslaan en laden

De top-level Lighting service slaat alle verlichtingsinstellingen en visuele effecten van een plaats op. Aangezien het een top-level service is, kun je het niet handmatig verplaatsen naar een specifieke scène's Omgeving/Server of Omgeving/Client map. In plaats daarvan kun je de plugin gebruiken om zijn eigenschappen en kinderen naar de Omgeving/Verlichting map van de scène te kopiëren.

  1. Configureer de verlichtingsinstellingen van de scène verlichtingsinstellingen, post-processing effecten, atmosferische effecten, en skyboxes via de top-level Lighting service.

  2. Klik in het Scene Manager plugin venster op Verlichting Opslaan voor de gewenste scène.

  3. Selecteer en vouw de Omgeving/Verlichting configuratie van die scène uit en je zult dezelfde verlichtingsinstellingen zien als attributen van de map, evenals gekloonde kinderen van de top-level Lighting service.

    Gekloonde instanties
    Opgeslagen attributen

    Zodra verlichtingsinstellingen en kinderen zijn opgeslagen voor een scène, kun je ze snel terugladen in de top-level Lighting service door op Verlichting Laden te klikken vanuit het plugin venster.

Terrein opslaan en laden

Aangezien Terrain een top-level klasse is binnen Workspace, kun je geen gegenereerd of gesculpteerd terrein handmatig verplaatsen naar een specifieke scène's Omgeving/Server of Omgeving/Client map. In plaats daarvan kun je de plugin gebruiken om het naar de Omgeving/Terrain map van de scène te kopiëren.

  1. Configureer het terrein van de scène via de top-level Terrain service.

  2. Klik in het Scene Manager plugin venster op Terrein Opslaan voor de gewenste scène.

  3. Selecteer en vouw de Omgeving/Terrain map van die scène uit en je zult een TerrainRegion object zien dat het opgeslagen terrein vertegenwoordigt.

    Zodra terrein is opgeslagen voor een scène, kun je het snel terugladen in de top-level Terrain service door op Terrein Laden te klikken vanuit het plugin venster.

API referentie

Schema levenscyclus hooks

OnSetup

De OnSetup levenscyclus hook is bedoeld voor het initialiseren van activa en variabelen die zullen worden geraadpleegd in OnRun of OnEndScene, het opzetten van verbindingen die bedoeld zijn om te duren voor de duur van de scène, enzovoort. Deze hook ontvangt de timePositionObject parameter waarmee je de huidige tijd bij de setup kunt lezen.

Client Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
local Schema = EvenementSequencer.createSchema()
local clientEnvironment
local serverEnvironment
local dummy
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Toegang tot scène omgevingen; geldt niet voor Inline Mode
clientEnvironment = EvenementSequencer.getCurrentSceneEnvironment()
serverEnvironment = EvenementSequencer.getCurrentServerEnvironmentFromClient()
-- Wacht op activa
dummy = clientEnvironment:WaitForChild("Dummy")
print("Huidige tijd is:", timePositionObject.Value)
end
Server Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
local Schema = EvenementSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
-- Toegang tot scène omgeving; geldt niet voor Inline Mode
serverEnvironment = EvenementSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Huidige tijd is:", timePositionObject.Value)
end

OnRun

OnRun is de belangrijkste operationele levenscyclus hook binnen een schema. Het moet alle getimede configuraties voor de scène bevatten, van het afspelen van audio of een animatie tot het plannen van een evenement zoals een vuurwerkshow.

Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio aan het afspelen")
end,
OnEnd = function(self)
print("Audio is afgelopen")
end
})
end

OnEndScene

De OnEndScene levenscyclus hook is nuttig voor het opruimen van alles wat nog openstaat in de scène, zoals het ontkoppelen van verbindingen die zijn gemaakt in OnSetup of OnRun die voor de duur van de scène blijven bestaan.

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

Schema configuraties

audio

Maakt een Sound object in de werkruimte dat op een bepaald moment afspeelt. Het geluid wordt vervolgens verwijderd nadat de scène is afgelopen of nadat het Sound object is afgelopen met afspelen.

Configuratie SleutelBeschrijving
StartTimeWanneer de audio moet worden afgespeeld in relatie tot de scène duur, in seconden.
SoundIdAsset ID van de audio die moet worden afgespeeld.
OnStartAangepaste functie die wordt aangeroepen wanneer de audio begint met afspelen.
OnEndAangepaste functie die wordt aangeroepen wanneer de audio is afgelopen met afspelen.
VolumeVolume van het Sound object; standaard is 0.5.
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio aan het afspelen")
end,
OnEnd = function(self)
print("Audio is afgelopen")
end
})
end

animate

Maakt een Animation die op een bepaald moment afspeelt.

Configuratie SleutelBeschrijving
StartTimeWanneer de animatie moet worden afgespeeld in relatie tot de scène duur, in seconden.
EndTimeOptionele tijd wanneer de animatie moet eindigen in relatie tot de scène duur, in seconden.
RigHet animatierig waarop de animatie moet worden afgespeeld.
AnimationIdAsset ID van de animatie die moet worden afgespeeld.
SpeedAfspeelsnelheid van de animatie; standaard is 1.
FadeInTimeHoeveel tijd om de animatie in te faden, in seconden; standaard is 0.2 (seconden).
FadeOutTimeHoeveel tijd om de animatie uit te faden, in seconden; standaard is 0.2 (seconden).
OnStartAangepaste functie die wordt aangeroepen wanneer de animatie begint met afspelen.
OnEndAangepaste functie die wordt aangeroepen wanneer de animatie is afgelopen met afspelen.
LoopedOf de animatie moet worden herhaald; standaard is false.
SyncToAudioTabel die definieert of de animatie moet worden gesynchroniseerd met een audio configuratie. Accepteert de volgende sleutels:
  • Audio – Referentie naar een audio configuratie.
  • StartAtAudioTime – Wanneer de animatie moet worden afgespeeld in relatie tot de audio's duur.
  • EndAtAudioTime – Optionele tijd waarop de animatie moet eindigen in relatie tot de audio's duur.
Client Schema
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("Animatie aan het afspelen")
end,
OnEnd = function(self)
print("Animatie gestopt")
end
})
end

tween

Maakt een configureerbare Tween die behouden blijft bij het zoeken en in dynamische join, wat betekent dat je tweens kunt ketenen op verschillende tijdstippen en alles zoals verwacht moet afspelen en synchroniseren.

Configuratie SleutelBeschrijving
StartTimesTabel van starttijden in relatie tot de scène duur, in seconden.
TweenTabel die het object en de eigenschappen definieert om te tween. Accepteert de volgende sleutels:
OnStartAangepaste functie die wordt aangeroepen wanneer de tween begint met afspelen.
OnHeartbeatAangepaste functie die wordt aangeroepen bij elke Heartbeat; ontvangt de tween alpha als tweede parameter.
OnEndAangepaste functie die wordt aangeroepen wanneer de tween is afgelopen met afspelen.
SyncToAudioTabel die definieert of de tween moet worden gesynchroniseerd met een audio configuratie. Accepteert de volgende sleutels:
  • Audio – Referentie naar een audio configuratie.
  • StartAtAudioTimes – Tabel van starttijden die definiëren wanneer de tween moet worden afgespeeld in relatie tot de audio's duur.
Client Schema
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 aan het afspelen")
end,
OnHeartbeat = function(self, alpha)
print("Tween alpha", alpha)
end,
OnEnd = function(self)
print("Tween voltooid")
end,
})
end

interval

Voert een aangepaste callbackfunctie uit over een gespecificeerde duur met een gespecificeerde frequentie, in seconden. Nuttig voor herhalende evenementen zoals knipperende lichten, pulserende intensiteit van audio, enz. De laagst mogelijke frequentie is 0 seconden, maar technisch gezien is de minimumfrequentie altijd beperkt tot Heartbeat.

Configuratie SleutelBeschrijving
StartTimeBegin van de intervalduur in relatie tot de scène duur, in seconden.
EndTimeEinde van de intervalduur in relatie tot de scène duur, in seconden.
FrequencyHoe vaak de OnInterval functie moet worden aangeroepen, in seconden, waarbij de eerste uitvoering plaatsvindt bij StartTime.
OnStartAangepaste functie die wordt aangeroepen wanneer de reeks intervallen begint.
OnIntervalAangepaste functie die wordt aangeroepen bij elk interval binnen de gespecificeerde duur (StartTime tot EndTime).
OnEndAangepaste functie die wordt aangeroepen wanneer de reeks intervallen eindigt.
SyncToAudioTabel die definieert of de intervalduur moet worden gesynchroniseerd met een audio configuratie. Accepteert de volgende sleutels:
  • Audio – Referentie naar een audio configuratie.
  • StartAtAudioTime – Wanneer de intervalduur moet beginnen in relatie tot de audio's duur.
  • EndAtAudioTime – Optionele tijd waarop de intervalduur moet eindigen in relatie tot de audio's duur.
Client Schema
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

Vergelijkbaar met interval behalve dat je meerdere specifieke starttijden voor hetzelfde evenement kunt definiëren, zoals het plannen van een vuurwerkshow twee keer in een scène.

Configuratie SleutelBeschrijving
StartTimesTabel van starttijden in relatie tot de scène duur, in seconden.
OnStartAangepaste functie die wordt aangeroepen op elk specifiek tijdstip in de StartTimes tabel.
SkippableBoolean die definieert of het geplande evenement kan worden overgeslagen voor gebruikers die laat joinen, of voor wanneer er vooruit wordt gezocht naar een gepland starttijd. Als ingesteld op false, zullen alle starttijden die vóór de join/zoektijd zijn gepland, plaatsvinden op dat join/zoektijd. Als ingesteld op true, zullen alleen de starttijden die na join/zoek zijn gepland plaatsvinden. Standaard is false.
SyncToAudioTabel die definieert of de planning moet worden gesynchroniseerd met een audio configuratie. Accepteert de volgende sleutels:
  • Audio – Referentie naar een audio configuratie.
  • StartAtAudioTimes – Tabel van starttijden die definiëren wanneer de OnStart functie moet worden aangeroepen in relatie tot de audio's duur.
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Initialiseer tijdelijke heartbeat verbinding
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Informeer framework over verbinding
Schema:inform(tempConnection)
end
})
end

inform

Informeert het framework over modules, UI-objecten, verbindingen, enz. die zijn gemaakt in de OnRun levenscyclus hook, zodat ze correct worden opgeruimd bij zoeken. Gebruiksscenario's omvatten:

  • Het informeren van het framework over een tijdelijke ad-hoc verbinding zoals RunService.Heartbeat zodat de verbinding wordt opgeruimd bij het zoeken naar een eerder punt in de duur van de scène.

    Server Schema
    Schema.OnRun = function()
    print("OnRun (Server)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Initialiseer tijdelijke heartbeat verbinding
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Informeer framework over verbinding
    Schema:inform(tempConnection)
    end
    })
    end
  • Het aanroepen van een aangepaste "opruim" functie in een ModuleScript die een verbinding of andere referentie initialiseert tijdens de OnRun levenscyclus hook.

    Server Schema
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local RunService = game:GetService("RunService")
    local customModule = require(ReplicatedStorage:WaitForChild("CustomModule"))
    local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
    local Schema = EvenementSequencer.createSchema()
    Schema.OnRun = function()
    print("OnRun (Server)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Roep "init" functie aan in aangepaste module
    customModule.init()
    -- Roep "clean" functie aan in aangepaste module bij scène opruimen
    Schema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule
    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Initialiseer heartbeat verbinding
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Ontkoppel en wis heartbeat verbinding
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return CustomModule

Functies

loadScene

loadScene(sceneName: string, startTime: number ?)

Laadt programatisch een scène door sceneName en start deze op startTime vanaf het begin. Er zal een "grace period" van 5 seconden zijn voor de scène om van de server te laden voordat de zoekactie plaatsvindt en de scène begint te spelen. Dit betekent dat als je loadScene("[SceneName]", 20) precies om 16:15:00 aanroept, het framework 5 seconden wacht bovenop de gevraagde 20, waardoor de scène om 16:15:25 begint.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
-- Bepaal de volgende scène om te laden wanneer de huidige scène is afgelopen
EvenementSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" is afgelopen; laad de eerste scène in het concert
EvenementSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" is afgelopen; laad de tweede scène in het concert
EvenementSequencer.loadScene("Track2")
else
-- Loop terug naar de pre-show scène
EvenementSequencer.loadScene("PreShow")
end
end)

createSchema

createSchema(): table

Geeft een instantie van het scène schema terug om logica voor de scène te creëren.

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

seek

seek(time: number)

Zoekt naar de time waarde, in seconden, vanaf het begin van de momenteel geladen scène.

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

setSceneWarningTime

setSceneWarningTime(endSceneTimeWindow: number)

Stelt de hoeveelheid tijd in vanaf het einde van alle scènes waarop een waarschuwing wordt verzonden. Je kunt de waarschuwing detecteren ofwel client-side via onSceneEndingWarningForClient of server-side via onSceneEndingWarningForServer.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
-- Laad scène
EvenementSequencer.loadScene("BeautifulScene")
-- Stel waarschuwingstijd in op 5 seconden voordat de scène eindigt
EvenementSequencer.setSceneWarningTime(5)
-- Detecteer wanneer de scène op het punt staat te eindigen
EvenementSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scène staat op het punt te eindigen!")
end)

setSeekingPermissions

setSeekingPermissions(permissions: table)

Verleent zoektoestemming op basis van de PlaceId van het evenement, evenals specifieke UserIds en/of groepen en rollen binnen hen. Zie zoeken en scènes wisselen voor meer informatie.

getCurrentSceneEnvironment

getCurrentSceneEnvironment(): Folder (YIELDS)

Geeft de client-side of server-side Omgeving map van de huidige scène terug, afhankelijk van of het wordt aangeroepen vanuit de Client schema script of Server schema script respectievelijk.

Client Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
local Schema = EvenementSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Toegang tot scène omgevingen; geldt niet voor Inline Mode
clientEnvironment = EvenementSequencer.getCurrentSceneEnvironment()
serverEnvironment = EvenementSequencer.getCurrentServerEnvironmentFromClient()
print("Huidige tijd is:", timePositionObject.Value)
end
Server Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
local Schema = EvenementSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
serverEnvironment = EvenementSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
end

getCurrentServerEnvironmentFromClient

getCurrentServerEnvironmentFromClient(): Folder (YIELDS)

Geeft de huidige scène's server-side Omgeving map terug. In tegenstelling tot getCurrentSceneEnvironment, kun je dit aanroepen vanuit de Client schema script.

Client Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
local Schema = EvenementSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Toegang tot scène omgevingen; geldt niet voor Inline Mode
clientEnvironment = EvenementSequencer.getCurrentSceneEnvironment()
serverEnvironment = EvenementSequencer.getCurrentServerEnvironmentFromClient()
print("Huidige tijd is:", timePositionObject.Value)
end

isLoadingScene

isLoadingScene(): boolean

Wordt vanuit de server aangeroepen om te weten of een scène momenteel aan het laden is.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
print(EvenementSequencer.isLoadingScene())
while EvenementSequencer.isLoadingScene() do
task.wait()
end
print("Scène geladen")

Evenementen

onSceneEndingWarningForClient

Vindt plaats op de client voordat de scène op het punt staat te eindigen. De standaardtijd is 3 seconden, maar je kunt deze configureren via setSceneWarningTime. Dit evenement kan alleen worden verbonden in een LocalScript.

LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
-- Detecteer wanneer de scène op het punt staat te eindigen (client-side)
EvenementSequencer.onSceneEndingWarningForClient:Connect(function()
warn("Scène staat op het punt te eindigen!")
end)

onSceneEndingWarningForServer

Vindt plaats op de server voordat de scène op het punt staat te eindigen. De standaardtijd is 3 seconden, maar je kunt deze configureren via setSceneWarningTime. Dit evenement kan alleen worden verbonden in een Script.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
-- Detecteer wanneer de scène op het punt staat te eindigen (server-side)
EvenementSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scène staat op het punt te eindigen!")
end)

onSceneLoadedForClient

Vindt plaats op de client wanneer de scène begint. Dit evenement kan alleen worden verbonden in een LocalScript.

LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
-- Detecteer wanneer de scène begint (client-side)
EvenementSequencer.onSceneLoadedForClient:Connect(function()
warn("Scène begint!")
end)

onOrchestrationFinished

Vindt plaats op de server wanneer een scène zijn tijdlengte heeft bereikt en effectief is afgelopen. Dit evenement ontvangt een endedSceneName string naamargument voor de scène die net is afgelopen en je kunt op dit evenement conditioneel een andere scène laden. Kan alleen worden verbonden in een Script.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EvenementSequencer = require(ReplicatedStorage:WaitForChild("EvenementSequencer"))
-- Bepaal de volgende scène om te laden wanneer de huidige scène is afgelopen
EvenementSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" is afgelopen; laad de eerste scène in het concert
EvenementSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" is afgelopen; laad de tweede scène in het concert
EvenementSequencer.loadScene("Track2")
else
-- Loop terug naar de pre-show scène
EvenementSequencer.loadScene("PreShow")
end
end)
©2026 Roblox Corporation. Roblox, het Roblox-logo en Powering Imagination behoren tot onze geregistreerde en niet-geregistreerde handelsmerken in de VS en andere landen.