Sekwencer Wydarzeń

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

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:

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

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

  3. Zlokalizuj i kliknij kafelek Pakiety.

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

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

  1. W modelu Sekwencer Wydarzeń, który umieściłeś w ServerScriptService, przejdź do folderu ReplicatedStorage i wybierz wartość Inline.

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

  1. Rozwiń folder Sekwencer Wydarzeń i zlokalizuj folder PustaScena.

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

KontenerOpis
KlientZawiera wszystkie zasoby do załadowania, gdy jakikolwiek użytkownik (klient) dołącza do wydarzenia, takie jak obiekty interfejsu użytkownika lub rig animacji.
SpawnyGraczyZawiera części, w których użytkownicy pojawiają się po dołączeniu. Każda część w tym folderze zachowuje się podobnie do SpawnLocation.
SerwerZawiera 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.
TerenZawiera teren sceny.
OświetlenieZawiera 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.

  1. Utwórz nowy Script w ServerScriptService.

  2. Wklej następujący kod do nowego skryptu.

    Skrypt - Ustaw Uprawnienia do Przeszukiwania
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    EventSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Wypełnij następujące tabele w wywołaniu setSeekingPermissions w następujący sposób:

    placeIDsLista wartości PlaceId oddzielonych przecinkami, aby wspierać przeszukiwanie w ramach.
    userIDsLista wartości UserIds oddzielonych przecinkami dla tych, którzy mogą przeszukiwać w ramach wspieranych miejsc.
    groupsLista 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ę:

  1. Z menu Okno w Studio lub paska narzędzi na karcie Strona główna, otwórz Narzędziownię.

  2. Z wybraną zakładką Sklep Twórcy, wybierz Wtyczki z rozwijanego menu.

  3. W polu wyszukiwania wpisz Menedżer Scen i naciśnij Enter, aby zlokalizować wtyczkę.

  4. Kliknij ikonę wtyczki, aby zobaczyć jej szczegóły, a następnie kliknij przycisk Zainstaluj.

  5. 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 wtyczkiOpis
Załaduj KlientaJeśli zawartość klienta sceny jest odładowana, przenosi folder Środowisko/Klient do folderu Workspace/ScenesClient.
Załaduj SerwerJeśli zawartość serwera sceny jest odładowana, przenosi folder Środowisko/Serwer do folderu Workspace/ScenesServer.
Odładuj KlientaJeśli zawartość klienta sceny jest załadowana, przenosi folder Klient z Workspace/ScenesClient z powrotem do folderu [Scena]/Środowisko.
Odładuj SerwerJeśli zawartość serwera sceny jest załadowana, przenosi folder Serwer z Workspace/ScenesServer z powrotem do folderu [Scena]/Środowisko.
Odładuj Wszystkie ScenyPrzenosi 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.

  1. Skonfiguruj właściwości oświetlenia, efekty post-processingu, efekty atmosferyczne i skyboxy sceny za pomocą usługi Lighting na najwyższym poziomie.

  2. W oknie wtyczki Menedżer Scen kliknij Zapisz Oświetlenie dla żądanej sceny.

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

  1. Skonfiguruj teren sceny za pomocą usługi Terrain na najwyższym poziomie.

  2. W oknie wtyczki Menedżer Scen kliknij Zapisz Teren dla żądanej sceny.

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

Schemat Klienta
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)
end
Schemat Serwera
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 (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)
end

OnRun

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.

Schemat Klienta
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
})
end

OnEndScene

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.

Schemat Serwera
Schema.OnEndScene = function()
print("OnEndScene (Serwer)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = 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 konfiguracjiOpis
StartTimeKiedy odtworzyć dźwięk w odniesieniu do długości sceny, w sekundach.
SoundIdIdentyfikator zasobu dźwięku do odtworzenia.
OnStartFunkcja niestandardowa, która jest wywoływana, gdy dźwięk zaczyna grać.
OnEndFunkcja niestandardowa, która jest wywoływana, gdy dźwięk kończy grać.
VolumeGłośność obiektu Sound; domyślnie 0.5.
Schemat Klienta
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
})
end

animate

Tworzy Animation, która odtwarza się w określonym czasie.

Klucz konfiguracjiOpis
StartTimeKiedy odtworzyć animację w odniesieniu do długości sceny, w sekundach.
EndTimeOpcjonalny czas, kiedy zakończyć animację w odniesieniu do długości sceny, w sekundach.
RigRig animacji, na którym ma być odtwarzana animacja.
AnimationIdIdentyfikator zasobu animacji do odtworzenia.
SpeedPrędkość odtwarzania animacji; domyślnie 1.
FadeInTimeCzas, aby animacja zaczęła się fade'ować, w sekundach; domyślnie 0.2 (sekundy).
FadeOutTimeCzas, aby animacja zakończyła się fade'owaniem, w sekundach; domyślnie 0.2 (sekundy).
OnStartFunkcja niestandardowa, która jest wywoływana, gdy animacja zaczyna grać.
OnEndFunkcja niestandardowa, która jest wywoływana, gdy animacja kończy grać.
LoopedCzy animacja ma być powtarzana; domyślnie false.
SyncToAudioTabela definiująca, czy synchronizować animację z konfiguracją dźwięku. Akceptuje następujące klucze:
  • Audio – Odniesienie do konfiguracji dźwięku.
  • StartAtAudioTime – Kiedy odtworzyć animację w odniesieniu do długości dźwięku.
  • EndAtAudioTime – Opcjonalny czas, w którym zakończyć animację w odniesieniu do długości dźwięku.
