Ereignis-Sequencer

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

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:

  1. Öffnen Sie über das Fenster-Menü oder die Start-Tab-Leiste von Studio die Toolbox und wählen Sie den Tab Creator Store.

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

  3. Suchen und klicken Sie auf die Kachel Pakete.

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

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

  1. Wählen Sie im Ereignis-Sequencer-Modell, das Sie im ServerScriptService platziert haben, den Inline-Wert im ReplicatedStorage-Ordner aus.

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

  1. Erweitern Sie den Ereignis-Sequencer-Ordner und suchen Sie den BlankScene-Ordner.

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

ContainerBeschreibung
ClientEnthält alle Assets, die geladen werden sollen, wenn ein Benutzer (Client) dem Ereignis beitritt, wie Benutzeroberflächenobjekte oder ein Animationsrig.
PlayerSpawnsEnthält Teile, wo Benutzer beim Beitritt spawnen. Jedes Teil in diesem Ordner verhält sich ähnlich wie ein SpawnLocation.
ServerEnthä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.
TerrainEnthält das Gelände der Szene.
LightingEnthä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.

  1. Erstellen Sie ein neues Script in ServerScriptService.

  2. Fügen Sie den folgenden Code in das neue Skript ein.

    Skript - Suchegenehmigungen festlegen

    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
    EreignisSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Füllen Sie die folgenden Tabellen innerhalb des setSeekingPermissions-Aufrufs wie folgt aus:

    placeIDsKomma-separierte Liste von PlaceId-Werten, um das Suchen zu unterstützen.
    userIDsKomma-separierte Liste von UserIds, die innerhalb der unterstützten Plätze suchen können.
    groupsKomma-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:

  1. Öffnen Sie über das Fenster-Menü oder die Start-Tab-Leiste von Studio die Toolbox.

  2. Wählen Sie mit ausgewähltem Tab Creator Store im Dropdown-Menü Plugins aus.

  3. Geben Sie im Suchfeld Szenenmanager ein und drücken Sie Enter, um das Plugin zu finden.

  4. Klicken Sie auf das Symbol des Plugins, um seine Details anzuzeigen, und klicken Sie dann auf die Schaltfläche Installieren.

  5. 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-AktionBeschreibung
Client ladenWenn der Client-Inhalt der Szene entladen ist, bewegt es den Ordner Umgebungs/Client in den Ordner Arbeitsbereich/SzenenClient.
Server ladenWenn der Server-Inhalt der Szene entladen ist, bewegt es den Ordner Umgebungs/Server in den Ordner Arbeitsbereich/SzenenServer.
Client entladenWenn der Client-Inhalt der Szene geladen ist, bewegt es den Ordner Client von Arbeitsbereich/SzenenClient zurück in den [Szene]/Umgebungs-Ordner.
Server entladenWenn der Server-Inhalt der Szene geladen ist, bewegt es den Ordner Server von Arbeitsbereich/SzenenServer zurück in den [Szene]/Umgebungs-Ordner.
Alle Szenen entladenBewegt 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.

  1. Konfigurieren Sie die Licht-Eigenschaften, Nachbearbeitungs Effekte, atmosphärische Effekte und Himmelsbilder der Szene über den höchsten Lighting-Dienst.

  2. Klicken Sie im Szenenmanager-Plugin-Fenster auf Beleuchtung speichern für die gewünschte Szene.

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

  1. Konfigurieren Sie das Gelände der Szene mithilfe des obersten Terrain-Dienstes.

  2. Klicken Sie im Szenenmanager-Plugin-Fenster auf Terrain speichern für die gewünschte Szene.

  3. 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üsselBeschreibung
StartTimeWann das Audio in Bezug auf die Szenenlänge abgespielt werden soll, in Sekunden.
SoundIdAsset-ID des abzuspielenden Audios.
OnStartBenutzerdefinierte Funktion, die ausgeführt wird, wenn das Audio zu spielen beginnt.
OnEndBenutzerdefinierte Funktion, die ausgeführt wird, wenn das Audio zu Ende gespielt wurde.
VolumeLautstä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üsselBeschreibung
StartTimeWann die Animation in Bezug auf die Szenenlänge abgespielt werden soll, in Sekunden.
EndTimeOptionale Zeit, wann die Animation in Bezug auf die Szenenlänge enden soll, in Sekunden.
RigDas Animations-Rig, auf dem die Animation abgespielt werden soll.
AnimationIdAsset-ID der abzuspielenden Animation.
SpeedWiedergabegeschwindigkeit der Animation; Standardwert ist 1.
FadeInTimeDie Zeit, die benötigt wird, um die Animation einzublenden, in Sekunden; Standardwert ist 0.2 (Sekunden).
FadeOutTimeDie Zeit, die benötigt wird, um die Animation auszublenden, in Sekunden; Standardwert ist 0.2 (Sekunden).
OnStartBenutzerdefinierte Funktion, die ausgeführt wird, wenn die Animation zu spielen beginnt.
OnEndBenutzerdefinierte Funktion, die ausgeführt wird, wenn die Animation zu Ende gespielt wurde.
LoopedOb die Animation in einer Schleife abgespielt werden soll; Standardwert ist false.
SyncToAudioTabelle, die definiert, ob die Animation mit einer Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
  • Audio – Bezug auf eine Audio-Konfiguration.
  • StartAtAudioTime – Wann die Animation in Bezug auf die Dauer des Audios abgespielt werden soll.
  • EndAtAudioTime – Optionale Zeit, wann die Animation in Bezug auf die Dauer des Audios enden soll.
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üsselBeschreibung
StartTimesTabelle der Startzeiten in Bezug auf die Szenenlänge, in Sekunden.
TweenTabelle, die das Objekt und die Eigenschaften definiert, die getweent werden sollen. Akzeptiert die folgenden Schlüssel:
  • Object – Das Objekt, das getweent werden soll.
  • InfoTweenInfo-Instanz für das Tween, die dessen Dauer, Enum.EasingStyle, Enum.EasingDirection usw. definiert.
  • Properties – Objekt-Eigenschaften und zugehörige Zielwerte für das Tween.
