Ereignisssequenzierer

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

Eventsequencer ist ein mächtiges Framework, mit dem du aktiv, mehrere Server übergreifende Ereignisse und Szenen auf einer strukturierten Reihe von Aktionen und Auslösern bauen kannst.Genauer gesagt hilft Ihnen dieses Modul:

  • Baue ein Ereignis oder eine Szene auf einem strukturierten Framework durch zeitlich geplante Konfigurationen von Audiodateien, Animationen und Teenagern auf.
  • Übergang zwischen mehreren Szenen auf mehreren Servern, Synchronisierung komplexer Animationen und Visualisierungen mit einer Zeitachse.
  • Suche durch ein Ereignis und prüfe die Erfahrung für Test- und Entwicklungszwecke.

Dieser Rahmen wurde in Roblox-Veranstaltungen wie den Twenty One Pilots- und 24kGoldn-Konzerten sowie vielen stark frequentierten Erlebnissen getestet.

Um Veranstaltungssequenzierer in Aktion innerhalb eines bearbeitbaren Ortes zu sehen, schau dir die Konzertvorlage in Roblox Studio an.Diese Vorlage ist ein umfassender Ausgangspunkt für Entwickler, um Ereignisse/Konzerte zu erstellen und sich mit den verschiedenen beteiligten Funktionen und Komponenten vertraut zu machen.

Modul-Verwendung

Installationen

Um den Eventsequencer -Framework in einem Erlebnis zu verwenden:

  1. Von der Ansicht, öffne die Toolbox und wähle die Creator-Store -Registerkarte.

    Toolbox toggle button in Studio
  2. Stellen Sie sicher, dass die Sortierung der Modelle ausgewählt ist, dann klicken Sie auf die Schaltfläche Alle sehen für Kategorien .

  3. Suchen und klicken Sie auf die Entwickler-Module -Kachel.

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

  5. In dem Explorer Fenster verschiebe das gesamte Eventsequenzierungsmodell in den ServerScriptService .Wenn das Erlebnis ausgeführt wird, verteilt sich das Modul auf verschiedene Dienste und beginnt zu laufen.

Framework-Modelle

Ersetzungsmodus

Der Standard-Framework-Modus ist Ersetzungsmodus , in dem Sie einzigartige Szenen entwerfen, indem Sie 3D-Objekte , Terrain , Beleuchtungseigenschaften , Umwelteffekte und Benutzeroberflächen-Objekte in den Umgebungsfolder des Frameworks legen.Wenn eine Szene geladen wird, werden diese Objekte und Eigenschaften in , und verteilt, um bestehende Objekte/Eigenschaften zu ersetzen, um einen geklonten Platzzu bilden.

inline-Modus

Ein alternativer Framework-Modus ist Inline-Modus , in dem Sie ähnlich einzigartige Szenen mit Skriptlogik für ihren Fluss/Ereignisse entwerfen, aber der Framework wird nicht zerstören vorhandene 3D-Objekte , Terrain , Beleuchtungseigenschaften , Umwelteffekte und Benutzeroberflächenobjekte, um Assets/Eigenschaften von einer Szene aus der Umgebung -Ordner beim Laden zu klonen.

Um den inline-Modus zu aktivieren:

  1. Im Inneren des Eventsequenzers -Modells, das du in ServerScriptService platziert hast, gehe zurück und wähle den Inline -Wert innerhalb des ReplicatedStorage -Ordners aus.

  2. Im Eigenschaften-Fenster schalte die Wert -Checkbox ein.

Erstelle Szenen

Eine Szene ist im Wesentlichen Teil eines Gesamtevent oder einer Cutscene, die in einer Reihe von Ordnern zusammengefasst ist.Jede Szene enthält Skriptlogik, die ihre Fluss/Ereignisse definiert, und eine Szene kann ihre eigenen 3D-Objekte , Terrain, Beleuchtungseigenschaften, Umwelteffekte und Benutzeroberflächenobjekte speichern.

