Ereignis-Sequencer ist ein leistungsstarkes Framework, das es Ihnen ermöglicht, Live-Events und Schnittszenen auf einer strukturierten Abfolge von Aktionen und Auslösern zu erstellen. Genauer gesagt, hilft Ihnen dieses Modul dabei:
- Ein Ereignis oder eine Schnittszene auf einem strukturierten Framework durch geplante Konfigurationen von Audio, Animationen und Tweens zu erstellen.
- Zwischen mehreren Szenen über mehrere Server zu wechseln und komplexe Animationen und visuelle Effekte mit einer Zeitachse zu synchronisieren.
- Durch ein Ereignis zu suchen und die Erfahrung zur Test- und Entwicklungszwecken zu überprüfen.
Dieses Framework wurde in Roblox-Events wie den Konzerten von Twenty One Pilots und 24kGoldn sowie vielen stark frequentierten Erlebnissen erprobt.
Um Ereignis-Sequencer in Aktion innerhalb eines bearbeitbaren Platzes zu sehen, überprüfen Sie die Konzert Vorlage in Roblox Studio. Diese Vorlage ist ein umfassender Ausgangspunkt für Entwickler, um Events/Konzerte zu erstellen und sich mit den verschiedenen Funktionen und Komponenten vertraut zu machen.

Modulnutzung
Installation
Um das Ereignis-Sequencer-Framework in einem Erlebnis zu verwenden:
Öffnen Sie über das Fenster-Menü oder die Start-Tab-Leiste von Studio die Toolbox und wählen Sie den Tab Creator Store.

Stellen Sie sicher, dass die Sortierung Modelle ausgewählt ist, und klicken Sie dann auf die Schaltfläche Alle anzeigen für Kategorien.

Suchen und klicken Sie auf die Kachel Pakete.
Suchen Sie das Modul Ereignis-Sequencer und klicken Sie darauf oder ziehen Sie es in die 3D-Ansicht.

Verschieben Sie im Explorer-Fenster das gesamte Ereignis-Sequencer-Modell in ServerScriptService. Bei Ausführung des Erlebnisses wird das Modul zu laufen beginnen.
Framework-Modi
Ersetzen-Modus
Der Standard-Framework-Modus ist Ersetzen-Modus, in dem Sie einzigartige Szenen entwerfen, indem Sie 3D-Objekte, Gelände, Licht-Eigenschaften, Umwelt-Effekte und Benutzeroberflächenobjekte in den Umgebungs-Ordner dieser Szene einfügen. Wenn eine Szene geladen wird, werden diese Objekte und Eigenschaften in Workspace, Terrain und Lighting verteilt und ersetzen bestehende Objekte/Eigenschaften und bilden so einen klonierten Raum.
Inline-Modus
Ein alternativer Framework-Modus ist Inline-Modus, in dem Sie ebenfalls einzigartige Szenen mit Skriptlogik für ihren Ablauf/Ereignisse entwerfen können, aber das Framework wird nicht bestehende 3D-Objekte, Gelände, Licht-Eigenschaften, Umwelt-Effekte und Benutzeroberflächenobjekte zerstören, um Assets/Eigenschaften aus dem Umgebungs-Ordner einer Szene beim Laden zu klonen.
Um den Inline-Modus zu aktivieren:
Wählen Sie im Ereignis-Sequencer-Modell, das Sie im ServerScriptService platziert haben, den Inline-Wert im ReplicatedStorage-Ordner aus.

Aktivieren Sie im Eigenschaften-Fenster das контрольkästchen Wert.

Szenen erstellen
Eine Szene ist im Wesentlichen Teil eines Gesamtereignisses oder einer Schnittszene, die in einer Reihe von Ordnern verpackt ist. Jede Szene enthält Skriptlogik, die ihren Ablauf/Ereignisse definiert, und eine Szene kann ihre eigenen 3D-Objekte, Gelände, Licht-Eigenschaften, Umwelt-Effekte und Benutzeroberflächenobjekte speichern.
Um schnell zu starten, können Sie eine leere Szene im Hauptordner des Moduls finden:
Erweitern Sie den Ereignis-Sequencer-Ordner und suchen Sie den BlankScene-Ordner.

Verschieben Sie den gesamten BlankScene-Ordner in den ReplicatedStorage.

