Sekwencjonator Zdarzeń to potężna struktura, która umożliwia budowanie wydarzeń na żywo oraz przerywników między serwerami w oparciu o uporządkowaną sekwencję działań i wyzwalaczy. Bardziej szczegółowo, ten moduł pomaga Ci:
- Zbudować wydarzenie lub przerywnik na uporządkowanej strukturze poprzez zaplanowane konfiguracje dźwięku, animacji i tweenów.
- Przejść między wieloma scenami na różnych serwerach, synchronizując skomplikowane animacje i efekty wizualne z linią czasową.
- Przeszukiwać wydarzenie i podglądać doświadczenie w celach testowych i rozwojowych.
Ta struktura została przetestowana w wydarzeniach Roblox, takich jak koncerty Twenty One Pilots i 24kGoldn, a także w wielu chętnie odwiedzanych doświadczeniach.
Aby zobaczyć Sekwencjonator Zdarzeń w akcji w ramach edytowalnego miejsca, sprawdź szablon Koncert w Roblox Studio. Ten szablon stanowi kompleksowy punkt wyjścia dla deweloperów do tworzenia wydarzeń/koncertów i zaznajamiania się z różnymi funkcjami i komponentami zaangażowanymi w ten proces.

Użytkowanie modułu
Instalacja
Aby użyć struktury Sekwencjonator Zdarzeń w danym doświadczeniu:
Z menu Okno w Studio lub z paska narzędzi na karcie Strona główna, otwórz Narzędziownię i wybierz zakładkę Sklep Kreatora.

Upewnij się, że wybrane są sortowania Modele, a następnie kliknij przycisk Zobacz Wszystko w sekcji Kategorie.

Zlokalizuj i kliknij kafelek Pakiety.
Zlokalizuj moduł Sekwencjonator Zdarzeń i kliknij go lub przeciągnij i upuść do widoku 3D.

W oknie Eksploratora przenieś cały model Sekwencjonator Zdarzeń do ServerScriptService. Po uruchomieniu doświadczenia moduł zacznie działać.
Tryby struktury
Tryb zastępowania
Domyślnym trybem struktury jest tryb zastępowania, w którym projektujesz unikalne sceny poprzez umieszczanie obiektów 3D, terenu, właściwości oświetlenia, efektów środowiskowych i obiektów interfejsu użytkownika w folderze Środowisko danej sceny. Kiedy scena jest ładowana, te obiekty i właściwości są dystrybuowane do Workspace, Terrain i Lighting, zastępując istniejące obiekty/właściwości, tworząc sklonowaną przestrzeń.
Tryb wbudowany
Alternatywnym trybem struktury jest tryb wbudowany, w którym w podobny sposób projektujesz unikalne sceny z logiką skryptów dla ich przepływu/zdarzeń, ale struktura nie zniszczy istniejących obiektów 3D, terenu, właściwości oświetlenia, efektów środowiskowych i obiektów interfejsu użytkownika, aby sklonować zasoby/właściwości z folderu Środowisko sceny podczas ładowania.
Aby włączyć tryb wbudowany:
W modelu Sekwencjonator Zdarzeń, który umieściłeś w ServerScriptService, zjeżdżaj w dół i wybierz wartość Wbudowany w folderze ReplicatedStorage.

W oknie Właściwości włącz pole wyboru Wartość.

Tworzenie scen
Scena to zasadniczo część ogólnego wydarzenia lub przerywnika, złożona z serii folderów. Każda scena zawiera logikę skryptu, która definiuje jej przepływ/zdarzenia, a scena może przechowywać własne obiekty 3D, teren, właściwości oświetlenia, efekty środowiskowe i obiekty interfejsu użytkownika.
Aby szybko rozpocząć, możesz znaleźć pustą scenę w głównym folderze modułu:
Rozwiń folder Sekwencjonator Zdarzeń i zlokalizuj folder PustaScena.

Przenieś lub skopiuj cały folder PustaScena do ReplicatedStorage.

Czas trwania
Każda scena powinna mieć czas trwania, w sekundach, definiujący jego długość – tak jak film lub koncert ma określoną długość. Czas trwania jest definiowany jako atrybut liczbowy instancji w folderze sceny o nazwie CzasTrwania, który możesz ustawić bezpośrednio w Studio lub programowo przez Instance:SetAttribute().