Um schnell zu beginnen, kannst du eine leere Szene im Hauptordner des Moduls finden:

  1. Erweitere den Ordner Eventsequencer und suche dir den Ordner Leere Szene an.

  2. Bewegen oder kopieren Sie den gesamten Ordner Leere Szene in ReplicatedStorage .

Zeitdauer

Jede Szene sollte eine Zeitlänge haben, in Sekunden, die ihre Dauer definiert - genau wie ein Film oder ein Konzert eine bestimmte Dauer hat.Die Zeitdauer wird als numerisches Attribut auf dem Ordner der Szene mit dem Namen Zeitdauer definiert, die Sie direkt in Studio festlegen können oder programmatisch über .

Umwelt

Der Ordner Umgebung einer Szene enthält alles, was Benutzer sehen und hören, einschließlich 3D-Objekte, Terrain, Beleuchtungseigenschaften und Umwelteffekte, und Benutzeroberflächenobjekte.Wenn eine Szene geladen wird, werden diese Objekte und Eigenschaften in Workspace , Terrain und Lighting verteilt, um bestehende Objekte/Eigenschaften zu ersetzen, um einen geklonten Platzzu bilden.

Der Umgebung -Ordner enthält die folgenden Container:

ContainerBeschreibung
Client Enthält alle Assets, die geladen werden, wenn sich ein Benutzer (Client) dem Ereignis anschließt, wie Benutzeroberflächenobjekte oder eine Rig.
SpielerSpawns Enthält Teile, wo Benutzer beim Beitreten spawnen. Jedes Teil in diesem Ordner verhält sich ähnlich wie ein SpawnLocation .
Server Enthält alle Assets, die beim ersten Laden einer Szene auf einem Server geladen werden müssen. Es wird empfohlen, dass die meisten visuellen Assets hierher gehen.
Gelände Enthält Gelände.
Belichtung Enthält globale Beleuchtungseigenschaften als Attribute, sowie Modifizierer wie atmosphärische Effekte und Post-Processing-Effekte.

Ereignisse

Der Ordner Ereignisse einer Szene ist rein ein Platzhalter für , die zwischen den Modulen Client und Server kommunizieren.Es ist keine Anforderung, etwas in diesem Ordner zu platzieren.

Client

Dieses Skript führt Schema-Logik auf dem Client aus.

Server

Dieses Skript führt Schema-Logik auf dem Server aus.

Szenarioschemata

Das Schema einer Szene definiert, was an welchem Punkt der Zeitachse der Szene passiert. Du solltest ein Schema einer Szene in ihren Client- und Server-Modulen definieren und Lebenszyklus-Haken einfügen, um zu verwalten, wann Konfigurationen auftreten.

Lebenszyklus-Haken

Schema Lebenszyklus-Haken lässt dich verwalten, wann Szenenoperationen auftreten. Eine Produktionsszene wird in der Regel im einfachsten Fluss ausgeführt:

Aufruf kann unterbrochen werden, wenn gesucht wird:

Alle drei Haken können sich auch wiederholen, wenn die Szene wiedergegeben wird:

Konfigurationen

Schema Konfigurationen definieren die Kernoperationen einer Szene, zum Beispiel das Abspielen von Audio um 00:32, das Einlegen einer Animation, die mit diesem Audiodateiensynchronisiert wird, das Planen eines Szene-Events wie eine anzeigenund mehr.Jede Konfiguration unterstützt bestimmte Rückruffunktionen, bei denen der erste Parameter ( self ) die Instanzist.

Suchen Sie Szenen

Eine einzigartige Funktion von EventSequencer ist die Fähigkeit, umher durch Szenen zu "suchen", wie Sie es durch ein Video suchen könnten.Im Ersetzungsmodus kannst du auch zwischen Szenen wechseln, um ein gesamtes Mehr-Szenen-Ereignis vor der Veröffentlichung in die Produktion zu prüfen.