Zeitlänge
Jede Szene sollte eine Zeitlänge in Sekunden haben, die ihre Dauer definiert – genau wie ein Film oder Konzert eine feste Dauer hat. Die Zeitlänge wird als numerisches Attribut im Ordner der Szene mit dem Namen TimeLength definiert, das Sie direkt in Studio oder programmatisch über Instance:SetAttribute() einstellen können.


Umgebung
Der Umgebungs-Ordner einer Szene enthält alles, was Benutzer sehen und hören, einschließlich 3D-Objekte, Gelände, Licht-Eigenschaften und Umwelt-Effekte sowie Benutzeroberflächenobjekte. Wenn eine Szene geladen wird, werden diese Objekte und Eigenschaften in Workspace, Terrain und Lighting verteilt, wobei bestehende Objekte/Eigenschaften ersetzt werden, um einen klonierten Raum zu bilden.
Der Umgebungs-Ordner enthält die folgenden Container:
| Container | Beschreibung |
|---|---|
| Client | Enthält alle Assets, die geladen werden sollen, wenn ein Benutzer (Client) dem Ereignis beitritt, wie Benutzeroberflächenobjekte oder ein Animationsrig. |
| PlayerSpawns | Enthält Teile, wo Benutzer beim Beitritt spawnen. Jedes Teil in diesem Ordner verhält sich ähnlich wie ein SpawnLocation. |
| Server | Enthält alle Assets, die geladen werden sollen, wenn eine Szene zum ersten Mal auf einem Server erstellt wird. Es wird empfohlen, die meisten visuellen Assets hierhin zu verschieben. |
| Terrain | Enthält das Gelände der Szene. |
| Lighting | Enthält globale Licht-Eigenschaften als Attribute sowie Modifikatoren wie atmosphärische Effekte und Nachbearbeitungs Effekte. |
Ereignisse
Der Ereignisse-Ordner einer Szene dient ausschließlich als Platzhalter für RemoteEvents, die zwischen den Client- und Server-Modulen kommunizieren. Es ist nicht erforderlich, etwas in diesem Ordner zu platzieren.
Client
Dieses Skript führt die Schema-Logik auf dem Client aus.
Server
Dieses Skript führt die Schema-Logik auf dem Server aus.
Szenenschemas
Das Schema einer Szene definiert, was zu welchem Zeitpunkt der Zeitachse der Szene passiert. Sie sollten das Schema einer Szene in beiden Modulen Client und Server definieren und Lebenszyklus-Hooks einschließen, um zu verwalten, wann Konfigurationen stattfinden.
Lebenszyklus-Hooks
Schema Lebenszyklus-Hooks ermöglichen es Ihnen, zu steuern, wann Szenenoperationen stattfinden. Eine Szene in der Produktion läuft typischerweise in der einfachsten Abfolge:
OnRun kann unterbrochen werden, wenn gesucht wird:
Alle drei Hooks können auch wiederholt werden, wenn die Szene wiederholt wird:
Konfigurationen
Schema Konfigurationen definieren die grundlegenden Operationen einer Szene, z.B. Audio abspielen bei 00:32, eine Animation bereitstellen, die mit diesem Audio synchronisiert ist, einen Ereignisplan wie eine Feuerwerkshow planen und mehr. Jede Konfiguration unterstützt bestimmte Rückruffunktionen, wobei der erste Parameter (self) die Konfiguration-Instanz ist.
Szenen suchen
Ein einzigartiges Merkmal des Ereignis-Sequenzers ist die Möglichkeit, in Szenen zu "suchen", wie Sie es bei einem Video tun würden. Im Ersetzen-Modus können Sie auch zwischen Szenen wechseln, um ein gesamtes mehrszenen Ereignis vor der Bereitstellung in der Produktion zu betrachten.
Szenensuche ist nicht für jeden zugänglich, da Benutzer, die einfach das Ereignis genießen, nicht die Fähigkeit haben sollten, den Zeitfluss zu steuern. Stattdessen müssen Sie die Erlaubnis zur Suche basierend auf der PlaceId des Ereignisses sowie bestimmten UserIds und/oder Gruppen und Rollen innerhalb dieser gewähren.
Erstellen Sie ein neues Script in ServerScriptService.
Fügen Sie den folgenden Code in das neue Skript ein.
Skript - Suchegenehmigungen festlegenlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))EreignisSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})Füllen Sie die folgenden Tabellen innerhalb des setSeekingPermissions-Aufrufs wie folgt aus:
placeIDs Komma-separierte Liste von PlaceId-Werten, um das Suchen zu unterstützen. userIDs Komma-separierte Liste von UserIds, die innerhalb der unterstützten Plätze suchen können. groups Komma-separierte Liste von Tabellen, die jeweils eine Gruppe-ID und den Mindestgrad der Mitglieder dieser Gruppe enthalten, die innerhalb der unterstützten Plätze suchen können.
Szenenmanager-Plugin
Das Szenenmanager Plugin ist ein nützliches Tool zum Laden und Entladen von Szenen, Beleuchtung und Gelände. Es wird dringend empfohlen, dieses Plugin anstelle des manuellen Platzierens/Bearbeitens von Szeneobjekten und -eigenschaften zu verwenden, es sei denn, Sie verwenden den Inline-Modus.
Um das Plugin zu installieren:
Öffnen Sie über das Fenster-Menü oder die Start-Tab-Leiste von Studio die Toolbox.
Wählen Sie mit ausgewähltem Tab Creator Store im Dropdown-Menü Plugins aus.
Geben Sie im Suchfeld Szenenmanager ein und drücken Sie Enter, um das Plugin zu finden.

