UrutanAcara adalah kerangka kerja yang kuat yang memungkinkan Anda untuk membangun acara langsung dan cutscene lintas server berdasarkan urutan tindakan dan pemicu yang terstruktur. Lebih spesifiknya, modul ini membantu Anda:
- Membangun acara atau cutscene pada kerangka kerja terstruktur melalui konfigurasi terjadwal dari audio, animasi, dan tween.
- Beralih antara beberapa adegan di berbagai server, menyinkronkan animasi dan visual yang kompleks ke dalam garis waktu.
- Mencari melalui acara dan melihat pratinjau permainan untuk tujuan pengujian dan pengembangan.
Kerangka kerja ini telah diuji dalam acara Roblox seperti konser Twenty One Pilots dan 24kGoldn, serta banyak permainan yang sangat banyak dikunjungi.
Untuk melihat UrutanAcara dalam aksi di dalam tempat yang dapat diedit, lihat template Konser di Roblox Studio. Template ini adalah titik awal yang komprehensif bagi pengembang untuk membuat acara/konser dan membiasakan diri dengan berbagai fitur dan komponen yang terlibat.

Penggunaan modul
Instalasi
Untuk menggunakan kerangka kerja UrutanAcara dalam sebuah permainan:
Dari menu Jendela Studio atau toolbar tab Beranda, buka Toolbox dan pilih tab Toko Pembuat.

Pastikan pengurutan Model dipilih, lalu klik tombol Lihat Semua untuk Kategori.

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

Di jendela Jelajah, pindahkan seluruh model UrutanAcara ke dalam ServerScriptService. Setelah menjalankan permainan, 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 didistribusikan ke dalam Workspace, Terrain, dan Lighting, mengganti 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 saat dimuat.
Untuk mengaktifkan mode inline:
Di dalam model UrutanAcara yang Anda tempatkan di ServerScriptService, telusuri dan pilih nilai Inline di dalam folder ReplicatedStorage.

Di jendela Properti, aktifkan kotak centang Value.