Die Suche nach einer Szene ist nicht für alle zugänglich , da Benutzer, die einfach nur das Event genießen, nicht die Möglichkeit haben sollten, seinen Zeitfluss zu kontrollieren.Stattdessen musst du die Erlaubnis gewähren, basierend auf dem Ereignis PlaceId und spezifischen UserIds und/oder Gruppen und Rollen innerhalb von ihnen.

  1. Erstelle ein neues Script innerhalb von ServerScriptService.

  2. Füge den folgenden Code in das neue Skript, das. PL: die Skriptsein.

    Skript - Suchen-Berechtigungen festlegen

    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    EventSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Füllen Sie die folgenden Tabellen innerhalb der setSeekingPermissions Anruf wie folgt aus:

    placeIDsKommasgetrennte Liste von PlaceId Werten, um die Suche innerhalb zu unterstützen.
    userIDsKommasgetrennte Liste von UserIds für diejenigen, die innerhalb der unterstützten Orte suchen können.
    groupsKommasgetrennte Liste von Tabellen, jede enthält eine Gruppe-ID und den minimalen Rang der Mitglieder dieser Gruppe, die innerhalb der unterstützten Orte suchen können.

Plug-in

Das Szene-Manager-Plugin ist ein nützliches Werkzeug zum Laden und Entladen von Szenen, Beleuchtung und Terrain.Es wird dringend empfohlen, Inline-Modus zu verwenden, anstatt manuell Szene-Objekte und -Eigenschaften zu platzieren/zu bearbeiten.

Um das Plug-inzu installieren:

  1. Von Studio's Ansicht Menü öffnen Sie die Toolbox .

    Toolbox toggle button in Studio
  2. Mit der Creator-Store -Registerkarte ausgewählt, wählen Sie Plugins aus dem Dropdown-Menü.

  3. Geben Sie im Suchfeld Szene-Manager ein und drücken Sie Enter, um das Plug-inzu finden.

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

  5. Sobald das Plugin installiert ist, wird es in der Tab Plugins von Studio angezeigt.

Szenen laden und entladen

Wie in Erstellung von Szenen beschrieben, enthält der Ordner Umgebung einer Szene alles, was Benutzer sehen und hören, einschließlich 3D-Objekte.Das Plugin hilft dir, die Assets einer Szene schnell in oder aus organisierten Ordnern innerhalb des Arbeitsbereichs zu laden.

ActionBeschreibung
Client laden Wenn der Inhalt des Clients der Szene nicht geladen wird, verschiebt er seinen Umgebung / Client -Ordner in den Arbeitsbereich / Szenenclient -Ordner.
Server laden Wenn der Serverinhalt der Szene nicht geladen wird, verschiebt er seinen Umgebungsbereich / Server -Ordner in den Arbeitsbereich / Szenenserver -Ordner.
Client entladen Wenn der Inhalt des Clients der Szene geladen wird, verschiebt er seinen Client -Ordner von Arbeitsplatz / Szenenclient zurück in den [Szene] / Umgebung -Ordner.
Server entlasten Wenn der Serverinhalt der Szene geladen wird, verschiebt er seinen Server -Ordner von Arbeitsplatz / Szenenserver zurück in den [Szene] / Umgebung -Ordner.
Alle Szenen entladen Bewegt jede geladene Szene Client und Server Ordner zurück in ihren Umgebungsfolder .

Speichern und laden von Beleuchtung

Der oberste Service Lighting speichert alle Beleuchtungs- und visuellen Effekte eines Ortes.Da es sich um einen obersten Dienst handelt, kannst du ihn nicht manuell in den Umgebung / Server / Umgebung / Client -Ordner einer bestimmten Szene verschieben.Stattdessen kannst du das Plugin verwenden, um seine Eigenschaften und Kinder in den Umgebungsfolder / Beleuchtungsfolder der Szene zu kopieren.

  1. Konfigurieren Sie die Beleuchtungseigenschaften der Szene, Postbearbeitungseffekte, Atmosphäreneffekte und Skyboxen durch den obersten Service.

  2. Klicke im Szene-Manager -Plugin-Fenster auf Beleuchtung speichern für die gewünschte Szene.

  3. Wählen und erweitern Sie die Umgebung / Beleuchtung Konfiguration dieser Szene und Sie sehen die gleichen Beleuchtungseigenschaften wie Attributen des Ordners, sowie geklonte Kinder des obersten Lighting.

    Klonierte Instanzen
    Gespeicherte Attribute

    Sobald Licht-Eigenschaften und -Kinder für eine Szene gespeichert wurden, kannst du sie schnell wieder in den obersten Lighting Service laden, indem du auf Licht laden im Plugin-Fenster klickst.