Klicken Sie auf das Symbol des Plugins, um seine Details anzuzeigen, und klicken Sie dann auf die Schaltfläche Installieren.
Sobald das Plugin installiert ist, erscheint es im Plugins-Tab von Studio.
Szenen laden und entladen
Wie im Abschnitt Szenen erstellen beschrieben, enthält der Umgebungs-Ordner einer Szene alles, was Benutzer sehen und hören, einschließlich 3D-Objekte. Das Plugin hilft Ihnen, die Assets einer Szene schnell in oder aus organisierten Ordnern innerhalb des Arbeitsbereichs zu laden.
| Plugin-Aktion | Beschreibung |
|---|---|
| Client laden | Wenn der Client-Inhalt der Szene entladen ist, bewegt es den Ordner Umgebungs/Client in den Ordner Arbeitsbereich/SzenenClient. |
| Server laden | Wenn der Server-Inhalt der Szene entladen ist, bewegt es den Ordner Umgebungs/Server in den Ordner Arbeitsbereich/SzenenServer. |
| Client entladen | Wenn der Client-Inhalt der Szene geladen ist, bewegt es den Ordner Client von Arbeitsbereich/SzenenClient zurück in den [Szene]/Umgebungs-Ordner. |
| Server entladen | Wenn der Server-Inhalt der Szene geladen ist, bewegt es den Ordner Server von Arbeitsbereich/SzenenServer zurück in den [Szene]/Umgebungs-Ordner. |
| Alle Szenen entladen | Bewegt den Client und Server-Ordner jeder geladenen Szene zurück in ihren Umgebungs-Ordner. |
Beleuchtung speichern und laden
Der oberste Lighting-Dienst speichert alle Beleuchtungseigenschaften und visuellen Effekte eines Platzes. Da er ein oberster Dienst ist, können Sie ihn nicht manuell in einen bestimmten Umgebungs/Server- oder Umgebungs/Client-Ordner einer Szene verschieben. Stattdessen können Sie das Plugin verwenden, um seine Eigenschaften und Kinder in den Umgebungs/Beleuchtung-Ordner der Szene zu kopieren.
Konfigurieren Sie die Licht-Eigenschaften, Nachbearbeitungs Effekte, atmosphärische Effekte und Himmelsbilder der Szene über den höchsten Lighting-Dienst.

Klicken Sie im Szenenmanager-Plugin-Fenster auf Beleuchtung speichern für die gewünschte Szene.
Wählen Sie den Umgebungs/Beleuchtung-Konfiguration dieser Szene aus und erweitern Sie diese; Sie sehen die gleichen Beleuchtungseigenschaften als Attribute des Ordners sowie geklonte Kinder des obersten Lighting-Dienstes.

Geklonte Instanzen 
Gespeicherte Attribute Sobald Beleuchtungseigenschaften und Kinder für eine Szene gespeichert sind, können Sie sie schnell wieder in den obersten Lighting-Dienst laden, indem Sie im Plugin-Fenster auf Beleuchtung laden klicken.
Gelände speichern und laden
Da Terrain eine oberste Klasse innerhalb von Workspace ist, können Sie nicht manuell generiertes oder skulptiertes Gelände in einen bestimmten Umgebungs/Server- oder Umgebungs/Client-Ordner einer Szene verschieben. Stattdessen können Sie das Plugin verwenden, um es in den Umgebungs/Terrain-Ordner der Szene zu kopieren.
Konfigurieren Sie das Gelände der Szene mithilfe des obersten Terrain-Dienstes.