Buat 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 UrutanAcara 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 bernama TimeLength yang dapat Anda atur langsung di Studio atau secara programatis 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 | Berisi semua aset yang dimuat ketika pengguna (klien) bergabung dengan acara, seperti objek antarmuka pengguna atau rig animasi. |
| PlayerSpawns | Berisi bagian tempat pengguna muncul saat bergabung. Setiap bagian di folder ini berfungsi mirip dengan SpawnLocation. |
| Server | Berisi semua aset yang dimuat ketika sebuah adegan pertama kali dibuat di server. Disarankan agar sebagian besar aset visual ditempatkan di sini. |
| Terrain | Berisi terrain adegan. |
| Pencahayaan | Berisi properti pencahayaan global sebagai atribut, serta modifier seperti efek atmosfer dan efek pasca-pemrosesan. |
Acara
Folder Acara dari sebuah adegan murni merupakan placeholder untuk RemoteEvents yang berkomunikasi antara modul Klien dan Server. Tidak ada keharusan untuk menempatkan apa pun 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 tertentu dalam garis waktu adegan. Anda harus mendefinisikan skema sebuah adegan di modul Klien dan Server dan menyertakan lifecycle hooks untuk mengelola kapan konfigurasi terjadi.
Lifecycle hooks
Schema lifecycle hooks memungkinkan Anda mengelola kapan operasi adegan terjadi. Sebuah adegan dalam produksi biasanya akan berjalan dalam alur yang paling sederhana:
OnRun dapat terputus saat mencari:
Ketiga hook ini juga dapat diulang jika adegan diputar ulang:
Konfigurasi
Schema konfigurasi mendefinisikan operasi inti dari sebuah adegan, misalnya memutar audio pada 00:32, mengantri animasi untuk disinkronkan dengan audio tersebut, menjadwalkan acara adegan seperti pertunjukan kembang api, dan lainnya. Setiap konfigurasi mendukung fungsi callback tertentu di mana parameter pertama (self) adalah instance konfigurasi.
Cari adegan
Fitur unik dari UrutanAcara adalah kemampuan untuk "mencari" di sekitar adegan seperti yang Anda lakukan saat mencari melalui video. Dalam Mode Ganti, Anda juga dapat beralih antara adegan untuk melihat pratinjau seluruh acara multi-adegan sebelum menerapkannya ke produksi.
Pencarian adegan tidak dapat diakses oleh semua orang karena pengguna yang hanya menikmati acara seharusnya tidak memiliki kemampuan untuk mengontrol alur waktu. Sebagai gantinya, Anda harus memberikan izin pencarian berdasarkan PlaceId acara serta UserIds tertentu dan/atau grup dan peran di dalamnya.
Buat Script baru di dalam ServerScriptService.
Tempelkan kode berikut ke dalam skrip baru.
Skrip - Atur Izin Pencarianlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))UrutanAcara.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})Isi tabel berikut dalam panggilan setSeekingPermissions sebagai berikut:
placeIDs Daftar nilai PlaceId yang dipisahkan dengan koma untuk mendukung pencarian di dalamnya. userIDs Daftar nilai UserIds yang dipisahkan dengan koma untuk mereka yang dapat mencari di dalam tempat yang didukung. groups Daftar tabel yang dipisahkan dengan koma, masing-masing berisi ID grup dan peringkat minimum anggota grup tersebut yang dapat mencari di dalam tempat yang didukung.
Plugin pengelola adegan
Plugin Pengelola Adegan adalah alat yang berguna untuk memuat dan membongkar adegan, pencahayaan, dan terrain. Kecuali Anda menggunakan Mode Inline, sangat disarankan agar Anda menggunakan plugin ini daripada secara manual menempatkan/mengedit objek dan properti adegan.
Untuk menginstal plugin:
Dari menu Jendela Studio atau toolbar tab Beranda, buka Toolbox.
Dengan tab Toko Pembuat yang dipilih, pilih Plugin dari menu dropdown.
Di kolom 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 Plugin Studio.
Memuat dan membongkar 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 di dalam workspace.
| Tindakan plugin | Deskripsi |
|---|---|
| Muatan Klien | Jika konten klien adegan tidak dimuat, memindahkan folder Lingkungan/Klien ke dalam folder Workspace/ScenesClient. |
| Muatan Server | Jika konten server adegan tidak dimuat, memindahkan folder Lingkungan/Server ke dalam folder Workspace/ScenesServer. |
| Bongkar Klien | Jika konten klien adegan dimuat, memindahkan folder Klien dari Workspace/ScenesClient kembali ke folder [Adegan]/Lingkungan. |
| Bongkar Server | Jika konten server adegan dimuat, memindahkan folder Server dari Workspace/ScenesServer kembali ke folder [Adegan]/Lingkungan. |
| Bongkar Semua Adegan | Memindahkan folder Klien dan Server dari setiap adegan yang dimuat kembali ke folder Lingkungan-nya. |
Simpan dan muat pencahayaan
Layanan Lighting tingkat atas menyimpan semua properti pencahayaan dan efek visual dari sebuah 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 properti dan anak-anaknya ke dalam folder Lingkungan/Pencahayaan dari adegan tersebut.
Konfigurasikan properti pencahayaan adegan, efek pasca-pemrosesan, efek atmosfer, dan skyboxes melalui 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 properti pencahayaan yang sama sebagai atribut dari folder, serta anak-anak yang dikloning dari layanan Lighting tingkat atas.