Geländespeichern und laden

Da Terrain oben eine oberste Klasse innerhalb von Workspace ist, kannst du generiertes oder geschnittenes Terrain nicht manuell in den Umgebungsbereich / Server oder Umgebungsbereich / Client -Ordner einer bestimmten Szene verschieben.Stattdessen kannst du das Plugin verwenden, um es in den Umgebungsfolder / Terrain-Ordner der Szene zu kopieren.

  1. Konfiguriere das Gelände der Szene durch den obersten Terrain -Dienst.

  2. Klicke im Szene-Manager -Plugin-Fenster auf Terrain speichern für die gewünschte Szene.

  3. Wähle und erweitere den Umgebung / Terrain -Ordner dieser Szene und du wirst ein Terrainregion -Objekt sehen, das das gespeicherte Geländedarstellt.

    Sobald das Terrain für eine Szene gespeichert ist, kannst du es schnell wieder in den obersten Service laden, indem du auf das Plugin-Fenster Terrain laden klickst.

API-Referenz

Schema-Lebenszyklus-Haken

Bei der Einrichtung

Der OnSetup Lebenszyklus-Haken ist für die Initialisierung von Assets und Variablen gedacht, die in OnRun oder OnEndScene referenziert werden, die Einrichtung von connections, die für die Dauer der Szene gedacht sind, etc.Dieser Haken erhält den timePositionObject -Parameter, der es Ihnen ermöglicht, die aktuelle Zeit bei der Einrichtung zu lesen.

Client- Schema

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
local dummy
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Zugangsszene-Umgebungen; gilt nicht für den Inline-Modus
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- Warten auf Assets
dummy = clientEnvironment:WaitForChild("Dummy")
print("Current time is:", timePositionObject.Value)
end
Server- Schema

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
-- Zugangs-Szene-Umgebung; gilt nicht für Inline-Modus
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Current time is:", timePositionObject.Value)
end

Aufruf

Aufruf ist der Hauptbetriebszyklus-Hook innerhalb eines Schema.Es sollte alle zeitgesteuerten Konfigurationen für die Szene enthalten, von der Wiedergabe von Audio oder einer Animation bis zur Planung eines Ereignisses wie einem Feuerwerksdisplay.

Client- Schema

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

OnEndSzene

Der OnEndScene -Lebenszyklus-Haken ist nützlich, um alles aufzuräumen, was in der Szene heraussteht, wie z. B. die Trennung von Verbindungen, die in OnSetup oder OnRun erstellt wurden, die für die Dauer der Szene bleiben.

Server- Schema

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

Schema-Konfigurationen

audiodateien

Erstellt ein Sound Objekt im Arbeitsbereich, das zu einer bestimmten Zeit abgespielt wird.Der Ton wird dann gelöscht, nachdem die Szene vorbei ist oder nachdem das Sound Objekt aufgehört hat zu spielen.

Konfigurierungs SchlüsselBeschreibung
StartTimeWann das Audio in Bezug auf die Dauer der Szene, in Sekunden, wiedergegeben werden soll.
SoundIdAsset-ID des Audios zum Abspielen.
OnStartBenutzerdefinierte Funktion, die abgefeuert wird, wenn das Audio beginnt zu spielen.
OnEndBenutzerdefinierte Funktion, die abgefeuert wird, wenn das Audio abgespielt ist.
VolumeLautstärke des Sound Objekts; Standard 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 playing")
end,
OnEnd = function(self)
print("Audio ended")
end
})
end

animieren

Erstellt ein Animation, das zu einer bestimmten Zeit abgespielt wird.

