Urutan Acara adalah kerangka kerja yang kuat yang memungkinkan Anda untuk membangun acara langsung antar server dan cutscene dalam urutan aksi dan pemicu yang terstruktur. Lebih spesifiknya, modul ini membantu Anda:
- Membangun acara atau cutscene dalam kerangka kerja terstruktur melalui konfigurasi terjadwal audio, animasi, dan tweens.
- Beralih antara beberapa adegan di beberapa server, menyinkronkan animasi dan visual yang kompleks dengan garis waktu.
- Mencari sebuah acara dan praprisai pengalaman untuk tujuan pengujian dan pengembangan.
Kerangka kerja ini telah diuji dalam acara Roblox seperti konser Twenty One Pilots dan 24kGoldn, serta banyak pengalaman yang sangat dikunjungi.
Untuk melihat Urutan Acara dalam aksi di dalam tempat yang dapat diedit, lihat templat Konser di Roblox Studio. Templat ini adalah titik awal yang komprehensif bagi pengembang untuk membuat acara/konser dan membiasakan mereka dengan berbagai fitur dan komponen yang terlibat.

Penggunaan modul
Instalasi
Untuk menggunakan kerangka kerja Urutan Acara dalam sebuah pengalaman:
Dari menu Window Studio atau bilah alat tab Home, buka Toolbox dan pilih tab Toko Pembuat.

Pastikan pengurutan Models dipilih, kemudian klik tombol Lihat Semua untuk Kategori.

Temukan dan klik ubin Paket.
Temukan modul Urutan Acara dan klik itu, atau seret dan lepas ke dalam tampilan 3D.

Di jendela Eksplorator, pindahkan model Urutan Acara ke dalam ServerScriptService. Setelah menjalankan pengalaman, modul akan mulai berjalan.
Mode kerangka kerja
Mode ganti
Mode kerangka kerja default adalah mode ganti di mana Anda merancang adegan unik dengan menempatkan objek 3D, terrain, properti pencahayaan, efek lingkungan, dan objek antarmuka pengguna ke dalam folder Lingkungan adegan tersebut. Ketika sebuah adegan dimuat, objek dan properti tersebut akan didistribusikan ke dalam Workspace, Terrain, dan Lighting, menggantikan objek/properti yang ada untuk membentuk ruang yang dikloning.
Mode inline
Mode kerangka kerja alternatif adalah mode inline di mana Anda juga merancang adegan unik dengan logika skrip untuk alur/acara mereka, tetapi kerangka kerja tidak akan menghancurkan objek 3D, terrain, properti pencahayaan, efek lingkungan, dan objek antarmuka pengguna yang ada untuk mengkloning aset/properti dari folder Lingkungan adegan ketika dimuat.
Untuk mengaktifkan mode inline:
Di dalam model Urutan Acara yang Anda tempatkan di ServerScriptService, cari dan pilih nilai Inline di dalam folder ReplicatedStorage.

Di jendela Properti, aktifkan kotak centang Value.

Membuat adegan
Sebuah adegan pada dasarnya adalah bagian dari keseluruhan acara atau cutscene yang dibungkus dalam serangkaian folder. Setiap adegan berisi logika skrip yang mendefinisikan alur/acara, dan sebuah adegan dapat menyimpan objek 3D, terrain, properti pencahayaan, efek lingkungan, dan objek antarmuka pengguna sendiri.
Untuk memulai dengan cepat, Anda dapat menemukan adegan kosong di dalam folder utama modul:
Perluas folder Urutan Acara dan temukan folder BlankScene.

Pindahkan atau salin seluruh folder BlankScene ke dalam ReplicatedStorage.

Panjang waktu
Setiap adegan harus memiliki panjang waktu, dalam detik, yang mendefinisikan durasinya — sama seperti film atau konser memiliki durasi yang ditetapkan. Panjang waktu didefinisikan sebagai atribut numerik pada folder adegan yang dinamai TimeLength yang dapat Anda atur langsung di Studio atau secara programatik melalui Instance:SetAttribute().