Środowisko
Folder Środowisko sceny zawiera wszystko, co użytkownicy widzą i słyszą, w tym obiekty 3D, teren, właściwości oświetlenia oraz efekty środowiskowe i obiekty interfejsu użytkownika. Kiedy scena jest ładowana, te obiekty i właściwości są dystrybuowane do Workspace, Terrain i Lighting, zastępując istniejące obiekty/właściwości, tworząc sklonowaną przestrzeń.
Folder Środowisko zawiera następujące kontenery:
| Kontejner | Opis |
|---|---|
| Klient | Zawiera wszystkie zasoby do załadowania, gdy którykolwiek użytkownik (klient) dołącza do wydarzenia, takie jak obiekty interfejsu użytkownika lub rig animacyjny. |
| SpawnyGraczy | Zawiera części, w których użytkownicy spawnuje po dołączeniu. Każda część w tym folderze działa podobnie do SpawnLocation. |
| Serwer | Zawiera wszystkie zasoby do załadowania, gdy scena jest po raz pierwszy tworzona na serwerze. Zaleca się, aby większość zasobów wizualnych była tutaj. |
| Teren | Zawiera teren sceny. |
| Oświetlenie | Zawiera globalne właściwości oświetlenia jako atrybuty, a także modyfikatory takie jak efekty atmosferyczne i [efekty przetwarzania po].Post-processing. |
Zdarzenia
Folder Zdarzenia sceny jest czystym miejscem na RemoteEvents, które komunikują się między modułami Klient i Serwer. Nie ma wymogu umieszczania czegokolwiek w tym folderze.
Klient
Ten skrypt wykonuje logikę schematu na kliencie.
Serwer
Ten skrypt wykonuje logikę schematu na serwerze.
Schematy scen
Schemat sceny definiuje, co dzieje się w jakim momencie w harmonogramie czasu sceny. Powinieneś zdefiniować schemat sceny w obu jej modułach Klient i Serwer i uwzględnić hooki cyklu życia, aby zarządzać tym, kiedy następują konfiguracje.
Hooki cyklu życia
Hooki cyklu życia schematu umożliwiają zarządzanie tym, kiedy operacje sceny się odbywają. Scena w produkcji będzie zazwyczaj działać w najprostszy sposób:
OnRun może być przerwany podczas przeszukiwania:
Wszystkie trzy hooki mogą również powtarzać się, jeśli scena jest odtwarzana ponownie:
Konfiguracje
Konfiguracje schematu konfiguracji definiują podstawowe operacje sceny, na przykład odtwarzanie dźwięku o 00:32, kolejkowanie animacji do synchronizacji z tym dźwiękiem, zaplanowanie zdarzenia sceny, takiego jak pokaz sztucznych ogni, i wiele więcej. Każda konfiguracja wspiera pewne funkcje zwrotne, gdzie pierwszy parametr (self) to instancja konfiguracji.
Przeszukiwanie scen
Unikalną cechą Sekwencjonatora Zdarzeń jest możliwość "przeszukiwania" scen, tak jak można przeszukiwać wideo. W Trybie Zastąpienia, możesz również przełączać się między scenami, aby podglądać całe wydarzenie wieloscenowe przed jego wdrożeniem do produkcji.
Przeszukiwanie scen nie jest dostępne dla wszystkich, ponieważ użytkownicy po prostu cieszący się wydarzeniem nie powinni mieć możliwości kontrolowania jego przebiegu czasowego. Musisz zamiast tego przyznać uprawnienia do przeszukiwania w oparciu o PlaceId wydarzenia oraz konkretne UserIds i/lub grupy oraz role w ich obrębie.
Utwórz nowy Script w ServerScriptService.
Wklej następujący kod do nowego skryptu.
Skrypt - Ustawienie uprawnień do przeszukiwanialocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))SekwencjonatorZdarzeń.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})Uzupełnij następujące tabele w wywołaniu setSeekingPermissions w następujący sposób:
placeIDs Lista wartości PlaceId oddzielonych przecinkami, aby umożliwić przeszukiwanie w tych miejscach. userIDs Lista wartości UserIds oddzielonych przecinkami dla tych, którzy mogą przeszukiwać w obsługiwanych miejscach. groups Lista tabel, z których każda zawiera identyfikator grupy i minimalny ranking członków tej grupy, którzy mogą przeszukiwać w obsługiwanych miejscach.
Wtyczka zarządzania sceną
Wtyczka Zarządca Scen jest przydatnym narzędziem do ładowania i wyładowywania scen, oświetlenia oraz terenu. O ile nie używasz Trybu Wbudowanego, zaleca się korzystanie z tej wtyczki zamiast ręcznego umieszczania/edycji obiektów i właściwości sceny.
Aby zainstalować wtyczkę:
Z menu Okno w Studio lub z paska narzędzi na karcie Strona główna, otwórz Narzędziownię.
Z wybraną zakładką Sklep Kreatora, wybierz Wtyczki z rozwijanego menu.
W polu wyszukiwania wpisz Zarządca Scen i naciśnij Enter, aby zlokalizować wtyczkę.

