Sekwencer Wydarzeń to potężna struktura, która umożliwia budowanie wydarzeń na żywo i scenek przerywnikowych w oparciu o uporządkowaną sekwencję działań i wyzwalaczy. Bardziej szczegółowo, ten moduł pomaga Ci:
- Budować wydarzenie lub scenkę przerywnikową w oparciu o uporządkowaną strukturę poprzez zaplanowane konfiguracje dźwięku, animacji i tweenów.
- Przechodzić między wieloma scenami na różnych serwerach, synchronizując złożone animacje i wizualizacje z harmonogramem.
- Przeszukiwać wydarzenie i podglądać grę 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 wysoko odwiedzanych grach.
Aby zobaczyć Sekwencer Wydarzeń w akcji w edytowalnym miejscu, sprawdź szablon Koncert w Roblox Studio. Ten szablon jest kompleksowym punktem wyjścia dla deweloperów do tworzenia wydarzeń/koncertów i zapoznania się z różnymi funkcjami i komponentami.

Użycie modułu
Instalacja
Aby użyć struktury Sekwencer Wydarzeń w grze:
Z menu Okno w Studio lub paska narzędzi na karcie Strona główna, otwórz Narzędziownię i wybierz zakładkę Sklep Twórcy.

Upewnij się, że wybrano sortowanie Modele, a następnie kliknij przycisk Zobacz wszystkie dla Kategorii.

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

W oknie Eksplorator, przenieś cały model Sekwencer Wydarzeń do ServerScriptService. Po uruchomieniu gry 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. Gdy scena się ładuje, te obiekty i właściwości są dystrybuowane do Workspace, Terrain i Lighting, zastępując istniejące obiekty/właściwości, aby utworzyć sklonowaną przestrzeń.
Tryb wbudowany
Alternatywnym trybem struktury jest tryb wbudowany, w którym podobnie projektujesz unikalne sceny z logiką skryptową dla ich przepływu/wydarzeń, 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 Sekwencer Wydarzeń, który umieściłeś w ServerScriptService, przejdź do folderu ReplicatedStorage i wybierz wartość Inline.

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

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

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