Lingkungan
Folder Lingkungan dari sebuah adegan berisi semua yang dilihat dan didengar pengguna, termasuk objek 3D, terrain, properti pencahayaan dan efek lingkungan, serta objek antarmuka pengguna. Ketika sebuah adegan dimuat, objek dan properti tersebut didistribusikan ke dalam Workspace, Terrain, dan Lighting, menggantikan objek/properti yang ada untuk membentuk ruang yang dikloning.
Folder Lingkungan berisi kontainer berikut:
| Kontainer | Deskripsi |
|---|---|
| Klien | Mengandung semua aset yang dimuat ketika pengguna (klien) bergabung dengan acara, seperti objek antarmuka pengguna atau rig animasi. |
| PlayerSpawns | Mengandung bagian tempat pengguna muncul ketika bergabung. Setiap bagian di folder ini berfungsi mirip dengan SpawnLocation. |
| Server | Mengandung semua aset yang dimuat ketika sebuah adegan pertama kali dibuat di server. Disarankan agar sebagian besar aset visual dimuat di sini. |
| Terrain | Mengandung terrain adegan. |
| Pencahayaan | Mengandung properti pencahayaan global sebagai atribut, serta modifier seperti efek atmosfer dan efek pasca-pemrosesan. |
Acara
Folder Acara dari sebuah adegan adalah murni placeholder untuk RemoteEvents yang berkomunikasi antara modul Klien dan Server. Tidak ada persyaratan untuk menempatkan sesuatu di folder ini.
Klien
Skrip ini mengeksekusi logika skema di klien.
Server
Skrip ini mengeksekusi logika skema di server.
Skema adegan
skema dari sebuah adegan mendefinisikan apa yang terjadi pada titik mana dalam garis waktu adegan. Anda harus mendefinisikan skema adegan di modul Klien dan Server serta menyertakan lifecycle hooks untuk mengelola kapan konfigurasi terjadi.
Lifecycle hooks
Lifecycle hooks skema memungkinkan Anda mengelola kapan operasi adegan terjadi. Sebuah adegan yang sedang diproduksi biasanya akan berjalan dalam alur yang paling sederhana:
OnRun dapat terganggu saat mencari:
Ketiga hook ini juga dapat diulang jika adegan diputar ulang:
Konfigurasi
Konfigurasi skema mendefinisikan operasi inti sebuah adegan, misalnya memutar audio pada 00:32, mengantri sebuah animasi untuk disinkronkan dengan audio tersebut, menjadwalkan peristiwa adegan seperti pertunjukan kembang api, dan sebagainya. Setiap konfigurasi mendukung fungsi callback tertentu di mana parameter pertama (self) adalah instance konfigurasi.
Cari adegan
Fitur unik dari Urutan Acara adalah kemampuan untuk "mencari" di sekitar adegan seperti Anda mungkin mencari lewat video. Dalam Mode Ganti, Anda juga dapat berpindah antar adegan untuk menampilkan praprisai keseluruhan acara multi-adegan sebelum menyebarkannya ke produksi.
Pencarian adegan tidak dapat diakses oleh semua orang karena pengguna yang sekadar menikmati acara seharusnya tidak memiliki kemampuan untuk mengontrol alur waktunya. Sebagai gantinya, Anda harus memberikan izin pencarian berdasarkan PlaceId acara serta UserIds spesifik dan/atau grup dan peran di dalamnya.
Buat Script baru di dalam ServerScriptService.
Tempelkan kode berikut ke dalam skrip baru.
Script - Set Seeking Permissionslocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})Isi tabel berikut dalam panggilan setSeekingPermissions seperti berikut:
placeIDs Daftar yang dipisahkan koma dari nilai PlaceId untuk mendukung pencarian di dalamnya. userIDs Daftar yang dipisahkan koma dari UserIds untuk mereka yang dapat mencari di dalam tempat yang didukung. groups Daftar yang dipisahkan koma dari tabel, masing-masing berisi ID grup dan peringkat minimum anggota grup tersebut yang dapat mencari di dalam tempat yang didukung.
Plugin manajer adegan
Plugin Pengelola Adegan adalah alat berguna untuk memuat dan membongkar adegan, pencahayaan, dan terrain. Kecuali Anda menggunakan Mode Inline, sangat disarankan agar Anda menggunakan plugin ini daripada menempatkan/mengedit objek dan properti adegan secara manual.
Untuk menginstal plugin:
Dari menu Window Studio atau bilah alat tab Home, buka Toolbox.
Dengan tab Toko Pembuat yang terpilih, pilih Plugins dari menu dropdown.
Di bidang pencarian, ketik Pengelola Adegan dan tekan Enter untuk menemukan plugin.