Konfigurierungs SchlüsselBeschreibung
StartTimeWann die Animation in Bezug auf die Dauer der Szene, in Sekunden, wiedergegeben werden soll.
EndTimeOptionale Zeit, um die Animation in Bezug auf die Dauer der Szene in Sekunden zu beenden.
RigDas Animationsgerät, um die Animation abzuspielen.
AnimationIdAsset-ID der Animation zum Abspielen.
SpeedWiedergabegeschwindigkeit der Animationen; Standard ist 1.
FadeInTimeMenge der Zeit, die in der Animationenverschwindet, in Sekunden; Standard ist 0.2 (Sekunden).
FadeOutTimeAnzahl der Sekunden, in denen die Animationenverschwindet, in Sekunden; Standard ist 0.2 (Sekunden).
OnStartBenutzerdefinierte Funktion, die abgefeuert wird, wenn die Animation beginnt zu spielen.
OnEndBenutzerdefinierte Funktion, die abgefeuert wird, wenn die Animation fertig ist.
LoopedOb die Animationengeschleift werden soll; Standard ist false.
SyncToAudioTabelle, die definiert, ob die Animation auf eine 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 Audiodateienabgespielt werden soll.
  • EndAtAudioTime – Optionale Zeit, in der die Animation in Bezug auf die Dauer des Audiodateienbeendet werden 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 playing")
end,
OnEnd = function(self)
print("Animation stopped")
end
})
end

tween

Erstellt ein konfigurierbares Tween, das bei der Suche und beim dynamischen Beitritt erhalten bleibt, was bedeutet, dass Sie Teenager an getrennten Punkten in der Zeit ketten können und alles wie erwartet spielen und synchronisieren sollte.

Konfigurierungs SchlüsselBeschreibung
StartTimesTabelle der Startzeiten in Bezug auf die Dauer der Szene, in Sekunden.
TweenTabelle, die das Objekt und die Eigenschaften definiert, die zum Tween. Akzeptiert die folgenden Schlüssel:
OnStartBenutzerdefinierte Funktion, die abgefeuert wird, wenn der Teenager beginnt zu spielen.
OnHeartbeatBenutzerdefinierte Funktion, die auf jedem Heartbeat feuert; erhält die Teenager-Alpha als ihren zweiten Parameter.
OnEndBenutzerdefinierte Funktion, die abgefeuert wird, wenn der Teenager das Spiel beendet.
SyncToAudioTabelle, die definiert, ob der Teenager in eine Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
  • Audio – Bezug auf eine Audio-Konfiguration.
  • StartAtAudioTimes – Tabelle der Startzeiten, die festlegen, wann der Teenager im Verhältnis zur Dauer des Audiodateienabgespielt 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 playing")
end,
OnHeartbeat = function(self, alpha)
print("Tween alpha", alpha)
end,
OnEnd = function(self)
print("Tween completed")
end,
})
end

zeitraum

Führt eine benutzerdefinierte Rückruffunktion über eine bestimmte Dauer auf einer bestimmten Frequenz in Sekunden aus.Nützlich für die Wiederholung von Ereignissen wie blinkenden Lichtern, Pulsieren der Intensität eines Audiodateienusw.Die niedrigste mögliche Frequenz beträgt 0 Sekunden, aber technisch gesehen ist die Mindestfrequenz immer gekappt auf Heartbeat.

Konfigurierungs SchlüsselBeschreibung
StartTimeBeginn der Intervallzeit in Bezug auf die Dauer der Szene, in Sekunden.
EndTimeEnde der Intervalldauer in Bezug auf die Dauer der Szene, in Sekunden.
FrequencyWie oft die OnInterval-Funktion in Sekunden initiierensoll, wobei die erste Ausführung bei StartTime liegt.
OnStartBenutzerdefinierte Funktion, die abgefeuert wird, wenn die Reihe von Intervallen beginnt.
OnIntervalBenutzerdefinierte Funktion, die bei jedem Intervall innerhalb der angegebenen Dauer abgefeuert wird ( StartTime bis EndTime ).
OnEndBenutzerdefinierte Funktion, die abgefeuert wird, wenn die Serie von Intervallen endet.
SyncToAudioTabelle, die definiert, ob die Intervalldauer auf eine Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
  • Audio – Bezug auf eine Audio-Konfiguration.
  • StartAtAudioTime – Wann die Intervallzeit in Bezug auf die Dauer des Audiodateienbeginnen soll.
  • EndAtAudioTime – Optionale Zeit, in der die Intervalldauer in Bezug auf die Dauer des Audiodateienenden 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