Kliknij ikonę wtyczki, aby zobaczyć jej szczegóły, a następnie kliknij przycisk Zainstaluj.
Po zainstalowaniu wtyczka pojawi się na karcie Wtyczki w Studio.
Ładowanie i wyładowywanie scen
Jak zarysowano w tworzeniu scen, folder Środowisko sceny zawiera wszystko, co użytkownicy widzą i słyszą, w tym obiekty 3D. Wtyczka pomaga szybko załadować zasoby sceny do zorganizowanych folderów w obrębie przestrzeni roboczej.
| Akcja wtyczki | Opis |
|---|---|
| Załaduj Klienta | Jeśli zawartość klienta sceny jest wyładowana, przenosi folder Środowisko/Klient do folderu Workspace/ScenyKlient. |
| Załaduj Serwer | Jeśli zawartość serwera sceny jest wyładowana, przenosi folder Środowisko/Serwer do folderu Workspace/ScenySerwer. |
| Wyładuj Klienta | Jeśli zawartość klienta sceny jest załadowana, przenosi jego folder Klient z Workspace/ScenyKlient z powrotem do folderu [Scena]/Środowisko. |
| Wyładuj Serwera | Jeśli zawartość serwera sceny jest załadowana, przenosi folder Serwer z Workspace/ScenySerwer z powrotem do folderu [Scena]/Środowisko. |
| Wyładuj Wszystkie Sceny | Przenosi foldery Klient i Serwer każdej załadowanej sceny z powrotem do jej folderu Środowisko. |
Zapisz i załaduj oświetlenie
Usługa Lighting najwyższego poziomu przechowuje wszystkie właściwości oświetleniowe i wizualne danego miejsca. Ponieważ jest to usługa najwyższego poziomu, nie możesz ręcznie przenieść jej do folderu Środowisko/Serwer lub Środowisko/Klient konkretnej sceny. Zamiast tego możesz wykorzystać wtyczkę do skopiowania jej właściwości i dzieci do folderu Środowisko/Oświetlenie sceny.
Skonfiguruj właściwości oświetleniowe sceny, efekty przetwarzania po, efekty atmosferyczne oraz skyboxy poprzez usługę Lighting najwyższego poziomu.

W oknie wtyczki Zarządca Scen, kliknij Zapisz Oświetlenie dla danej sceny.
Wybierz i rozwiń konfigurację Środowisko/Oświetlenie tej sceny, a zobaczysz te same właściwości oświetleniowe jako atrybuty folderu, jak również sklonowane dzieci usługi Lighting najwyższego poziomu.

Sklonowane instancje 
Zapisane atrybuty Po zapisaniu właściwości oświetlenia i dzieci dla sceny, możesz szybko załadować je z powrotem do usługi Lighting najwyższego poziomu, klikając Załaduj Oświetlenie z okna wtyczki.
Zapisz i załaduj teren
Ponieważ Terrain jest klasą najwyższego poziomu w obrębie Workspace, nie możesz ręcznie przenieść wygenerowanego lub uformowanego terenu do konkretnego folderu Środowisko/Serwer lub Środowisko/Klient danej sceny. Zamiast tego możesz wykorzystać wtyczkę do skopiowania go do folderu Środowisko/Teren sceny.
Skonfiguruj teren sceny poprzez najwyższą usługę Teren.