Klik ikon plugin untuk melihat detailnya dan kemudian klik tombol Instal.
Setelah plugin terinstal, ia akan muncul di tab Plugins Studio.
Muat dan bongkar adegan
Seperti yang dijelaskan dalam membuat adegan, folder Lingkungan dari sebuah adegan berisi semua yang dilihat dan didengar pengguna, termasuk objek 3D. Plugin ini membantu Anda dengan cepat memuat aset adegan ke dalam atau keluar dari folder yang terorganisir dalam workspace.
| Aksi plugin | Deskripsi |
|---|---|
| Muat Klien | Jika konten klien dari adegan tidak dimuat, memindahkan folder Lingkungan/Klien ke dalam folder Workspace/ScenesClient. |
| Muat Server | Jika konten server dari adegan tidak dimuat, memindahkan folder Lingkungan/Server ke dalam folder Workspace/ScenesServer. |
| Bongkar Klien | Jika konten klien dari adegan dimuat, memindahkan folder Klien dari Workspace/ScenesClient kembali ke folder [Adegan]/Lingkungan. |
| Bongkar Server | Jika konten server dari adegan dimuat, memindahkan folder Server dari Workspace/ScenesServer kembali ke folder [Adegan]/Lingkungan. |
| Bongkar Semua Adegan | Memindahkan setiap folder Klien dan Server yang dimuat kembali ke folder Lingkungan masing-masing. |
Simpan dan muat pencahayaan
Layanan Lighting tingkat atas menyimpan semua properti pencahayaan dan efek visual di suatu tempat. Karena ini adalah layanan tingkat atas, Anda tidak dapat memindahkannya secara manual ke folder Lingkungan/Server atau Lingkungan/Klien dari adegan tertentu. Sebagai gantinya, Anda dapat memanfaatkan plugin untuk menyalin propertinya dan anak-anaknya ke folder Lingkungan/Pencahayaan adegan.
Konfigurasikan properti pencahayaan, efek pasca-pemrosesan, efek atmosfer, dan skyboxes dari layanan Lighting tingkat atas.

Di jendela plugin Pengelola Adegan, klik Simpan Pencahayaan untuk adegan yang diinginkan.
Pilih dan perluas konfigurasi Lingkungan/Pencahayaan dari adegan tersebut dan Anda akan melihat propertinya yang sama sebagai atribut dari folder, serta anak-anak yang dikloning dari layanan Lighting tingkat atas.

Instance yang dikloning 
Atribut yang disimpan Setelah properti dan anak-anak pencahayaan disimpan untuk sebuah adegan, Anda dapat dengan cepat memuatnya kembali ke dalam layanan Lighting tingkat atas dengan mengklik Muat Pencahayaan dari jendela plugin.
Simpan dan muat terrain
Karena Terrain adalah kelas tingkat atas dalam Workspace, Anda tidak dapat secara manual memindahkan terrain yang dihasilkan atau diukir ke folder Lingkungan/Server atau Lingkungan/Klien dari sebuah adegan tertentu. Sebagai gantinya, Anda dapat memanfaatkan plugin untuk menyalinnya ke folder Lingkungan/Terrain dari adegan tersebut.
Konfigurasikan terrain dari adegan melalui layanan Terrain tingkat atas.

Di jendela plugin Pengelola Adegan, klik Simpan Terrain untuk adegan yang diinginkan.
Pilih dan perluas folder Lingkungan/Terrain dari adegan tersebut dan Anda akan melihat objek TerrainRegion yang mewakili terrain yang disimpan.