Instansi yang dikloning 
Atribut yang disimpan Setelah properti pencahayaan dan anak-anak 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 memindahkan terrain yang dihasilkan atau dipahat ke folder Lingkungan/Server atau Lingkungan/Klien dari adegan tertentu. Sebagai gantinya, Anda dapat memanfaatkan plugin untuk menyalinnya ke dalam folder Lingkungan/Terrain dari adegan tersebut.
Konfigurasikan terrain 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
OnSetup lifecycle hook dimaksudkan untuk menginisialisasi aset dan variabel yang akan dirujuk dalam OnRun atau OnEndScene, mengatur koneksi yang dimaksudkan untuk bertahan selama durasi adegan, dll. Hook ini menerima parameter timePositionObject yang memungkinkan Anda membaca waktu saat ini pada saat pengaturan.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
local Skema = UrutanAcara.createSchema()
local clientEnvironment
local serverEnvironment
local dummy
Skema.OnSetup = function(timePositionObject)
print("OnSetup (Klien)")
-- Akses lingkungan adegan; tidak berlaku untuk Mode Inline
clientEnvironment = UrutanAcara.getCurrentSceneEnvironment()
serverEnvironment = UrutanAcara.getCurrentServerEnvironmentFromClient()
-- Tunggu aset
dummy = clientEnvironment:WaitForChild("Dummy")
print("Waktu saat ini adalah:", timePositionObject.Value)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
local Skema = UrutanAcara.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Skema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
-- Akses lingkungan adegan; tidak berlaku untuk Mode Inline
serverEnvironment = UrutanAcara.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Waktu saat ini adalah:", timePositionObject.Value)
endOnRun
OnRun adalah lifecycle hook 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.OnRun = function()
print("OnRun (Klien)")
local MainAudio = Skema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio diputar")
end,
OnEnd = function(self)
print("Audio selesai")
end
})
endOnEndScene
OnEndScene lifecycle hook berguna untuk membersihkan apa pun yang masih ada di adegan, seperti memutuskan koneksi yang dibuat dalam OnSetup atau OnRun yang tetap ada selama durasi adegan.
Skema.OnEndScene = function()
print("OnEndScene (Server)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
endKonfigurasi skema
audio
Membuat objek Sound di workspace yang diputar pada waktu tertentu. Suara kemudian dihapus setelah adegan berakhir atau setelah objek Sound selesai diputar.
| Kunci Konfigurasi | Deskripsi |
|---|---|
| StartTime | Kapan memutar audio sehubungan dengan durasi adegan, dalam detik. |
| SoundId | ID Aset dari audio yang akan diputar. |
| OnStart | Fungsi kustom yang dijalankan saat audio mulai diputar. |
| OnEnd | Fungsi kustom yang dijalankan saat audio selesai diputar. |
| Volume | Volume dari objek Sound; default adalah 0.5. |
Skema.OnRun = function()
print("OnRun (Klien)")
local MainAudio = Skema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio diputar")
end,
OnEnd = function(self)
print("Audio selesai")
end
})
endanimate
Membuat Animation yang diputar pada waktu tertentu.
| Kunci Konfigurasi | Deskripsi |
|---|---|
| StartTime | Kapan memutar animasi sehubungan dengan durasi adegan, dalam detik. |
| EndTime | Waktu opsional untuk mengakhiri animasi sehubungan dengan durasi adegan, dalam detik. |
| Rig | Rig animasi 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 kustom yang dijalankan saat animasi mulai diputar. |
| OnEnd | Fungsi kustom yang dijalankan saat animasi selesai diputar. |
| Looped | Apakah animasi harus diulang; default adalah false. |
| SyncToAudio | Tabel yang mendefinisikan apakah animasi disinkronkan dengan konfigurasi audio. Menerima kunci berikut:
|
Skema.OnRun = function()
print("OnRun (Klien)")
local MainAudio = Skema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local DanceAnimation = Skema:animate({
AnimationId = "rbxassetid://3695333486",
Rig = Dummy,
Speed = 1,
FadeInTime = 0.1,
FadeOutTime = 0.3,
SyncToAudio = {
Audio = MainAudio,
StartAtAudioTime = 5,
},
OnStart = function(self)
print("Animasi diputar")
end,
OnEnd = function(self)
print("Animasi dihentikan")
end
})
endtween
Membuat Tween yang dapat dikonfigurasi yang dipertahankan dalam pencarian dan dalam bergabung secara dinamis, yang berarti Anda dapat menghubungkan tween pada titik waktu yang terpisah 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 kustom yang dijalankan saat tween mulai diputar. |
| OnHeartbeat | Fungsi kustom yang dijalankan pada setiap Heartbeat; menerima alpha tween sebagai parameter kedua. |
| OnEnd | Fungsi kustom yang dijalankan saat tween selesai diputar. |
| SyncToAudio | Tabel yang mendefinisikan apakah tween disinkronkan dengan konfigurasi audio. Menerima kunci berikut:
|
Skema.OnRun = function()
print("OnRun (Klien)")
local MainAudio = Skema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local LightFadeOut = Skema: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 diputar")
end,
OnHeartbeat = function(self, alpha)
print("Alpha tween", alpha)
end,
OnEnd = function(self)
print("Tween selesai")
end,
})
endinterval
Menjalankan fungsi callback kustom selama durasi tertentu pada frekuensi tertentu, dalam detik. Berguna untuk acara berulang seperti lampu berkedip, memulsasi intensitas audio, dll. Frekuensi terendah yang mungkin adalah 0 detik, tetapi secara teknis 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 dijalankan, dalam detik, dengan eksekusi pertama pada StartTime. |
| OnStart | Fungsi kustom yang dijalankan saat serangkaian interval dimulai. |
| OnInterval | Fungsi kustom yang dijalankan pada setiap interval dalam durasi yang ditentukan (StartTime hingga EndTime). |
| OnEnd | Fungsi kustom yang dijalankan saat serangkaian interval berakhir. |
| SyncToAudio | Tabel yang mendefinisikan apakah durasi interval disinkronkan dengan konfigurasi audio. Menerima kunci berikut:
|
Skema.OnRun = function()
print("OnRun (Klien)")
local MainAudio = Skema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local ClientTimerUpdate = Skema:interval({
Frequency = 1,
SyncToAudio = {
StartAtAudioTime = 2.5,
EndAtAudioTime = 10,
Audio = MainAudio
},
OnInterval = function(self)
print(MainAudio.Sound.TimePosition, MainAudio.CurrentSoundIntensityRatio)
end,
})
endschedule
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 kustom yang dijalankan pada setiap waktu yang ditentukan dalam tabel StartTimes. |
| Skippable | Boolean yang mendefinisikan apakah acara yang dijadwalkan dapat dilewati untuk pengguna yang bergabung terlambat, atau untuk saat mencari sebelum waktu mulai yang dijadwalkan. Jika disetel ke false, semua waktu mulai acara yang dijadwalkan sebelum waktu bergabung/cari akan terjadi pada waktu bergabung/cari tersebut. Jika disetel ke true, hanya waktu mulai yang dijadwalkan setelah bergabung/cari yang akan terjadi. Default adalah false. |
| SyncToAudio | Tabel yang mendefinisikan apakah jadwal disinkronkan dengan konfigurasi audio. Menerima kunci berikut:
|
Skema.OnRun = function()
print("OnRun (Klien)")
Skema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Inisialisasi koneksi heartbeat sementara
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Informasikan kerangka kerja tentang koneksi
Skema:inform(tempConnection)
end
})
endinform
Memberitahu kerangka kerja tentang modul, objek UI, koneksi, dll. yang dibuat dalam lifecycle hook OnRun, memastikan mereka dibersihkan dengan benar saat mencari. Kasus penggunaan termasuk:
Memberitahu kerangka kerja tentang koneksi ad-hoc sementara seperti RunService.Heartbeat sehingga koneksi dibersihkan saat mencari ke titik lebih awal dalam durasi adegan.
Skema ServerSkema.OnRun = function()print("OnRun (Server)")Skema:schedule({StartTimes = {5},OnStart = function(self)-- Inisialisasi koneksi heartbeat sementaralocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Informasikan kerangka kerja tentang koneksiSkema:inform(tempConnection)end})endMemanggil fungsi "pembersihan" kustom dalam ModuleScript yang menginisialisasi koneksi atau referensi lain selama lifecycle hook OnRun.
Skema Serverlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local RunService = game:GetService("RunService")local customModule = require(ReplicatedStorage:WaitForChild("CustomModule"))local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))local Skema = UrutanAcara.createSchema()Skema.OnRun = function()print("OnRun (Server)")Skema:schedule({StartTimes = {5},OnStart = function(self)-- Panggil fungsi "init" di modul kustomcustomModule.init()-- Panggil fungsi "clean" di modul kustom saat adegan dibersihkanSkema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- Inisialisasi koneksi heartbeatCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- Putuskan dan bersihkan koneksi heartbeatif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
Fungsi
loadScene
loadScene(sceneName: string, startTime: number ?)
Memuat adegan secara programatis berdasarkan sceneName dan memulainya pada startTime dari awalnya. Akan ada "periode tenggang" 5 detik untuk memuat adegan dari server sebelum pencarian terjadi dan adegan mulai diputar. Ini berarti bahwa jika Anda memanggil loadScene("[SceneName]", 20) tepat pada pukul 4:15:00 PM, kerangka kerja akan menunggu 5 detik ditambah 20 yang diminta, memulai adegan pada pukul 4:15:25 PM.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
-- Menentukan adegan berikutnya untuk dimuat saat adegan saat ini selesai
UrutanAcara.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" selesai; muat adegan pertama dalam konser
UrutanAcara.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" selesai; muat adegan kedua dalam konser
UrutanAcara.loadScene("Track2")
else
-- Kembali ke adegan pra-show
UrutanAcara.loadScene("PreShow")
end
end)createSchema
createSchema(): table
Mengembalikan instance dari skema adegan untuk membuat logika untuk adegan.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
local Skema = UrutanAcara.createSchema()
Skema.OnSetup = function(timePositionObject)
print("OnSetup (Klien)")
endseek
seek(time: number)
Mencari ke nilai time, dalam detik, dari awal adegan yang saat ini dimuat.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
UrutanAcara.seek(95.58)setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
Mengatur jumlah waktu dari akhir semua adegan di mana peringatan dikirim. Anda dapat mendeteksi peringatan baik di sisi klien melalui onSceneEndingWarningForClient atau di sisi server melalui onSceneEndingWarningForServer.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
-- Muat adegan
UrutanAcara.loadScene("BeautifulScene")
-- Atur waktu peringatan menjadi 5 detik sebelum adegan berakhir
UrutanAcara.setSceneWarningTime(5)
-- Deteksi saat adegan akan berakhir
UrutanAcara.onSceneEndingWarningForServer:Connect(function()
warn("Adegan akan segera berakhir!")
end)setSeekingPermissions
setSeekingPermissions(permissions: table)
Memberikan izin pencarian berdasarkan PlaceId acara serta UserIds tertentu dan/atau grup dan peran di dalamnya. Lihat mencari dan beralih adegan untuk informasi lebih lanjut.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
Mengembalikan folder Lingkungan sisi klien atau sisi server dari adegan saat ini, tergantung pada apakah dipanggil dari skrip skema Klien atau Server masing-masing.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
local Skema = UrutanAcara.createSchema()
local clientEnvironment
local serverEnvironment
Skema.OnSetup = function(timePositionObject)
print("OnSetup (Klien)")
-- Akses lingkungan adegan; tidak berlaku untuk Mode Inline
clientEnvironment = UrutanAcara.getCurrentSceneEnvironment()
serverEnvironment = UrutanAcara.getCurrentServerEnvironmentFromClient()
print("Waktu saat ini adalah:", timePositionObject.Value)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
local Skema = UrutanAcara.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Skema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
serverEnvironment = UrutanAcara.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
endgetCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
Mengembalikan folder server-side Lingkungan dari adegan saat ini. Berbeda dengan getCurrentSceneEnvironment, Anda dapat memanggil ini dari skrip skema Klien.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
local Skema = UrutanAcara.createSchema()
local clientEnvironment
local serverEnvironment
Skema.OnSetup = function(timePositionObject)
print("OnSetup (Klien)")
-- Akses lingkungan adegan; tidak berlaku untuk Mode Inline
clientEnvironment = UrutanAcara.getCurrentSceneEnvironment()
serverEnvironment = UrutanAcara.getCurrentServerEnvironmentFromClient()
print("Waktu saat ini adalah:", timePositionObject.Value)
endisLoadingScene
isLoadingScene(): boolean
Dipanggil dari server untuk mengetahui apakah sebuah adegan sedang dimuat.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
print(UrutanAcara.isLoadingScene())
while UrutanAcara.isLoadingScene() do
task.wait()
end
print("Adegan dimuat")Acara
onSceneEndingWarningForClient
Dijadwalkan di klien sebelum adegan akan berakhir. Waktu default adalah 3 detik, tetapi Anda dapat mengonfigurasinya melalui setSceneWarningTime. Acara ini hanya dapat terhubung dalam LocalScript.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
-- Deteksi saat adegan akan berakhir (sisi klien)
UrutanAcara.onSceneEndingWarningForClient:Connect(function()
warn("Adegan akan segera berakhir!")
end)onSceneEndingWarningForServer
Dijadwalkan di server sebelum adegan akan berakhir. Waktu default adalah 3 detik, tetapi Anda dapat mengonfigurasinya melalui setSceneWarningTime. Acara ini hanya dapat terhubung dalam Script.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
-- Deteksi saat adegan akan berakhir (sisi server)
UrutanAcara.onSceneEndingWarningForServer:Connect(function()
warn("Adegan akan segera berakhir!")
end)onSceneLoadedForClient
Dijadwalkan di klien saat adegan mulai. Acara ini hanya dapat terhubung dalam LocalScript.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
-- Deteksi saat adegan mulai (sisi klien)
UrutanAcara.onSceneLoadedForClient:Connect(function()
warn("Adegan sedang dimulai!")
end)onOrchestrationFinished
Dijadwalkan di server saat sebuah adegan telah mencapai panjang waktunya dan telah berakhir. Acara ini menerima argumen nama string endedSceneName untuk adegan yang baru saja selesai dan Anda dapat menghubungkan acara ini untuk secara kondisional memuat adegan lain. Hanya dapat terhubung dalam Script.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
-- Menentukan adegan berikutnya untuk dimuat saat adegan saat ini selesai
UrutanAcara.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" selesai; muat adegan pertama dalam konser
UrutanAcara.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" selesai; muat adegan kedua dalam konser
UrutanAcara.loadScene("Track2")
else
-- Kembali ke adegan pra-show
UrutanAcara.loadScene("PreShow")
end
end)