zeitplan

Ähnlich wie Intervall, außer dass du mehrere spezifische Startzeiten für dasselbe Ereignis definieren kannst, z. B. die Planung einer Feuerwerksausgabe zweimal in einer Szene.

Konfigurierungs SchlüsselBeschreibung
StartTimesTabelle der Startzeiten in Bezug auf die Dauer der Szene, in Sekunden.
OnStartBenutzerdefinierte Funktion, die zu jeder angegebenen Zeit in der StartTimes Tabelle abgefeuert wird.
SkippableBoolean definiert, ob das geplante Ereignis für Benutzer übersprungen werden kann, die sich spät anmelden, oder für die Suche vor einer geplanten Startzeit.Wenn auf false festgelegt, treten alle geplanten Event-Startzeiten vor der Anschlusszeit auf.Wenn auf true festgelegt, erscheinen nur die Startzeiten, die nach Beitritt/Suche geplant auftreten.Standard ist false.
SyncToAudioTabelle, die definiert, ob die Agenda mit einer Audio-Konfiguration synchronisiert werden soll. Akzeptiert die folgenden Schlüssel:
  • Audio – Bezug auf eine Audio-Konfiguration.
  • StartAtAudioTimes – Tabelle der Startzeiten, die festlegen, wann die OnStart-Funktion in Bezug auf die Dauer des Audiodateienabgefeuert 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)
-- Informierungsrahmen der Verbindung
Schema:inform(tempConnection)
end
})
end

informieren

Informiert den Framework über Modulen, Benutzeroberflächen, Verbindungen usw.die im OnRun-Lebenszyklus-Haken erstellt werden, sicherstellen, dass sie ordnungsgemäß gereinigt werden, wenn gesucht wird.Verwendungsfälle umfassen:

  • Informieren des Rahmens einer temporären ad-hoc-Verbindung wie RunService.Heartbeat, damit die Verbindung beim Versuch, zu einem früheren Punkt der Dauer der Szene, aufgeräumt 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)
    -- Informierungsrahmen der Verbindung
    Schema:inform(tempConnection)
    end
    })
    end
  • Aufruf einer benutzerdefinierten "Bereinigung"-Funktion in einem ModuleScript, die eine Verbindung oder andere Referenzen 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 EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    local Schema = EventSequencer.createSchema()
    Schema.OnRun = function()
    print("OnRun (Server)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Funktion "init" im benutzerdefinierten Modul aufrufen
    customModule.init()
    -- Rufen Sie die Funktion "clean" im benutzerdefinierten Modul auf der Bereinigungauf
    Schema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - Personalisiertes Modul

    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Herzfrequenzverbindung initialisieren
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Trennen und löschen Sie die Herzfrequenzverbindung
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return CustomModule

Funktionen

ladeSzene

loadScene(sceneName: string , startTime: number ?)

Lädt eine Szene programmatisch von sceneName und startet sie von startTime von Beginn an.Es wird eine 5-Sekunden-"Gnadenfrist" geben, in der die Szene vom Server geladen wird, bevor die Suche erfolgt und die Szene beginnt zu spielen.Das bedeutet, dass, wenn du loadScene("[SceneName]", 20) um genau 4:15:00 Uhr anrufst, der Framework zusätzlich zu den angeforderten 20 Sekunden 5 Sekunden warten wird, die Szene um 4:15:25 Uhr starten.

Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Finden Sie die nächste Szene heraus, die geladen wird, wenn die aktuelle Szene fertig ist
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- Präsentation "PreShow" beendet; ladet die erste Szene im Konzert
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- Track1" beendet; ladet die zweite Szene im Konzert
EventSequencer.loadScene("Track2")
else
-- Schleife zurück zur Vorshow-Szene
EventSequencer.loadScene("PreShow")
end
end)

Schema erstellen

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 EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
end

suchen

seek(zeit: number )

Suche nach dem time Wert, in Sekunden, vom Anfang der derzeit geladenen Szene.