OnStartBenutzerdefinierte Funktion, die ausgeführt wird, wenn das Tween zu spielen beginnt.
OnHeartbeatBenutzerdefinierte Funktion, die bei jedem Heartbeat ausgeführt wird; empfängt die Tween-Alpha als zweiten Parameter.
OnEndBenutzerdefinierte Funktion, die ausgeführt wird, wenn das Tween beendet ist.
SyncToAudioTabelle, die definiert, ob das Tween mit einer Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
  • Audio – Bezug auf eine Audio-Konfiguration.
  • StartAtAudioTimes – Tabelle der Startzeiten, die definiert, wann das Tween in Bezug auf die Dauer des Audios abgespielt werden soll.
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üsselBeschreibung
StartTimeBeginn der Intervalldauer in Bezug auf die Szenenlänge, in Sekunden.
EndTimeEnde der Intervalldauer in Bezug auf die Szenenlänge, in Sekunden.
FrequencyWie oft die OnInterval-Funktion ausgeführt werden soll, in Sekunden, wobei die erste Ausführung bei StartTime erfolgt.
OnStartBenutzerdefinierte Funktion, die ausgeführt wird, wenn die Reihe von Intervallen beginnt.
OnIntervalBenutzerdefinierte Funktion, die bei jedem Intervall innerhalb der angegebenen Dauer (StartTime bis EndTime) ausgeführt wird.
OnEndBenutzerdefinierte Funktion, die ausgeführt wird, wenn die Reihe von Intervallen endet.
SyncToAudioTabelle, die definiert, ob die Intervall-Dauer mit einer Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
  • Audio – Bezug auf eine Audio-Konfiguration.
  • StartAtAudioTime – Wann die Intervall-Dauer in Bezug auf die Dauer des Audios starten soll.
  • EndAtAudioTime – Optionale Zeit, wann die Intervall-Dauer in Bezug auf die Dauer des Audios enden soll.
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üsselBeschreibung
StartTimesTabelle von Startzeiten in Bezug auf die Szenenlänge, in Sekunden.
OnStartBenutzerdefinierte Funktion, die zu jedem festgelegten Zeitpunkt in der StartTimes-Tabelle ausgeführt wird.
SkippableBoolesch, 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.
SyncToAudioTabelle, die definiert, ob das Zeitplan mit einer Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
  • Audio – Bezug auf eine Audio-Konfiguration.
  • StartAtAudioTimes – Tabelle von Startzeiten, die definieren, wann die OnStart-Funktion in Bezug auf die Dauer des Audios ausgeführt werden soll.
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-Schema

    Schema.OnRun = function()
    print("OnRun (Server)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Temporäre Herzschlagverbindung initialisieren
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Rahmen über die Verbindung informieren
    Schema:inform(tempConnection)
    end
    })
    end
  • Aufrufen einer benutzerdefinierten "Cleanup"-Funktion in einem ModuleScript, die eine Verbindung oder einen anderen Verweis während des OnRun-Lebenszyklus-Hooks initialisiert.

    Server-Schema

    local 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 auf
    customModule.init()
    -- Rufen Sie die "clean"-Funktion im benutzerdefinierten Modul bei der Szenenreinigung auf
    Schema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule

    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Herzschlagverbindung initialisieren
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Trennen und Herzschlagverbindung löschen
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return 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.

Skript

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

Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EreignisSequencer = require(ReplicatedStorage:WaitForChild("Ereignis-Sequencer"))
print(EreignisSequencer.isLoadingScene())
while EreignisSequencer.isLoadingScene() do
task.wait()
end
print("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)
©2026 Roblox Corporation. Roblox, das Roblox-Logo und "Powering Imagination" gehören zu unseren eingetragenen und nicht eingetragenen Markenzeichen in den USA und anderen Ländern.