Długość czasu
Każda scena powinna mieć długość czasu, w sekundach, definiującą jej czas trwania — tak jak film lub koncert ma ustaloną długość. Długość czasu jest definiowana jako atrybut numeryczny atrybut w folderze sceny o nazwie TimeLength, 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 i efekty środowiskowe, oraz obiekty interfejsu użytkownika. Gdy scena się ładuje, te obiekty i właściwości są dystrybuowane do Workspace, Terrain i Lighting, zastępując istniejące obiekty/właściwości, aby utworzyć sklonowaną przestrzeń.
Folder Środowisko zawiera następujące kontenery:
| Kontener | Opis |
|---|---|
| Klient | Zawiera wszystkie zasoby do załadowania, gdy jakikolwiek użytkownik (klient) dołącza do wydarzenia, takie jak obiekty interfejsu użytkownika lub rig animacji. |
| SpawnyGraczy | Zawiera części, w których użytkownicy pojawiają się po dołączeniu. Każda część w tym folderze zachowuje się 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 znajdowała się 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 post-processingu. |
Wydarzenia
Folder Wydarzenia sceny jest czysto miejscem dla RemoteEvents, które komunikują się między modułami Klienta i Serwera. Nie jest wymagane umieszczanie czegokolwiek w tym folderze.
Klient
Ten skrypt wykonuje logikę schematu po stronie klienta.
Serwer
Ten skrypt wykonuje logikę schematu po stronie serwera.
Schematy scen
Schemat sceny definiuje, co się dzieje w danym momencie na osi czasu sceny. Powinieneś zdefiniować schemat sceny zarówno w jej modułach Klienta, jak i Serwera i uwzględnić hooki cyklu życia, aby zarządzać, kiedy występują konfiguracje.
Hooki cyklu życia
Hooki cyklu życia schematu pozwalają zarządzać, kiedy operacje sceny mają miejsce. Scena w produkcji zazwyczaj działa w najprostszej sekwencji:
OnRun może być przerwany podczas przeszukiwania:
Wszystkie trzy hooki mogą również powtarzać się, jeśli scena jest odtwarzana ponownie:
Konfiguracje
Konfiguracje schematu definiują podstawowe operacje sceny, na przykład odtwarzanie dźwięku o 00:32, kolejkowanie animacji do synchronizacji z tym dźwiękiem, planowanie wydarzenia sceny jak pokaz fajerwerków i więcej. Każda konfiguracja obsługuje określone funkcje zwrotne, gdzie pierwszy parametr (self) to instancja konfiguracji.
Przeszukiwanie scen
Unikalną cechą Sekwencera Wydarzeń jest możliwość "przeszukiwania" scen, tak jak można przeszukiwać wideo. W Trybie Zastępowania możesz również przełączać się między scenami, aby podglądać całe wydarzenie wieloscenowe przed wdrożeniem go 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 przepływu czasowego. Zamiast tego musisz przyznać uprawnienia do przeszukiwania na podstawie PlaceId wydarzenia, a także konkretnych UserIds i/lub grup oraz ról w ich ramach.
Utwórz nowy Script w ServerScriptService.
Wklej następujący kod do nowego skryptu.
Skrypt - Ustaw Uprawnienia do Przeszukiwanialocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})Wypełnij następujące tabele w wywołaniu setSeekingPermissions w następujący sposób:
placeIDs Lista wartości PlaceId oddzielonych przecinkami, aby wspierać przeszukiwanie w ramach. userIDs Lista wartości UserIds oddzielonych przecinkami dla tych, którzy mogą przeszukiwać w ramach wspieranych miejsc. groups Lista tabel, z których każda zawiera identyfikator grupy i minimalny rangę członków tej grupy, którzy mogą przeszukiwać w ramach wspieranych miejsc.
Wtyczka menedżera scen
Wtyczka Menedżer Scen to przydatne narzędzie do ładowania i odładowywania scen, oświetlenia i terenu. Chyba że używasz Trybu Wbudowanego, zdecydowanie zaleca się korzystanie z tej wtyczki zamiast ręcznego umieszczania/edycji obiektów i właściwości scen.
Aby zainstalować wtyczkę:
Z menu Okno w Studio lub paska narzędzi na karcie Strona główna, otwórz Narzędziownię.
Z wybraną zakładką Sklep Twórcy, wybierz Wtyczki z rozwijanego menu.
W polu wyszukiwania wpisz Menedżer Scen i naciśnij Enter, aby zlokalizować wtyczkę.

Kliknij ikonę wtyczki, aby zobaczyć jej szczegóły, a następnie kliknij przycisk Zainstaluj.
Po zainstalowaniu wtyczki pojawi się ona na karcie Wtyczki w Studio.
Ładowanie i odładowywanie scen
Jak opisano w tworzeniu scen, folder Środowisko sceny zawiera wszystko, co użytkownicy widzą i słyszą, w tym obiekty 3D. Wtyczka pomaga szybko ładować zasoby sceny do lub z zorganizowanych folderów w obrębie przestrzeni roboczej.
| Działanie wtyczki | Opis |
|---|---|
| Załaduj Klienta | Jeśli zawartość klienta sceny jest odładowana, przenosi folder Środowisko/Klient do folderu Workspace/ScenesClient. |
| Załaduj Serwer | Jeśli zawartość serwera sceny jest odładowana, przenosi folder Środowisko/Serwer do folderu Workspace/ScenesServer. |
| Odładuj Klienta | Jeśli zawartość klienta sceny jest załadowana, przenosi folder Klient z Workspace/ScenesClient z powrotem do folderu [Scena]/Środowisko. |
| Odładuj Serwer | Jeśli zawartość serwera sceny jest załadowana, przenosi folder Serwer z Workspace/ScenesServer z powrotem do folderu [Scena]/Środowisko. |
| Odł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 na najwyższym poziomie przechowuje wszystkie właściwości oświetlenia i efekty wizualne miejsca. Ponieważ jest to usługa na najwyższym poziomie, nie możesz ręcznie przenieść jej do folderu Środowisko/Serwer lub Środowisko/Klient danej 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świetlenia, efekty post-processingu, efekty atmosferyczne i skyboxy sceny za pomocą usługi Lighting na najwyższym poziomie.