Schemat Klienta
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
})
end

tween

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 konfiguracjiOpis
StartTimesTabela czasów rozpoczęcia w odniesieniu do długości sceny, w sekundach.
TweenTabela definiująca obiekt i właściwości do tweenowania. Akceptuje następujące klucze:
  • Object – Obiekt do tweenowania.
  • Info – instancja TweenInfo dla tweenu, definiująca jego długość, Enum.EasingStyle, Enum.EasingDirection itp.
  • Properties – Właściwości obiektu i powiązane wartości docelowe dla tweenu.
OnStartFunkcja niestandardowa, która jest wywoływana, gdy tween zaczyna grać.
OnHeartbeatFunkcja niestandardowa, która jest wywoływana przy każdym Heartbeat; otrzymuje alpha tweenu jako drugi parametr.
OnEndFunkcja niestandardowa, która jest wywoływana, gdy tween kończy grać.
SyncToAudioTabela definiująca, czy synchronizować tween z konfiguracją dźwięku. Akceptuje następujące klucze:
  • Audio – Odniesienie do konfiguracji dźwięku.
  • StartAtAudioTimes – Tabela czasów rozpoczęcia definiująca, kiedy odtworzyć tween w odniesieniu do długości dźwięku.
Schemat Klienta
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,
})
end

interval

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 konfiguracjiOpis
StartTimePoczątek długości interwału w odniesieniu do długości sceny, w sekundach.
EndTimeKoniec długości interwału w odniesieniu do długości sceny, w sekundach.
FrequencyJak często funkcja OnInterval powinna być wywoływana, w sekundach, przy czym pierwsze wykonanie ma miejsce w StartTime.
OnStartFunkcja niestandardowa, która jest wywoływana, gdy seria interwałów się zaczyna.
OnIntervalFunkcja niestandardowa, która jest wywoływana w każdym interwale w określonym czasie (StartTime do EndTime).
OnEndFunkcja niestandardowa, która jest wywoływana, gdy seria interwałów się kończy.
SyncToAudioTabela definiująca, czy synchronizować długość interwału z konfiguracją dźwięku. Akceptuje następujące klucze:
  • Audio – Odniesienie do konfiguracji dźwięku.
  • StartAtAudioTime – Kiedy rozpocząć długość interwału w odniesieniu do długości dźwięku.
  • EndAtAudioTime – Opcjonalny czas, w którym zakończyć długość interwału w odniesieniu do długości dźwięku.
Schemat Klienta
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,
})
end

schedule

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 konfiguracjiOpis
StartTimesTabela czasów rozpoczęcia w odniesieniu do długości sceny, w sekundach.
OnStartFunkcja niestandardowa, która jest wywoływana w każdym określonym czasie w tabeli StartTimes.
SkippableBoolean 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.
SyncToAudioTabela definiująca, czy synchronizować harmonogram z konfiguracją dźwięku. Akceptuje następujące klucze:
  • Audio – Odniesienie do konfiguracji dźwięku.
  • StartAtAudioTimes – Tabela czasów rozpoczęcia definiująca, kiedy wywołać funkcję OnStart w odniesieniu do długości dźwięku.
Schemat Klienta
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
})
end

inform

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 Serwera
    Schema.OnRun = function()
    print("OnRun (Serwer)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Inicjalizuj tymczasowe połączenie heartbeat
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Informuj framework o połączeniu
    Schema:inform(tempConnection)
    end
    })
    end
  • Wywoływanie niestandardowej funkcji "sprzątania" w ModuleScript, która inicjalizuje połączenie lub inny odniesienie podczas hooku cyklu życia OnRun.

    Schemat Serwera
    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 (Serwer)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Wywołaj funkcję "init" w niestandardowym module
    customModule.init()
    -- Wywołaj funkcję "clean" w niestandardowym module podczas sprzątania sceny
    Schema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule
    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Inicjalizuj połączenie heartbeat
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Rozłącz i wyczyść połączenie heartbeat
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return 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.

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

Schemat Klienta
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.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.

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

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

Schemat 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)
end
Schemat Serwera
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 (Serwer)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
end

getCurrentServerEnvironmentFromClient

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.

Schemat 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)
end

isLoadingScene

isLoadingScene(): boolean

Wywoływane z serwera, aby wiedzieć, czy scena jest aktualnie ładowana.

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

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.

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

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.

Skrypt
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)
©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.