Klicken Sie im Szenenmanager-Plugin-Fenster auf Terrain speichern für die gewünschte Szene.
Wählen Sie den Umgebungs/Terrain-Ordner dieser Szene aus und erweitern Sie diesen; Sie sehen ein TerrainRegion-Objekt, das das gespeicherte Gelände repräsentiert.

Sobald Gelände für eine Szene gespeichert ist, können Sie es schnell wieder in den obersten Terrain-Dienst laden, indem Sie im Plugin-Fenster auf Terrain laden klicken.
API-Referenz
Schema Lebenszyklus-Hooks
OnSetup
Der OnSetup-Lebenszyklus-Hook dient dazu, Assets und Variablen zu initialisieren, die in OnRun oder OnEndScene referenziert werden, um Verbindungen einzurichten, die für die Dauer der Szene bestehen bleiben sollen usw. Dieser Hook erhält den Parameter timePositionObject, der es Ihnen ermöglicht, die aktuelle Zeit beim Setup zu lesen.
Client-Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
local Schema = EreignisSequencer.createSchema()
local clientEnvironment
local serverEnvironment
local dummy
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Greifen Sie auf die Szenenumgebungen zu; gilt nicht für den Inline-Modus
clientEnvironment = EreignisSequencer.getCurrentSceneEnvironment()
serverEnvironment = EreignisSequencer.getCurrentServerEnvironmentFromClient()
-- Warten Sie auf Assets
dummy = clientEnvironment:WaitForChild("Dummy")
print("Aktuelle Zeit ist:", timePositionObject.Value)
end
Server-Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
local Schema = EreignisSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
-- Greifen Sie auf die Szenenumgebung zu; gilt nicht für den Inline-Modus
serverEnvironment = EreignisSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Aktuelle Zeit ist:", timePositionObject.Value)
end
OnRun
OnRun ist der Hauptbetriebs-Lebenszyklus-Hook innerhalb eines Schemas. Es sollte alle zeitlich abgestimmten Konfigurationen für die Szene enthalten, vom Abspielen von Audio oder einer Animation bis hin zu Ereignis planen wie ein Feuerwerk.
Client-Schema
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio wird abgespielt")
end,
OnEnd = function(self)
print("Audio beendet")
end
})
end
OnEndScene
Der OnEndScene-Lebenszyklus-Hook ist nützlich, um alles Ausstehende in der Szene zu säubern, wie z.B. Verbindungen zu trennen, die in OnSetup oder OnRun erstellt wurden und während der Dauer der Szene bestehen bleiben.
Server-Schema
Schema.OnEndScene = function()
print("OnEndScene (Server)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end
Schema-Konfigurationen
audio
Erstellt ein Sound-Objekt im Arbeitsbereich, das zu einem bestimmten Zeitpunkt abgespielt wird. Der Sound wird dann gelöscht, nachdem die Szene beendet ist oder nachdem das Sound-Objekt das Abspielen abgeschlossen hat.
| Konfigurationsschlüssel | Beschreibung |
|---|---|
| StartTime | Wann das Audio in Bezug auf die Szenenlänge abgespielt werden soll, in Sekunden. |
| SoundId | Asset-ID des abzuspielenden Audios. |
| OnStart | Benutzerdefinierte Funktion, die ausgeführt wird, wenn das Audio zu spielen beginnt. |
| OnEnd | Benutzerdefinierte Funktion, die ausgeführt wird, wenn das Audio zu Ende gespielt wurde. |
| Volume | Lautstärke des Sound-Objekts; Standardwert ist 0.5. |
Client-Schema
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio wird abgespielt")
end,
OnEnd = function(self)
print("Audio beendet")
end
})
end
animate
Erstellt eine Animation, die zu einem bestimmten Zeitpunkt abgespielt wird.
| Konfigurationsschlüssel | Beschreibung |
|---|---|
| StartTime | Wann die Animation in Bezug auf die Szenenlänge abgespielt werden soll, in Sekunden. |
| EndTime | Optionale Zeit, wann die Animation in Bezug auf die Szenenlänge enden soll, in Sekunden. |
| Rig | Das Animations-Rig, auf dem die Animation abgespielt werden soll. |
| AnimationId | Asset-ID der abzuspielenden Animation. |
| Speed | Wiedergabegeschwindigkeit der Animation; Standardwert ist 1. |
| FadeInTime | Die Zeit, die benötigt wird, um die Animation einzublenden, in Sekunden; Standardwert ist 0.2 (Sekunden). |
| FadeOutTime | Die Zeit, die benötigt wird, um die Animation auszublenden, in Sekunden; Standardwert ist 0.2 (Sekunden). |
| OnStart | Benutzerdefinierte Funktion, die ausgeführt wird, wenn die Animation zu spielen beginnt. |
| OnEnd | Benutzerdefinierte Funktion, die ausgeführt wird, wenn die Animation zu Ende gespielt wurde. |
| Looped | Ob die Animation in einer Schleife abgespielt werden soll; Standardwert ist false. |
| SyncToAudio | Tabelle, die definiert, ob die Animation mit einer Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
|
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("Animation wird abgespielt")
end,
OnEnd = function(self)
print("Animation gestoppt")
end
})
end
tween
Erstellt ein konfigurierbares Tween, das beim Suchen und im dynamischen Beitritt beibehalten wird, was bedeutet, dass Sie Tweens zu separaten Zeitpunkten verketten können und alles sollte wie erwartet abgespielt und synchronisiert werden.
| Konfigurationsschlüssel | Beschreibung |
|---|---|
| StartTimes | Tabelle der Startzeiten in Bezug auf die Szenenlänge, in Sekunden. |
| Tween | Tabelle, die das Objekt und die Eigenschaften definiert, die getweent werden sollen. Akzeptiert die folgenden Schlüssel:
|
| OnStart | Benutzerdefinierte Funktion, die ausgeführt wird, wenn das Tween zu spielen beginnt. |
| OnHeartbeat | Benutzerdefinierte Funktion, die bei jedem Heartbeat ausgeführt wird; empfängt die Tween-Alpha als zweiten Parameter. |
| OnEnd | Benutzerdefinierte Funktion, die ausgeführt wird, wenn das Tween beendet ist. |
| SyncToAudio | Tabelle, die definiert, ob das Tween mit einer Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
|
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 wird abgespielt")
end,
OnHeartbeat = function(self, alpha)
print("Tween-Alphas", alpha)
end,
OnEnd = function(self)
print("Tween abgeschlossen")
end,
})
end
interval
Führt eine benutzerdefinierte Rückruffunktion über eine angegebene Dauer mit einer bestimmte Frequenz in Sekunden aus. Nützlich für wiederholte Ereignisse wie blinkende Lichter, Pulsieren der Intensität eines Audios usw. Die niedrigste mögliche Frequenz ist 0 Sekunden, aber technisch gesehen wird die Mindestfrequenz immer auf Heartbeat geklemmt.
| Konfigurationsschlüssel | Beschreibung |
|---|---|
| StartTime | Beginn der Intervalldauer in Bezug auf die Szenenlänge, in Sekunden. |
| EndTime | Ende der Intervalldauer in Bezug auf die Szenenlänge, in Sekunden. |
| Frequency | Wie oft die OnInterval-Funktion ausgeführt werden soll, in Sekunden, wobei die erste Ausführung bei StartTime erfolgt. |
| OnStart | Benutzerdefinierte Funktion, die ausgeführt wird, wenn die Reihe von Intervallen beginnt. |
| OnInterval | Benutzerdefinierte Funktion, die bei jedem Intervall innerhalb der angegebenen Dauer (StartTime bis EndTime) ausgeführt wird. |
| OnEnd | Benutzerdefinierte Funktion, die ausgeführt wird, wenn die Reihe von Intervallen endet. |
| SyncToAudio | Tabelle, die definiert, ob die Intervall-Dauer mit einer Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
|
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
Ähnlich wie interval, es sei denn, Sie können mehrere spezifische Startzeiten für dasselbe Ereignis definieren, wie z.B. eine Feuerwerkshow zweimal in einer Szene zu planen.
| Konfigurationsschlüssel | Beschreibung |
|---|---|
| StartTimes | Tabelle von Startzeiten in Bezug auf die Szenenlänge, in Sekunden. |
| OnStart | Benutzerdefinierte Funktion, die zu jedem festgelegten Zeitpunkt in der StartTimes-Tabelle ausgeführt wird. |
| Skippable | Boolesch, die definiert, ob das geplante Ereignis für Benutzer, die zu spät beitreten, oder für das Vor-suchen eines vorbereiteten Startzeitpunkts übersprungen werden kann. Wenn auf false gesetzt, werden alle festgelegten Startzeiten, die vor dem Beitritt/der Suche liegen, zu diesem Beitritt/der Suche ausgeführt. Wenn auf true gesetzt, werden nur die Startzeiten ausgeführt, die nach dem Beitritt/der Suche festgelegt sind. Standardwert ist false. |
| SyncToAudio | Tabelle, die definiert, ob das Zeitplan mit einer Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
|
Client-Schema
Schema.OnRun = function()
print("OnRun (Client)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Temporäre Herzschlagverbindung initialisieren
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Rahmen über die Verbindung informieren
Schema:inform(tempConnection)
end
})
end
inform
Informiert das Framework über beliebige Module, UI-Objekte, Verbindungen usw., die im OnRun-Lebenszyklus-Hook erstellt werden, um sicherzustellen, dass sie beim Suchen ordnungsgemäß gereinigt werden. Anwendungsfälle sind:
Informieren Sie das Framework über eine temporäre Ad-hoc-Verbindung wie RunService.Heartbeat, sodass die Verbindung bei der Suche nach einem früheren Punkt in der Dauer der Szene gereinigt wird.
Server-SchemaSchema.OnRun = function()print("OnRun (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Temporäre Herzschlagverbindung initialisierenlocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Rahmen über die Verbindung informierenSchema:inform(tempConnection)end})endAufrufen einer benutzerdefinierten "Cleanup"-Funktion in einem ModuleScript, die eine Verbindung oder einen anderen Verweis während des OnRun-Lebenszyklus-Hooks initialisiert.
Server-Schemalocal ReplicatedStorage = game:GetService("ReplicatedStorage")local RunService = game:GetService("RunService")local customModule = require(ReplicatedStorage:WaitForChild("CustomModule"))local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))local Schema = EreignisSequencer.createSchema()Schema.OnRun = function()print("OnRun (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Rufen Sie die "init"-Funktion im benutzerdefinierten Modul aufcustomModule.init()-- Rufen Sie die "clean"-Funktion im benutzerdefinierten Modul bei der Szenenreinigung aufSchema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- Herzschlagverbindung initialisierenCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- Trennen und Herzschlagverbindung löschenif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
Funktionen
loadScene
loadScene(sceneName: string, startTime: number ?)
Lädt programmgesteuert eine Szene nach sceneName und startet sie bei startTime von ihrem Anfang. Es gibt eine "Grace-Periode" von 5 Sekunden, damit die Szene vom Server geladen werden kann, bevor die Suche erfolgt und die Szene zu spielen beginnt. Das bedeutet, dass, wenn Sie loadScene("[SceneName]", 20) genau um 16:15:00 anrufen, das Framework 5 Sekunden plus die angeforderte 20 Sekunden wartet, um die Szene um 16:15:25 zu starten.
Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
-- Finden Sie die nächste Szene heraus, die geladen werden soll, wenn die aktuelle Szene beendet ist
EreignisSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "Vor-Show" then
-- "Vor-Show" beendet; Laden Sie die erste Szene im Konzert
EreignisSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" beendet; Laden Sie die zweite Szene im Konzert
EreignisSequencer.loadScene("Track2")
else
-- Zur Vor-Show-Szene zurückkehren
EreignisSequencer.loadScene("Vor-Show")
end
end)
createSchema
createSchema(): table
Gibt eine Instanz des Szenen-Schemas zurück, um Logik für die Szene zu erstellen.
Client-Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
local Schema = EreignisSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
end
seek
seek(time: number)
Suche zum time-Wert, in Sekunden, vom Beginn der aktuell geladenen Szene.
Skriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))EreignisSequencer.seek(95.58)
setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
Legt die Zeitspanne vom Ende aller Szenen fest, in der eine Warnung ausgegeben wird. Sie können die Warnung entweder clientseitig über onSceneEndingWarningForClient oder serverseitig über onSceneEndingWarningForServer erkennen.
Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
-- Szene laden
EreignisSequencer.loadScene("SchöneSzene")
-- Warnzeit auf 5 Sekunden vor dem Ende der Szene festlegen
EreignisSequencer.setSceneWarningTime(5)
-- Erkennen, wann die Szene kurz vor dem Ende steht
EreignisSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Szene steht kurz vor dem Ende!")
end)
setSeekingPermissions
setSeekingPermissions(permissions: table)
Gewährt Erlaubnis zum Suchen basierend auf der PlaceId des Ereignisses sowie spezifischen UserIds und/oder Gruppen und Rollen innerhalb dieser. Siehe Suche und Szenen wechseln für weitere Informationen.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
Gibt den aktuellen Szenen-Client- oder Server-seitigen Umgebungs-Ordner zurück, je nachdem, ob er aus dem Client-Schema-Skript oder Server-Schema-Skript aufgerufen wird.
Client-Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
local Schema = EreignisSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Greifen Sie auf die Szenenumgebungen zu; gilt nicht für den Inline-Modus
clientEnvironment = EreignisSequencer.getCurrentSceneEnvironment()
serverEnvironment = EreignisSequencer.getCurrentServerEnvironmentFromClient()
print("Aktuelle Zeit ist:", timePositionObject.Value)
end
Server-Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
local Schema = EreignisSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
serverEnvironment = EreignisSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
end
getCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
Gibt den aktuellen Szenen- server-seitigen Umgebungs-Ordner zurück. Im Gegensatz zu getCurrentSceneEnvironment können Sie dies aus dem Client-Schema-Skript aufrufen.
Client-Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
local Schema = EreignisSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Greifen Sie auf die Szenenumgebungen zu; gilt nicht für den Inline-Modus
clientEnvironment = EreignisSequencer.getCurrentSceneEnvironment()
serverEnvironment = EreignisSequencer.getCurrentServerEnvironmentFromClient()
print("Aktuelle Zeit ist:", timePositionObject.Value)
end
isLoadingScene
isLoadingScene(): boolean
Wird vom Server aufgerufen, um festzustellen, ob eine Szene gerade geladen wird.
Skriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))print(EreignisSequencer.isLoadingScene())while EreignisSequencer.isLoadingScene() dotask.wait()endprint("Szene geladen")
Ereignisse
onSceneEndingWarningForClient
Findet auf dem Client statt, bevor die Szene kurz vor dem Ende steht. Die Standardzeit beträgt 3 Sekunden, Sie können sie jedoch über setSceneWarningTime konfigurieren. Dieses Ereignis kann nur in einem LocalScript verbunden werden.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
-- Erkennen, wann die Szene kurz vor dem Ende steht (clientseitig)
EreignisSequencer.onSceneEndingWarningForClient:Connect(function()
warn("Szene steht kurz vor dem Ende!")
end)
onSceneEndingWarningForServer
Findet auf dem Server statt, bevor die Szene kurz vor dem Ende steht. Die Standardzeit beträgt 3 Sekunden, Sie können sie jedoch über setSceneWarningTime konfigurieren. Dieses Ereignis kann nur in einem Script verbunden werden.
Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
-- Erkennen, wann die Szene kurz vor dem Ende steht (serverseitig)
EreignisSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Szene steht kurz vor dem Ende!")
end)
onSceneLoadedForClient
Findet auf dem Client statt, wenn die Szene startet. Dieses Ereignis kann nur in einem LocalScript verbunden werden.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
-- Erkennen, wann die Szene startet (clientseitig)
EreignisSequencer.onSceneLoadedForClient:Connect(function()
warn("Szene startet!")
end)
onOrchestrationFinished
Findet auf dem Server statt, wenn eine Szene ihre Zeitlänge erreicht hat und effektiv beendet ist. Dieses Ereignis erhält ein endedSceneName-String-Argument für die Szene, die gerade beendet wurde, und Sie können dieses Ereignis verwenden, um bedingt eine andere Szene zu laden. Es kann nur in einem Script verbunden werden.
Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
-- Finden Sie die nächste Szene heraus, die geladen werden soll, wenn die aktuelle Szene beendet ist
EreignisSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "Vor-Show" then
-- "Vor-Show" beendet; Laden Sie die erste Szene im Konzert
EreignisSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" beendet; Laden Sie die zweite Szene im Konzert
EreignisSequencer.loadScene("Track2")
else
-- Zur Vor-Show-Szene zurückkehren
EreignisSequencer.loadScene("Vor-Show")
end
end)