W oknie wtyczki Zarządca Scen, kliknij Zapisz Teren dla danej sceny.
Wybierz i rozwiń folder Środowisko/Teren tej sceny, a zobaczysz obiekt TerrainRegion, który reprezentuje zapisany teren.

Po zapisaniu terenu dla sceny, możesz szybko załadować go z powrotem do usługi Terrain najwyższego poziomu, klikając Załaduj Teren z okna wtyczki.
Referencja API
Hooki cyklu życia schematu
OnSetup
Hook cyklu życia OnSetup jest przeznaczony do inicjalizacji zasobów i zmiennych, które będą odwoływane w OnRun lub OnEndScene, ustawiania połączeń, które mają trwać przez cały czas trwania sceny, itd. Ten hook otrzymuje parametr timePositionObject, który pozwala ci odczytać aktualny czas podczas ustawienia.
Klient - Schemat
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
local Schemat = SekwencjonatorZdarzeń.createSchema()
local środowiskoKlienta
local środowiskoSerwera
local dummy
Schemat.OnSetup = function(timePositionObject)
print("OnSetup (Klient)")
-- Uzyskanie dostępu do środowisk sceny; nie dotyczy Trybu Wbudowanego
środowiskoKlienta = SekwencjonatorZdarzeń.getCurrentSceneEnvironment()
środowiskoSerwera = SekwencjonatorZdarzeń.getCurrentServerEnvironmentFromClient()
-- Czekaj na zasoby
dummy = środowiskoKlienta:WaitForChild("Dummy")
print("Aktualny czas to:", timePositionObject.Value)
end
Serwer - Schemat
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
local Schemat = SekwencjonatorZdarzeń.createSchema()
local środowiskoSerwera
local connectionKolorCzęści
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schemat.OnSetup = function(timePositionObject)
print("OnSetup (Serwer)")
-- Uzyskanie dostępu do środowiska sceny; nie dotyczy Trybu Wbudowanego
środowiskoSerwera = SekwencjonatorZdarzeń.getCurrentSceneEnvironment()
connectionKolorCzęści = changePartColorEvent.OnServerEvent:Connect(function(player, zmienionaCzęść, nowyKolor)
środowiskoSerwera.zmienionaCzęść.Color = nowyKolor
end)
print("Aktualny czas to:", timePositionObject.Value)
end
OnRun
OnRun to główny operacyjny hook cyklu życia w obrębie schematu. Powinien zawierać wszystkie zaplanowane konfiguracje dla danej sceny, od odtwarzania dźwięku lub animacji do zaplanowania zdarzenia jak pokaz sztucznych ogni.
Klient - Schemat
Schemat.OnRun = function()
print("OnRun (Klient)")
local GłównyDźwięk = Schemat:audio({
CzasRozpoczęcia = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Odtwarzanie dźwięku")
end,
OnEnd = function(self)
print("Dźwięk zakończony")
end
})
end
OnEndScene
Hook cyklu życia OnEndScene jest użyteczny do oczyszczenia wszystkiego, co pozostało w scenie, takiego jak rozłączenie połączeń utworzonych w OnSetup lub OnRun, które pozostają przez cały czas trwania sceny.
Serwer - Schemat
Schemat.OnEndScene = function()
print("OnEndScene (Serwer)")
if connectionKolorCzęści then
connectionKolorCzęści:Disconnect()
connectionKolorCzęści = nil
end
end
Konfiguracje schematu
audio
Tworzy obiekt Sound w przestrzeni roboczej, który odtwarza się w określonym czasie. Dźwięk jest następnie usuwany po zakończeniu sceny lub po zakończeniu odtwarzania obiektu Sound.
| Klucz konfiguracji | Opis |
|---|---|
| CzasRozpoczęcia | Kiedy odtworzyć dźwięk w stosunku do długości sceny, w sekundach. |
| SoundId | Identyfikator zasobu dźwięku do odtworzenia. |
| OnStart | Custom function to fire when the audio begins playing. |
| OnEnd | Custom function to fire when the audio finishes playing. |
| Głośność | Głośność obiektu Sound; domyślnie wynosi 0.5. |
Klient - Schemat
Schemat.OnRun = function()
print("OnRun (Klient)")
local GłównyDźwięk = Schemat:audio({
CzasRozpoczęcia = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Odtwarzanie dźwięku")
end,
OnEnd = function(self)
print("Dźwięk zakończony")
end
})
end
animate
Tworzy Animation, która odtwarza się w określonym czasie.
| Klucz konfiguracji | Opis |
|---|---|
| CzasRozpoczęcia | Kiedy odtworzyć animację w stosunku do długości sceny, w sekundach. |
| CzasZakończenia | Opcjonalny czas, w którym zakończyć animację w stosunku do długości sceny, w sekundach. |
| Rig | Rig animacyjny, na którym odtwarzana jest animacja. |
| AnimationId | Identyfikator zasobu animacji do odtworzenia. |
| Speed | Prędkość odtwarzania animacji; domyślnie wynosi 1. |
| CzasFadeIn | Ilość czasu, aby animacja fade-in, w sekundach; domyślnie wynosi 0.2 (sekundy). |
| CzasFadeOut | Ilość czasu, aby animacja fade-out, w sekundach; domyślnie wynosi 0.2 (sekundy). |
| OnStart | Custom function to fire when the animation begins playing. |
| OnEnd | Custom function to fire when the animation finishes playing. |
| Powtarzany | Czy animacja ma się powtarzać; domyślnie to false. |
| SyncToAudio | Tabela definiująca, czy synchronizować animację z konfiguracją audio. Przyjmuje następujące klucze:
|
Klient - Schemat
Schemat.OnRun = function()
print("OnRun (Klient)")
local GłównyDźwięk = Schemat:audio({
CzasRozpoczęcia = 1,
SoundId = "rbxassetid://1838673350",
})
local AnimacjaTańca = Schemat:animate({
AnimationId = "rbxassetid://3695333486",
Rig = Dummy,
Speed = 1,
CzasFadeIn = 0.1,
CzasFadeOut = 0.3,
SyncToAudio = {
Audio = GłównyDźwięk,
StartAtAudioTime = 5,
},
OnStart = function(self)
print("Odtwarzanie animacji")
end,
OnEnd = function(self)
print("Animacja zatrzymana")
end
})
end
tween
Tworzy konfigurowalny Tween, który jest zachowywany podczas przeszukiwania i dynamicznego dołączania, co oznacza, że możesz łączyć tweens w różnych punktach czasowych, a wszystko powinno działać i synchronizować się zgodnie z oczekiwaniami.
| Klucz konfiguracji | Opis |
|---|---|
| CzasyRozpoczęcia | Tabela czasów rozpoczęcia w stosunku do długości sceny, w sekundach. |
| Tween | Tabela definiująca obiekt i właściwości do tweenu. Przyjmuje następujące klucze:
|
| OnStart | Custom function to fire when the tween begins playing. |
| OnHeartbeat | Custom function to fire on every Heartbeat; receives the tween alpha as its second parameter. |
| OnEnd | Custom function to fire when the tween finishes playing. |
| SyncToAudio | Tabela definiująca, czy synchronizować tween z konfiguracją audio. Przyjmuje następujące klucze:
|
Klient - Schemat
Schemat.OnRun = function()
print("OnRun (Klient)")
local GłównyDźwięk = Schemat:audio({
CzasRozpoczęcia = 1,
SoundId = "rbxassetid://1838673350",
})
local FadeŚwiatła = Schemat:tween({
CzasyRozpoczęcia = {29.884},
Tween = {
Obiekt = game:GetService("Lighting"),
Info = TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.Out),
Właściwości = {
Jasność = 0,
}
},
SyncToAudio = {
Audio = GłównyDźwięk,
StartAtAudioTimes = {5, 7.2, 9.4, 11.6},
},
OnStart = function(self)
print("Tween odtwarzany")
end,
OnHeartbeat = function(self, alpha)
print("Tween alpha", alpha)
end,
OnEnd = function(self)
print("Tween zakończony")
end,
})
end
interval
Wykonuje niestandardową funkcję zwrotną w określonym czasie przez określoną częstotliwość, w sekundach. Przydatne do powtarzających się zdarzeń, takich jak migające światła, pulsowanie intensywności dźwięku itd. Najniższa możliwa częstotliwość wynosi 0 sekund, ale technicznie minimalna częstotliwość zawsze jest ograniczona do Heartbeat.
| Klucz konfiguracji | Opis |
|---|---|
| CzasRozpoczęcia | Początek czasu trwania interwału w odniesieniu do długości sceny, w sekundach. |
| CzasZakończenia | Koniec czasu trwania interwału w odniesieniu do długości sceny, w sekundach. |
| Częstotliwość | Jak często funkcja OnInterval powinna być wywoływana, w sekundach, przy czym pierwsze wykonanie będzie miało miejsce w CzasRozpoczęcia. |
| OnStart | Custom function to fire when the series of intervals begins. |
| OnInterval | Custom function to fire at every interval within the specified duration (CzasRozpoczęcia do CzasZakończenia). |
| OnEnd | Custom function to fire when the series of intervals ends. |
| SyncToAudio | Tabela definiująca, czy synchronizować czas trwania interwału z konfiguracją audio. Przyjmuje następujące klucze:
|
Klient - Schemat
Schemat.OnRun = function()
print("OnRun (Klient)")
local GłównyDźwięk = Schemat:audio({
CzasRozpoczęcia = 1,
SoundId = "rbxassetid://1838673350",
})
local AktualizacjaTimeraKlienta = Schemat:interval({
Częstotliwość = 1,
SyncToAudio = {
StartAtAudioTime = 2.5,
EndAtAudioTime = 10,
Audio = GłównyDźwięk
},
OnInterval = function(self)
print(GłównyDźwięk.Sound.TimePosition, GłównyDźwięk.CurrentSoundIntensityRatio)
end,
})
end
schedule
Podobnie jak interval, z tą różnicą, że możesz zdefiniować wiele konkretnych czasów rozpoczęcia dla tego samego zdarzenia, na przykład planując pokaz sztucznych ogni dwa razy w scenie.
| Klucz konfiguracji | Opis |
|---|---|
| CzasyRozpoczęcia | Tabela czasów rozpoczęcia w odniesieniu do długości sceny, w sekundach. |
| OnStart | Custom function to fire at every specified time in the CzasyRozpoczęcia table. |
| MożliweDoPominięcia | Boolean definiujący, czy zaplanowane zdarzenie może zostać pominięte przez użytkowników, którzy dołączają z opóźnieniem, lub podczas przeszukiwania przed zaplanowanym czasem rozpoczęcia. Jeśli ustawione na false, wszystkie czasy rozpoczęcia zaplanowane przed czasem dołączenia/przeszukiwania będą miały miejsce w tym czasie. Jeśli ustawione na true, tylko czasy rozpoczęcia zaplanowane po dołączeniu/przeszukiwaniu będą miały miejsce. Domyślnie wynosi false. |
| SyncToAudio | Tabela definiująca, czy synchronizować harmonogram z konfiguracją audio. Przyjmuje następujące klucze:
|
Klient - Schemat
Schemat.OnRun = function()
print("OnRun (Klient)")
Schemat:schedule({
CzasyRozpoczęcia = {5, 27.25},
OnStart = function(self)
-- Inicjalizacja tymczasowego połączenia z heartbeat
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Informowanie struktury o połączeniu
Schemat:inform(tempConnection)
end
})
end
inform
Informuje strukturę o wszelkich modułach, obiektach UI, połączeniach itp., które są tworzone w hooku cyklu życia OnRun, zapewniając, że są odpowiednio oczyszczane podczas przeszukiwania. Przykładowe przypadki użycia to:
Informowanie struktury o tymczasowym połączeniu ad-hoc, takim jak RunService.Heartbeat, aby połączenie zostało oczyszczone podczas przeszukiwania wcześniejszego punktu w czasie trwania sceny.
Serwer - SchematSchemat.OnRun = function()print("OnRun (Serwer)")Schemat:schedule({CzasyRozpoczęcia = {5},OnStart = function(self)-- Inicjalizacja tymczasowego połączenia z heartbeatlocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Informowanie struktury o połączeniuSchemat:inform(tempConnection)end})endWywoływanie niestandardowej funkcji "oczyszczania" w ModuleScript, która inicjalizuje połączenie lub inne odniesienie w obrębie hooku cyklu życia OnRun.
Serwer - Schematlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local RunService = game:GetService("RunService")local customModule = require(ReplicatedStorage:WaitForChild("CustomModule"))local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))local Schemat = SekwencjonatorZdarzeń.createSchema()Schemat.OnRun = function()print("OnRun (Serwer)")Schemat:schedule({CzasyRozpoczęcia = {5},OnStart = function(self)-- Wywołanie funkcji "init" w niestandardowym modulecustomModule.init()-- Wywołanie funkcji "clean" w niestandardowym module przy oczyszczaniu scenySchemat:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- Inicjalizacja połączenia z heartbeatCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- Rozłączenie i oczyszczenie połączenia z heartbeatif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
Funkcje
loadScene
loadScene(sceneName: string, startTime: number ?)
Programowo ładuje scenę po sceneName i rozpoczyna ją w startTime od jej początku. Zostanie dodany 5-sekundowy "okres łaski", aby scena załadowała się z serwera przed przeszukiwaniem i rozpoczęciem odtwarzania. Oznacza to, że jeśli wywołasz loadScene("[SceneName]", 20) dokładnie o 16:15:00, struktura poczeka 5 sekund oprócz żądanych 20, uruchamiając scenę o 16:15:25.
Skrypt
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
-- Dowiedz się, jaką następną scenę załadować po zakończeniu bieżącej sceny
SekwencjonatorZdarzeń.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" zakończony; załaduj pierwszą scenę koncertu
SekwencjonatorZdarzeń.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" zakończony; załaduj drugą scenę koncertu
SekwencjonatorZdarzeń.loadScene("Track2")
else
-- Powracaj do sceny przerywnikowej
SekwencjonatorZdarzeń.loadScene("PreShow")
end
end)
createSchema
createSchema(): table
Zwraca instancję schematu sceny schema do stworzenia logiki dla danej sceny.
Klient - Schemat
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
local Schemat = SekwencjonatorZdarzeń.createSchema()
Schemat.OnSetup = function(timePositionObject)
print("OnSetup (Klient)")
end
seek
seek(time: number)
Przeszukuje do wartości time, w sekundach, od początku aktualnie załadowanej sceny.
Skryptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))SekwencjonatorZdarzeń.seek(95.58)
setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
Ustala ilość czasu od końca wszystkich scen, w którym wysyłane jest ostrzeżenie. Możesz wykryć ostrzeżenie zarówno po stronie klienta za pomocą onSceneEndingWarningForClient, jak i po stronie serwera za pomocą onSceneEndingWarningForServer.
Skrypt
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
-- Załaduj scenę
SekwencjonatorZdarzeń.loadScene("BeautifulScene")
-- Ustaw czas ostrzeżenia na 5 sekund przed zakończeniem sceny
SekwencjonatorZdarzeń.setSceneWarningTime(5)
-- Wykryj, kiedy scena ma się zakończyć
SekwencjonatorZdarzeń.onSceneEndingWarningForServer:Connect(function()
warn("Scena ma się zakończyć!")
end)
setSeekingPermissions
setSeekingPermissions(permissions: table)
Przyznaje uprawnienia do przeszukiwania w oparciu o PlaceId wydarzenia, a także konkretne UserIds i/lub grupy oraz role w ich obrębie. Zobacz szukaj i przełączaj sceny po więcej informacji.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
Zwraca klientowe lub serwerowe foldery Środowiska bieżącej sceny, w zależności od tego, czy jest wywoływana z modułu Klient czy Serwer.
Klient - Schemat
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
local Schemat = SekwencjonatorZdarzeń.createSchema()
local środowiskoKlienta
local środowiskoSerwera
Schemat.OnSetup = function(timePositionObject)
print("OnSetup (Klient)")
-- Uzyskanie dostępu do środowisk sceny; nie dotyczy Trybu Wbudowanego
środowiskoKlienta = SekwencjonatorZdarzeń.getCurrentSceneEnvironment()
środowiskoSerwera = SekwencjonatorZdarzeń.getCurrentServerEnvironmentFromClient()
print("Aktualny czas to:", timePositionObject.Value)
end
Serwer - Schemat
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
local Schemat = SekwencjonatorZdarzeń.createSchema()
local środowiskoSerwera
local connectionKolorCzęści
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schemat.OnSetup = function(timePositionObject)
print("OnSetup (Serwer)")
-- Uzyskanie dostępu do środowiska sceny; nie dotyczy Trybu Wbudowanego
środowiskoSerwera = SekwencjonatorZdarzeń.getCurrentSceneEnvironment()
connectionKolorCzęści = changePartColorEvent.OnServerEvent:Connect(function(player, zmienionaCzęść, nowyKolor)
środowiskoSerwera.zmienionaCzęść.Color = nowyKolor
end)
end
getCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
Zwraca bieżący serwerowy folder Środowiska danej sceny. W przeciwieństwie do getCurrentSceneEnvironment, możesz to wywołać z modułu Klient.
Klient - Schemat
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
local Schemat = SekwencjonatorZdarzeń.createSchema()
local środowiskoKlienta
local środowiskoSerwera
Schemat.OnSetup = function(timePositionObject)
print("OnSetup (Klient)")
-- Uzyskanie dostępu do środowisk sceny; nie dotyczy Trybu Wbudowanego
środowiskoKlienta = SekwencjonatorZdarzeń.getCurrentSceneEnvironment()
środowiskoSerwera = SekwencjonatorZdarzeń.getCurrentServerEnvironmentFromClient()
print("Aktualny czas to:", timePositionObject.Value)
end
isLoadingScene
isLoadingScene(): boolean
Wywoływane z serwera, aby dowiedzieć się, czy scena jest aktualnie ładowana.
Skryptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))print(SekwencjonatorZdarzeń.isLoadingScene())while SekwencjonatorZdarzeń.isLoadingScene() dotask.wait()endprint("Scena załadowana")
Zdarzenia
onSceneEndingWarningForClient
Uruchamia się na kliencie przed zakończeniem sceny. Domyślny czas wynosi 3 sekundy, ale możesz dostosować go poprzez setSceneWarningTime. To zdarzenie można połączyć tylko w LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
-- Zdetectuj, kiedy scena ma się zakończyć (po stronie klienta)
SekwencjonatorZdarzeń.onSceneEndingWarningForClient:Connect(function()
warn("Scena ma się zakończyć!")
end)
onSceneEndingWarningForServer
Uruchamia się na serwerze przed zakończeniem sceny. Domyślny czas wynosi 3 sekundy, ale możesz dostosować go poprzez setSceneWarningTime. To zdarzenie można połączyć tylko w Script.
Skrypt
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
-- Zdetectuj, kiedy scena ma się zakończyć (po stronie serwera)
SekwencjonatorZdarzeń.onSceneEndingWarningForServer:Connect(function()
warn("Scena ma się zakończyć!")
end)
onSceneLoadedForClient
Uruchamia się na kliencie, gdy scena zaczyna. To zdarzenie można połączyć tylko w LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
-- Zdetectuj, kiedy scena się zaczyna (po stronie klienta)
SekwencjonatorZdarzeń.onSceneLoadedForClient:Connect(function()
warn("Scena się zaczyna!")
end)
onOrchestrationFinished
Uruchamia się na serwerze, gdy scena osiągnęła swoją długość czasową i skutecznie się zakończyła. To zdarzenie otrzymuje argument typu string endedSceneName dla sceny, która właśnie się zakończyła, i można wywołać to zdarzenie, aby warunkowo załadować inną scenę. Może być połączone tylko w Script.
Skrypt
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SekwencjonatorZdarzeń = require(ReplicatedStorage:WaitForChild("SekwencjonatorZdarzeń"))
-- Dowiedz się, jaką następną scenę załadować po zakończeniu bieżącej sceny
SekwencjonatorZdarzeń.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" zakończony; załaduj pierwszą scenę w koncertach
SekwencjonatorZdarzeń.loadScene("Track1")
elseif endedSceneName == "Track1" then-- "Track1" zakończony; załaduj drugą scenę w koncercie
EventSequencer.loadScene("Track2")
else
-- Powróć do sceny przed występem
EventSequencer.loadScene("PreShow")
end
end)