Setelah terrain disimpan untuk sebuah adegan, Anda dapat dengan cepat memuatnya kembali ke dalam layanan Terrain tingkat atas dengan mengklik Muat Terrain dari jendela plugin.
Referensi API
Lifecycle hooks skema
OnSetup
Hook lifecycle OnSetup ditujukan untuk menginisialisasi aset dan variabel yang akan dirujuk dalam OnRun atau OnEndScene, mengatur koneksi yang dimaksudkan untuk bertahan selama durasi adegan, dan sebagainya. Hook ini menerima parameter timePositionObject yang memungkinkan Anda membaca waktu saat ini saat setup.
Skema Klien
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 (Klien)")
-- Akses lingkungan adegan; tidak berlaku untuk Mode Inline
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- Tunggu aset
dummy = clientEnvironment:WaitForChild("Dummy")
print("Waktu saat ini adalah:", timePositionObject.Value)
end
Skema Server
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)")
-- Akses lingkungan adegan; tidak berlaku untuk Mode Inline
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Waktu saat ini adalah:", timePositionObject.Value)
end
OnRun
OnRun adalah hook lifecycle operasional utama dalam sebuah skema. Ini harus berisi semua konfigurasi terjadwal untuk adegan, dari memutar audio atau animasi hingga menjadwalkan sebuah acara seperti pertunjukan kembang api.
Skema Klien
Schema.OnRun = function()
print("OnRun (Klien)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio sedang diputar")
end,
OnEnd = function(self)
print("Audio telah berakhir")
end
})
end
OnEndScene
Hook lifecycle OnEndScene berguna untuk membersihkan apapun yang tersisa di dalam adegan, seperti memutus koneksi yang dibuat di OnSetup atau OnRun yang tetap ada selama durasi adegan.
Skema Server
Schema.OnEndScene = function()
print("OnEndScene (Server)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end
Konfigurasi skema
audio
Membuat objek Sound di dalam workspace yang diputar pada waktu tertentu. Suara tersebut kemudian dihapus setelah adegan berakhir atau setelah objek Sound selesai diputar.
| Kunci Konfigurasi | Deskripsi |
|---|---|
| StartTime | Kapan audio diputar sehubungan dengan durasi adegan, dalam detik. |
| SoundId | ID Aset dari audio yang akan diputar. |
| OnStart | Fungsi khusus yang dieksekusi ketika audio mulai diputar. |
| OnEnd | Fungsi khusus yang dieksekusi ketika audio selesai diputar. |
| Volume | Volume objek Sound; default adalah 0.5. |
Skema Klien
Schema.OnRun = function()
print("OnRun (Klien)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio sedang diputar")
end,
OnEnd = function(self)
print("Audio telah berakhir")
end
})
end
animate
Membuat sebuah Animation yang diputar pada waktu tertentu.
| Kunci Konfigurasi | Deskripsi |
|---|---|
| StartTime | Kapan animasi diputar sehubungan dengan durasi adegan, dalam detik. |
| EndTime | Waktu opsional kapan animasi berakhir sehubungan dengan durasi adegan, dalam detik. |
| Rig | Rig animasi yang dipilih untuk memutar animasi. |
| AnimationId | ID Aset dari animasi yang akan diputar. |
| Speed | Kecepatan pemutaran animasi; default adalah 1. |
| FadeInTime | Jumlah waktu untuk memudar masuk animasi, dalam detik; default adalah 0.2 (detik). |
| FadeOutTime | Jumlah waktu untuk memudar keluar animasi, dalam detik; default adalah 0.2 (detik). |
| OnStart | Fungsi khusus yang dieksekusi ketika animasi mulai diputar. |
| OnEnd | Fungsi khusus yang dieksekusi ketika animasi selesai diputar. |
| Looped | Apakah animasi akan diulang; default adalah false. |
| SyncToAudio | Tabel yang mendefinisikan apakah harus menyinkronkan animasi dengan konfigurasi audio. Menerima kunci berikut:
|
Skema Klien
Schema.OnRun = function()
print("OnRun (Klien)")
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("Animasi sedang diputar")
end,
OnEnd = function(self)
print("Animasi berhenti")
end
})
end
tween
Membuat Tween yang dapat dikonfigurasi yang dilestarikan dalam pencarian dan dalam bergabung dinamis, yang berarti Anda dapat merangkai tweens pada titik terpisah dalam waktu dan semuanya akan diputar dan disinkronkan seperti yang diharapkan.
| Kunci Konfigurasi | Deskripsi |
|---|---|
| StartTimes | Tabel waktu mulai sehubungan dengan durasi adegan, dalam detik. |
| Tween | Tabel yang mendefinisikan objek dan properti untuk tween. Menerima kunci berikut:
|
| OnStart | Fungsi khusus yang dieksekusi ketika tween mulai diputar. |
| OnHeartbeat | Fungsi khusus yang dieksekusi pada setiap Heartbeat; menerima alpha tween sebagai parameter keduanya. |
| OnEnd | Fungsi khusus yang dieksekusi ketika tween selesai diputar. |
| SyncToAudio | Tabel yang mendefinisikan apakah harus menyinkronkan tween dengan konfigurasi audio. Menerima kunci berikut:
|
Skema Klien
Schema.OnRun = function()
print("OnRun (Klien)")
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 sedang diputar")
end,
OnHeartbeat = function(self, alpha)
print("Alpha tween", alpha)
end,
OnEnd = function(self)
print("Tween selesai")
end,
})
end
interval
Menjalankan fungsi callback khusus secara berulang selama durasi tertentu dengan frekuensi tertentu, dalam detik. Berguna untuk acara pengulangan seperti lampu berkedip, mendapatkan intensitas audio, dll. Frekuensi terendah yang mungkin adalah 0 detik, tetapi pada dasarnya frekuensi minimum selalu dibatasi pada Heartbeat.
| Kunci Konfigurasi | Deskripsi |
|---|---|
| StartTime | Awal durasi interval sehubungan dengan durasi adegan, dalam detik. |
| EndTime | Akhir durasi interval sehubungan dengan durasi adegan, dalam detik. |
| Frequency | Seberapa sering fungsi OnInterval harus dieksekusi, dalam detik, dengan eksekusi pertama terjadi pada StartTime. |
| OnStart | Fungsi khusus yang dieksekusi ketika serangkaian interval dimulai. |
| OnInterval | Fungsi khusus yang dieksekusi pada setiap interval dalam durasi yang ditentukan (StartTime hingga EndTime). |
| OnEnd | Fungsi khusus yang dieksekusi ketika serangkaian interval berakhir. |
| SyncToAudio | Tabel yang mendefinisikan apakah harus menyinkronkan durasi interval dengan konfigurasi audio. Menerima kunci berikut:
|
Skema Klien
Schema.OnRun = function()
print("OnRun (Klien)")
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
Mirip dengan interval kecuali Anda dapat mendefinisikan beberapa waktu mulai spesifik untuk acara yang sama, seperti menjadwalkan pertunjukan kembang api dua kali dalam sebuah adegan.
| Kunci Konfigurasi | Deskripsi |
|---|---|
| StartTimes | Tabel waktu mulai sehubungan dengan durasi adegan, dalam detik. |
| OnStart | Fungsi khusus yang dieksekusi pada setiap waktu yang ditentukan di tabel StartTimes. |
| Skippable | Boolean yang mendefinisikan apakah acara yang dijadwalkan dapat dilewati bagi pengguna yang bergabung terlambat, atau untuk saat mencari di depan waktu mulai yang dijadwalkan. Jika diatur ke false, semua waktu mulai acara yang dijadwalkan sebelum waktu bergabung/mencari akan terjadi pada waktu bergabung/mencari tersebut. Jika diatur ke true, hanya waktu mulai yang dijadwalkan setelah bergabung/mencari yang akan terjadi. Default adalah false. |
| SyncToAudio | Tabel yang mendefinisikan apakah harus menyinkronkan jadwal dengan konfigurasi audio. Menerima kunci berikut:
|
Skema Klien
Schema.OnRun = function()
print("OnRun (Klien)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Menginisialisasi koneksi heartbeat sementara
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Memberitahu kerangka kerja tentang koneksi
Schema:inform(tempConnection)
end
})
end
inform
Memberitahu kerangka kerja tentang modul, objek UI, koneksi, dll. yang dibuat dalam hook lifecycle OnRun, memastikan bahwa mereka dibersihkan dengan benar saat mencari. Kasus pengguna termasuk:
Memberitahu kerangka kerja tentang koneksi ad-hoc sementara seperti RunService.Heartbeat sehingga koneksi dibersihkan saat mencari ke titik sebelumnya dalam durasi adegan.
Skema ServerSchema.OnRun = function()print("OnRun (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Menginisialisasi koneksi heartbeat sementaralocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Memberitahu kerangka tentang koneksiSchema:inform(tempConnection)end})endMemanggil fungsi "pembersihan" khusus di dalam ModuleScript yang menginisialisasi koneksi atau referensi lainnya selama hook lifecycle OnRun.
Skema Serverlocal 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)-- Memanggil fungsi "init" pada modul kustomcustomModule.init()-- Memanggil fungsi "clean" pada modul kustom saat pembersihan adeganSchema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- Menginisialisasi koneksi heartbeatCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- Memutuskan dan membersihkan koneksi heartbeatif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
Fungsi
loadScene
loadScene(sceneName: string, startTime: number ?)
Memuat adegan secara programatik berdasarkan sceneName dan memulainya pada startTime dari awalnya. Akan ada periode "grace" 5 detik untuk memuat adegan dari server sebelum pencarian terjadi dan adegan mulai diputar. Ini berarti jika Anda memanggil loadScene("[SceneName]", 20) pada tepat 4:15:00 PM, kerangka kerja akan menunggu 5 detik di samping 20 detik yang diminta, memulai adegan pada 4:15:25 PM.
Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Menentukan adegan berikutnya untuk dimuat ketika adegan saat ini selesai
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" selesai; memuat adegan pertama dalam konser
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" selesai; memuat adegan kedua dalam konser
EventSequencer.loadScene("Track2")
else
-- Kembali ke adegan pra-show
EventSequencer.loadScene("PreShow")
end
end)
createSchema
createSchema(): table
Mengembalikan instance dari skema adegan untuk membuat logika untuk adegan tersebut.
Skema Klien
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Klien)")
end
seek
seek(time: number)
Mencari ke nilai time, dalam detik, dari awal adegan yang saat ini dimuat.
Skriplocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.seek(95.58)
setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
Mengatur jumlah waktu dari akhir semua adegan dimana peringatan akan dikirimkan. Anda dapat mendeteksi peringatan ini baik di sisi klien melalui onSceneEndingWarningForClient atau di sisi server melalui onSceneEndingWarningForServer.
Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Memuat adegan
EventSequencer.loadScene("BeautifulScene")
-- Mengatur waktu peringatan 5 detik sebelum adegan berakhir
EventSequencer.setSceneWarningTime(5)
-- Deteksi ketika adegan akan berakhir
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Adegan akan segera berakhir!")
end)
setSeekingPermissions
setSeekingPermissions(permissions: table)
Memberi izin pencarian berdasarkan PlaceId acara serta UserIds spesifik dan/atau grup dan peran di dalamnya. Lihat mencari dan berpindah adegan untuk informasi lebih lanjut.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
Mengembalikan folder Lingkungan di sisi klien atau server dari adegan saat ini, tergantung pada apakah dipanggil dari skrip skema Klien atau Server.
Skema Klien
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 (Klien)")
-- Akses lingkungan adegan; tidak berlaku untuk Mode Inline
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Waktu saat ini adalah:", timePositionObject.Value)
end
Skema Server
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 (YIELDS)
Mengembalikan folder server-side Lingkungan dari adegan saat ini. Berbeda dengan getCurrentSceneEnvironment, Anda dapat memanggil ini dari skrip skema Klien.
Skema Klien
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 (Klien)")
-- Akses lingkungan adegan; tidak berlaku untuk Mode Inline
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Waktu saat ini adalah:", timePositionObject.Value)
end
isLoadingScene
isLoadingScene(): boolean
Dipanggil dari server untuk mengetahui apakah sebuah adegan sedang dimuat.
Skriplocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))print(EventSequencer.isLoadingScene())while EventSequencer.isLoadingScene() dotask.wait()endprint("Adegan dimuat")
Acara
onSceneEndingWarningForClient
Ditembak di klien sebelum adegan akan berakhir. Waktu default adalah 3 detik, tetapi Anda dapat mengonfigurasinya melalui setSceneWarningTime. Acara ini hanya dapat dihubungkan dalam LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Deteksi ketika adegan akan berakhir (sisi klien)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("Adegan akan segera berakhir!")
end)
onSceneEndingWarningForServer
Ditembak di server sebelum adegan akan berakhir. Waktu default adalah 3 detik, tetapi Anda dapat mengonfigurasinya melalui setSceneWarningTime. Acara ini hanya dapat dihubungkan dalam Script.
Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Deteksi ketika adegan akan berakhir (sisi server)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Adegan akan segera berakhir!")
end)
onSceneLoadedForClient
Ditembak di klien ketika adegan dimulai. Acara ini hanya dapat dihubungkan dalam LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Deteksi ketika adegan mulai (sisi klien)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("Adegan sedang dimulai!")
end)
onOrchestrationFinished
Ditembak di server ketika sebuah adegan telah mencapai panjang waktunya dan secara efektif telah berakhir. Acara ini menerima argumen string endedSceneName untuk adegan yang baru saja selesai dan Anda dapat menyambungkan acara ini untuk secara kondisional memuat adegan lain. Hanya dapat dihubungkan dalam Script.
Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Menentukan adegan berikutnya untuk dimuat ketika adegan saat ini selesai
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" selesai; memuat adegan pertama dalam konser
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" selesai; memuat adegan kedua dalam konser
EventSequencer.loadScene("Track2")
else
-- Kembali ke adegan pra-show
EventSequencer.loadScene("PreShow")
end
end)