W oknie wtyczki Menedżer 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świetlenia jako atrybuty folderu, a także sklonowane dzieci usługi Lighting na najwyższym poziomie.

Sklonowane instancje 
Zapisane atrybuty Gdy właściwości oświetlenia i dzieci są zapisane dla sceny, możesz szybko załadować je z powrotem do usługi Lighting na najwyższym poziomie, klikając Załaduj Oświetlenie w oknie wtyczki.
Zapisz i załaduj teren
Ponieważ Terrain jest klasą na najwyższym poziomie w obrębie Workspace, nie możesz ręcznie przenieść wygenerowanego lub rzeźbionego terenu do 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 za pomocą usługi Terrain na najwyższym poziomie.

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

Gdy teren jest zapisany dla sceny, możesz szybko załadować go z powrotem do usługi Terrain na najwyższym poziomie, klikając Załaduj Teren w oknie wtyczki.
Referencja API
Hooki cyklu życia schematu
OnSetup
Hook cyklu życia OnSetup jest przeznaczony do inicjowania zasobów i zmiennych, które będą odniesione w OnRun lub OnEndScene, ustawiania połączeń, które mają trwać przez czas trwania sceny itp. Ten hook otrzymuje parametr timePositionObject, który pozwala na odczytanie aktualnego czasu podczas inicjalizacji.
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 (Klient)")
-- Uzyskaj dostęp do środowisk sceny; nie dotyczy Trybu Wbudowanego
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- Czekaj na zasoby
dummy = clientEnvironment:WaitForChild("Dummy")
print("Aktualny czas to:", timePositionObject.Value)
endlocal 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 (Serwer)")
-- Uzyskaj dostęp do środowiska sceny; nie dotyczy Trybu Wbudowanego
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Aktualny czas to:", timePositionObject.Value)
endOnRun
OnRun to główny operacyjny hook cyklu życia w schemacie. Powinien zawierać wszystkie czasowe konfiguracje dla sceny, od odtwarzania dźwięku lub animacji po planowanie wydarzenia takiego jak pokaz fajerwerków.
Schema.OnRun = function()
print("OnRun (Klient)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Odtwarzanie dźwięku")
end,
OnEnd = function(self)
print("Dźwięk zakończony")
end
})
endOnEndScene
Hook cyklu życia OnEndScene jest przydatny do sprzątania wszystkiego, co pozostało w scenie, takiego jak rozłączanie połączeń utworzonych w OnSetup lub OnRun, które pozostają przez czas trwania sceny.
Schema.OnEndScene = function()
print("OnEndScene (Serwer)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
endKonfiguracje 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 |
|---|---|
| StartTime | Kiedy odtworzyć dźwięk w odniesieniu do długości sceny, w sekundach. |
| SoundId | Identyfikator zasobu dźwięku do odtworzenia. |
| OnStart | Funkcja niestandardowa, która jest wywoływana, gdy dźwięk zaczyna grać. |
| OnEnd | Funkcja niestandardowa, która jest wywoływana, gdy dźwięk kończy grać. |
| Volume | Głośność obiektu Sound; domyślnie 0.5. |
Schema.OnRun = function()
print("OnRun (Klient)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Odtwarzanie dźwięku")
end,
OnEnd = function(self)
print("Dźwięk zakończony")
end
})
endanimate
Tworzy Animation, która odtwarza się w określonym czasie.
| Klucz konfiguracji | Opis |
|---|---|
| StartTime | Kiedy odtworzyć animację w odniesieniu do długości sceny, w sekundach. |
| EndTime | Opcjonalny czas, kiedy zakończyć animację w odniesieniu do długości sceny, w sekundach. |
| Rig | Rig animacji, na którym ma być odtwarzana animacja. |
| AnimationId | Identyfikator zasobu animacji do odtworzenia. |
| Speed | Prędkość odtwarzania animacji; domyślnie 1. |
| FadeInTime | Czas, aby animacja zaczęła się fade'ować, w sekundach; domyślnie 0.2 (sekundy). |
| FadeOutTime | Czas, aby animacja zakończyła się fade'owaniem, w sekundach; domyślnie 0.2 (sekundy). |
| OnStart | Funkcja niestandardowa, która jest wywoływana, gdy animacja zaczyna grać. |
| OnEnd | Funkcja niestandardowa, która jest wywoływana, gdy animacja kończy grać. |
| Looped | Czy animacja ma być powtarzana; domyślnie false. |
| SyncToAudio | Tabela definiująca, czy synchronizować animację z konfiguracją dźwięku. Akceptuje następujące klucze:
|
Schema.OnRun = function()
print("OnRun (Klient)")
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("Odtwarzanie animacji")
end,
OnEnd = function(self)
print("Animacja zatrzymana")
end
})
endtween
Tworzy konfigurowalny Tween, który jest zachowywany w przeszukiwaniu i w dynamicznym dołączeniu, co oznacza, że możesz łączyć tweens w różnych punktach w czasie, a wszystko powinno grać i synchronizować się zgodnie z oczekiwaniami.
| Klucz konfiguracji | Opis |
|---|---|
| StartTimes | Tabela czasów rozpoczęcia w odniesieniu do długości sceny, w sekundach. |
| Tween | Tabela definiująca obiekt i właściwości do tweenowania. Akceptuje następujące klucze:
|
| OnStart | Funkcja niestandardowa, która jest wywoływana, gdy tween zaczyna grać. |
| OnHeartbeat | Funkcja niestandardowa, która jest wywoływana przy każdym Heartbeat; otrzymuje alpha tweenu jako drugi parametr. |
| OnEnd | Funkcja niestandardowa, która jest wywoływana, gdy tween kończy grać. |
| SyncToAudio | Tabela definiująca, czy synchronizować tween z konfiguracją dźwięku. Akceptuje następujące klucze:
|
Schema.OnRun = function()
print("OnRun (Klient)")
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 gra")
end,
OnHeartbeat = function(self, alpha)
print("Alpha tweenu", alpha)
end,
OnEnd = function(self)
print("Tween zakończony")
end,
})
endinterval
Wykonuje niestandardową funkcję zwrotną przez określony czas z określoną częstotliwością, w sekundach. Przydatne do powtarzających się wydarzeń, takich jak migające światła, pulsowanie intensywności dźwięku itp. Najniższa możliwa częstotliwość to 0 sekund, ale technicznie minimalna częstotliwość jest zawsze ograniczona do Heartbeat.
| Klucz konfiguracji | Opis |
|---|---|
| StartTime | Początek długości interwału w odniesieniu do długości sceny, w sekundach. |
| EndTime | Koniec długości interwału w odniesieniu do długości sceny, w sekundach. |
| Frequency | Jak często funkcja OnInterval powinna być wywoływana, w sekundach, przy czym pierwsze wykonanie ma miejsce w StartTime. |
| OnStart | Funkcja niestandardowa, która jest wywoływana, gdy seria interwałów się zaczyna. |
| OnInterval | Funkcja niestandardowa, która jest wywoływana w każdym interwale w określonym czasie (StartTime do EndTime). |
| OnEnd | Funkcja niestandardowa, która jest wywoływana, gdy seria interwałów się kończy. |
| SyncToAudio | Tabela definiująca, czy synchronizować długość interwału z konfiguracją dźwięku. Akceptuje następujące klucze:
|
Schema.OnRun = function()
print("OnRun (Klient)")
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,
})
endschedule
Podobnie jak interval, z tą różnicą, że możesz zdefiniować wiele konkretnych czasów rozpoczęcia dla tego samego wydarzenia, na przykład planując pokaz fajerwerków dwa razy w scenie.
| Klucz konfiguracji | Opis |
|---|---|
| StartTimes | Tabela czasów rozpoczęcia w odniesieniu do długości sceny, w sekundach. |
| OnStart | Funkcja niestandardowa, która jest wywoływana w każdym określonym czasie w tabeli StartTimes. |
| Skippable | Boolean definiujący, czy zaplanowane wydarzenie może być pominięte dla użytkowników, którzy dołączają późno, lub dla tych, którzy przeszukują przed zaplanowanym czasem rozpoczęcia. Jeśli ustawione na false, wszystkie czasy rozpoczęcia zaplanowane przed czasem dołączenia/przeszukiwania wystąpią w tym czasie dołączenia/przeszukiwania. Jeśli ustawione na true, tylko czasy rozpoczęcia zaplanowane po czasie dołączenia/przeszukiwania wystąpią. Domyślnie false. |
| SyncToAudio | Tabela definiująca, czy synchronizować harmonogram z konfiguracją dźwięku. Akceptuje następujące klucze:
|
Schema.OnRun = function()
print("OnRun (Klient)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Inicjalizuj tymczasowe połączenie heartbeat
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Informuj framework o połączeniu
Schema:inform(tempConnection)
end
})
endinform
Informuje framework o wszelkich modułach, obiektach UI, połączeniach itp., które są tworzone w hooku cyklu życia OnRun, zapewniając, że są one odpowiednio sprzątane podczas przeszukiwania. Przykłady użycia obejmują:
Informowanie framework o tymczasowym połączeniu ad-hoc, takim jak RunService.Heartbeat, aby połączenie zostało sprzątnięte podczas przeszukiwania do wcześniejszego punktu w czasie trwania sceny.
Schemat SerweraSchema.OnRun = function()print("OnRun (Serwer)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Inicjalizuj tymczasowe połączenie heartbeatlocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Informuj framework o połączeniuSchema:inform(tempConnection)end})endWywoływanie niestandardowej funkcji "sprzątania" w ModuleScript, która inicjalizuje połączenie lub inny odniesienie podczas hooku cyklu życia OnRun.
Schemat Serweralocal 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 (Serwer)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Wywołaj funkcję "init" w niestandardowym modulecustomModule.init()-- Wywołaj funkcję "clean" w niestandardowym module podczas sprzątania scenySchema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- Inicjalizuj połączenie heartbeatCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- Rozłącz i wyczyść połączenie heartbeatif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
Funkcje
loadScene
loadScene(sceneName: string, startTime: number ?)
Programowo ładuje scenę według sceneName i rozpoczyna ją w startTime od jej początku. Będzie istniał 5-sekundowy "okres łaski" na załadowanie sceny z serwera przed wystąpieniem przeszukiwania i rozpoczęciem odtwarzania sceny. Oznacza to, że jeśli wywołasz loadScene("[SceneName]", 20) dokładnie o 16:15:00, framework poczeka 5 sekund oprócz żądanych 20, uruchamiając scenę o 16:15:25.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Ustal, która scena ma być załadowana, gdy bieżąca scena się kończy
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" zakończone; załaduj pierwszą scenę w koncercie
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" zakończone; załaduj drugą scenę w koncercie
EventSequencer.loadScene("Track2")
else
-- Powróć do sceny przed pokazem
EventSequencer.loadScene("PreShow")
end
end)createSchema
createSchema(): table
Zwraca instancję schematu sceny do tworzenia logiki dla sceny.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Klient)")
endseek
seek(time: number)
Przeszukuje do wartości time, w sekundach, od początku aktualnie załadowanej sceny.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.seek(95.58)setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
Ustawia ilość czasu od końca wszystkich scen, w którym wysyłane jest ostrzeżenie. Możesz wykryć ostrzeżenie po stronie klienta przez onSceneEndingWarningForClient lub po stronie serwera przez onSceneEndingWarningForServer.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Załaduj scenę
EventSequencer.loadScene("BeautifulScene")
-- Ustaw czas ostrzeżenia na 5 sekund przed końcem sceny
EventSequencer.setSceneWarningTime(5)
-- Wykryj, kiedy scena ma się zakończyć
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scena ma się zakończyć!")
end)setSeekingPermissions
setSeekingPermissions(permissions: table)
Przyznaje uprawnienia do przeszukiwania na podstawie PlaceId wydarzenia, a także konkretnych UserIds i/lub grup oraz ról w ich ramach. Zobacz przeszukiwanie i przełączanie scen po więcej informacji.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
Zwraca folder Środowisko aktualnej sceny po stronie klienta lub serwera, w zależności od tego, czy jest wywoływana z modułu Klienta czy Serwera.
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 (Klient)")
-- Uzyskaj dostęp do środowisk sceny; nie dotyczy Trybu Wbudowanego
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Aktualny czas to:", timePositionObject.Value)
endlocal 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 (Serwer)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
endgetCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
Zwraca folder środowisko aktualnej sceny po stronie serwera. W przeciwieństwie do getCurrentSceneEnvironment, możesz to wywołać z modułu Klienta.
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 (Klient)")
-- Uzyskaj dostęp do środowisk sceny; nie dotyczy Trybu Wbudowanego
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Aktualny czas to:", timePositionObject.Value)
endisLoadingScene
isLoadingScene(): boolean
Wywoływane z serwera, aby wiedzieć, czy scena jest aktualnie ładowana.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("Scena załadowana")Wydarzenia
onSceneEndingWarningForClient
Wywoływane po stronie klienta przed zakończeniem sceny. Domyślny czas to 3 sekundy, ale możesz go skonfigurować przez setSceneWarningTime. To wydarzenie może być połączone tylko w LocalScript.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Wykryj, kiedy scena ma się zakończyć (po stronie klienta)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("Scena ma się zakończyć!")
end)onSceneEndingWarningForServer
Wywoływane po stronie serwera przed zakończeniem sceny. Domyślny czas to 3 sekundy, ale możesz go skonfigurować przez setSceneWarningTime. To wydarzenie może być połączone tylko w Script.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Wykryj, kiedy scena ma się zakończyć (po stronie serwera)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scena ma się zakończyć!")
end)onSceneLoadedForClient
Wywoływane po stronie klienta, gdy scena się zaczyna. To wydarzenie może być połączone tylko w LocalScript.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Wykryj, kiedy scena się zaczyna (po stronie klienta)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("Scena się zaczyna!")
end)onOrchestrationFinished
Wywoływane po stronie serwera, gdy scena osiągnęła swoją długość czasu i skutecznie się zakończyła. To wydarzenie otrzymuje argument string endedSceneName dla sceny, która właśnie się zakończyła, i możesz łańcuchować to wydarzenie, aby warunkowo załadować inną scenę. Może być połączone tylko w Script.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Ustal, która scena ma być załadowana, gdy bieżąca scena się kończy
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" zakończone; załaduj pierwszą scenę w koncercie
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then-- "Track1" zakończony; załaduj drugą scenę w koncercie
EventSequencer.loadScene("Track2")
else
-- Wróć do sceny przed pokazem
EventSequencer.loadScene("PreShow")
end
end)