Skript

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

setSceneWarningTime

setSceneWarningTime(endSceneTimeWindow: number )

Legt die Menge der Zeit vom Ende aller Szenen fest, an denen eine Warnung verschickt wird .Du kannst die Warnung entweder clientseitig durch aufSceneEndingWarningForClient oder serverseitig durch aufSceneEndingWarningForServer erkennen.

Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Landschaft laden
EventSequencer.loadScene("BeautifulScene")
-- Stelle die Warnzeit auf 5 Sekunden vor Ende der Szene ein
EventSequencer.setSceneWarningTime(5)
-- Erkennen, wenn die Szene kurz vor dem beenden
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scene is about to end!")
end)

setSeekingPermissionen

setSeekingPermissions(Berechtigungen: table )

Gewährt Berechtigungen, die auf der Grundlage des Ereignisses von PlaceId basieren, sowie spezifische UserIds und/oder Gruppen und Rollen innerhalb von ihnen.Siehe suche und wechsle Szenen für weitere Informationen.

erhaltenCurrentSceneEnvironment

getCurrentSceneEnvironment(): Folder (Gebiete)

Gibt die Client- oder Serverseite-Umgebung der aktuellen Szene zurück, abhängig davon, ob sie vom Client-Schema-Skript oder vom Server-Schema-Skript ausgerufen wird, resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp. resp

Client- Schema

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Zugangsszene-Umgebungen; gilt nicht für den Inline-Modus
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Current time is:", timePositionObject.Value)
end
Server- Schema

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
end

getCurrentServerEnvironmentFromClient

getCurrentServerEnvironmentFromClient(): Folder (Gebräuchlich)

Gibt die Server-seitige Umgebung des aktuellen Szenarios zurück.Im Gegensatz zu getCurrentSceneEnvironment kannst du dies von dem Client Skript, das. PL: die Skriptsaus aufrufen.

Client- Schema

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Zugangsszene-Umgebungen; gilt nicht für den Inline-Modus
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Current time is:", timePositionObject.Value)
end

istLadeSzene

istLadeSzene(): boolean

Aufgerufen vom Server, um zu erfahren, ob eine Szene derzeit geladen wird.

Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("Scene loaded")

Ereignisse

aufSceneEndingWarningForClient

Feuert auf dem Client, bevor die Szene beenden.Die Standardzeit beträgt 3 Sekunden, aber du kannst sie über setSceneWarningTime konfigurieren.Dieses Ereignis kann nur in einem LocalScript verbunden werden.

Lokales Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Erkennen, wenn die Szene kurz vor dem Ende steht (clientseitig)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("Scene is about to end!")
end)

aufSceneEndingWarningForServer

Feuert auf dem Server, bevor die Szene beenden.Die Standardzeit beträgt 3 Sekunden, aber du kannst sie über setSceneWarningTime konfigurieren.Dieses Ereignis kann nur in einem Script verbunden werden.

Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Erkennen, wenn die Szene kurz vor dem Ende steht (seitens des Servers)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scene is about to end!")
end)

onSceneLoadedFür Client

Feuert auf dem Client, wenn die Szene beginnt. Dieses Ereignis kann nur in einem LocalScript verbunden werden.

Lokales Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Erkennen, wenn die Szene beginnt (clientseitig)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("Scene is starting!")
end)

aufOrchestrationAbgeschlossen

Feuert auf dem Server, wenn eine Szene ihre Länge der Zeit erreicht hat und effektiv beendet wurde.Dieses Ereignis erhält ein endedSceneName String-Namensargument für die Szene, die gerade beendet wurde, und du kannst dieses Ereignis konditionell eine andere Szene laden verknüpfen.Kann nur in einem Script verbunden werden.

Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Finden Sie die nächste Szene heraus, die geladen wird, wenn die aktuelle Szene fertig ist
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- Präsentation "PreShow" beendet; ladet die erste Szene im Konzert
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- Track1" beendet; ladet die zweite Szene im Konzert
EventSequencer.loadScene("Track2")
else
-- Schleife zurück zur Vorshow-Szene
EventSequencer.loadScene("PreShow")
end
end)