Urutan Acara

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

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:

  1. Dari menu Jendela Studio atau toolbar tab Beranda, buka Toolbox dan pilih tab Toko Pembuat.

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

  3. Temukan dan klik ubin Paket.

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

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

  1. Di dalam model UrutanAcara yang Anda tempatkan di ServerScriptService, telusuri dan pilih nilai Inline di dalam folder ReplicatedStorage.

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

  1. Perluas folder UrutanAcara dan temukan folder BlankScene.

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

KontainerDeskripsi
KlienBerisi semua aset yang dimuat ketika pengguna (klien) bergabung dengan acara, seperti objek antarmuka pengguna atau rig animasi.
PlayerSpawnsBerisi bagian tempat pengguna muncul saat bergabung. Setiap bagian di folder ini berfungsi mirip dengan SpawnLocation.
ServerBerisi semua aset yang dimuat ketika sebuah adegan pertama kali dibuat di server. Disarankan agar sebagian besar aset visual ditempatkan di sini.
TerrainBerisi terrain adegan.
PencahayaanBerisi 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.

  1. Buat Script baru di dalam ServerScriptService.

  2. Tempelkan kode berikut ke dalam skrip baru.

    Skrip - Atur Izin Pencarian
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
    UrutanAcara.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Isi tabel berikut dalam panggilan setSeekingPermissions sebagai berikut:

    placeIDsDaftar nilai PlaceId yang dipisahkan dengan koma untuk mendukung pencarian di dalamnya.
    userIDsDaftar nilai UserIds yang dipisahkan dengan koma untuk mereka yang dapat mencari di dalam tempat yang didukung.
    groupsDaftar 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:

  1. Dari menu Jendela Studio atau toolbar tab Beranda, buka Toolbox.

  2. Dengan tab Toko Pembuat yang dipilih, pilih Plugin dari menu dropdown.

  3. Di kolom pencarian, ketik Pengelola Adegan dan tekan Enter untuk menemukan plugin.

  4. Klik ikon plugin untuk melihat detailnya dan kemudian klik tombol Instal.

  5. 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 pluginDeskripsi
Muatan KlienJika konten klien adegan tidak dimuat, memindahkan folder Lingkungan/Klien ke dalam folder Workspace/ScenesClient.
Muatan ServerJika konten server adegan tidak dimuat, memindahkan folder Lingkungan/Server ke dalam folder Workspace/ScenesServer.
Bongkar KlienJika konten klien adegan dimuat, memindahkan folder Klien dari Workspace/ScenesClient kembali ke folder [Adegan]/Lingkungan.
Bongkar ServerJika konten server adegan dimuat, memindahkan folder Server dari Workspace/ScenesServer kembali ke folder [Adegan]/Lingkungan.
Bongkar Semua AdeganMemindahkan 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.

  1. Konfigurasikan properti pencahayaan adegan, efek pasca-pemrosesan, efek atmosfer, dan skyboxes melalui layanan Lighting tingkat atas.

  2. Di jendela plugin Pengelola Adegan, klik Simpan Pencahayaan untuk adegan yang diinginkan.

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

  1. Konfigurasikan terrain adegan melalui layanan Terrain tingkat atas.

  2. Di jendela plugin Pengelola Adegan, klik Simpan Terrain untuk adegan yang diinginkan.

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

Skema Klien
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)
end
Skema Server
local 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)
end

OnRun

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 Klien
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
})
end

OnEndScene

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 Server
Skema.OnEndScene = function()
print("OnEndScene (Server)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end

Konfigurasi 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
StartTimeKapan memutar audio sehubungan dengan durasi adegan, dalam detik.
SoundIdID Aset dari audio yang akan diputar.
OnStartFungsi kustom yang dijalankan saat audio mulai diputar.
OnEndFungsi kustom yang dijalankan saat audio selesai diputar.
VolumeVolume dari objek Sound; default adalah 0.5.
Skema Klien
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
})
end

animate

Membuat Animation yang diputar pada waktu tertentu.

Kunci Konfigurasi Deskripsi
StartTimeKapan memutar animasi sehubungan dengan durasi adegan, dalam detik.
EndTimeWaktu opsional untuk mengakhiri animasi sehubungan dengan durasi adegan, dalam detik.
RigRig animasi untuk memutar animasi.
AnimationIdID Aset dari animasi yang akan diputar.
SpeedKecepatan pemutaran animasi; default adalah 1.
FadeInTimeJumlah waktu untuk memudar masuk animasi, dalam detik; default adalah 0.2 (detik).
FadeOutTimeJumlah waktu untuk memudar keluar animasi, dalam detik; default adalah 0.2 (detik).
OnStartFungsi kustom yang dijalankan saat animasi mulai diputar.
OnEndFungsi kustom yang dijalankan saat animasi selesai diputar.
LoopedApakah animasi harus diulang; default adalah false.
SyncToAudioTabel yang mendefinisikan apakah animasi disinkronkan dengan konfigurasi audio. Menerima kunci berikut:
  • Audio – Referensi ke konfigurasi audio.
  • StartAtAudioTime – Kapan memutar animasi sehubungan dengan durasi audio.
  • EndAtAudioTime – Waktu opsional di mana animasi diakhiri sehubungan dengan durasi audio.
Skema Klien
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
})
end

tween

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
StartTimesTabel waktu mulai sehubungan dengan durasi adegan, dalam detik.
TweenTabel yang mendefinisikan objek dan properti untuk tween. Menerima kunci berikut:
OnStartFungsi kustom yang dijalankan saat tween mulai diputar.
OnHeartbeatFungsi kustom yang dijalankan pada setiap Heartbeat; menerima alpha tween sebagai parameter kedua.
OnEndFungsi kustom yang dijalankan saat tween selesai diputar.
SyncToAudioTabel yang mendefinisikan apakah tween disinkronkan dengan konfigurasi audio. Menerima kunci berikut:
  • Audio – Referensi ke konfigurasi audio.
  • StartAtAudioTimes – Tabel waktu mulai yang mendefinisikan kapan memutar tween sehubungan dengan durasi audio.
Skema Klien
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,
})
end

interval

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
StartTimeAwal durasi interval sehubungan dengan durasi adegan, dalam detik.
EndTimeAkhir durasi interval sehubungan dengan durasi adegan, dalam detik.
FrequencySeberapa sering fungsi OnInterval harus dijalankan, dalam detik, dengan eksekusi pertama pada StartTime.
OnStartFungsi kustom yang dijalankan saat serangkaian interval dimulai.
OnIntervalFungsi kustom yang dijalankan pada setiap interval dalam durasi yang ditentukan (StartTime hingga EndTime).
OnEndFungsi kustom yang dijalankan saat serangkaian interval berakhir.
SyncToAudioTabel yang mendefinisikan apakah durasi interval disinkronkan dengan konfigurasi audio. Menerima kunci berikut:
  • Audio – Referensi ke konfigurasi audio.
  • StartAtAudioTime – Kapan memulai durasi interval sehubungan dengan durasi audio.
  • EndAtAudioTime – Waktu opsional di mana durasi interval diakhiri sehubungan dengan durasi audio.
Skema Klien
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,
})
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
StartTimesTabel waktu mulai sehubungan dengan durasi adegan, dalam detik.
OnStartFungsi kustom yang dijalankan pada setiap waktu yang ditentukan dalam tabel StartTimes.
SkippableBoolean 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.
SyncToAudioTabel yang mendefinisikan apakah jadwal disinkronkan dengan konfigurasi audio. Menerima kunci berikut:
  • Audio – Referensi ke konfigurasi audio.
  • StartAtAudioTimes – Tabel waktu mulai yang mendefinisikan kapan menjalankan fungsi OnStart sehubungan dengan durasi audio.
Skema Klien
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
})
end

inform

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 Server
    Skema.OnRun = function()
    print("OnRun (Server)")
    Skema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Inisialisasi koneksi heartbeat sementara
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Informasikan kerangka kerja tentang koneksi
    Skema:inform(tempConnection)
    end
    })
    end
  • Memanggil fungsi "pembersihan" kustom dalam ModuleScript yang menginisialisasi koneksi atau referensi lain selama lifecycle hook OnRun.

    Skema Server
    local 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 kustom
    customModule.init()
    -- Panggil fungsi "clean" di modul kustom saat adegan dibersihkan
    Skema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule
    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Inisialisasi koneksi heartbeat
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Putuskan dan bersihkan koneksi heartbeat
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return 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.

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

Skema Klien
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UrutanAcara = require(ReplicatedStorage:WaitForChild("UrutanAcara"))
local Skema = UrutanAcara.createSchema()
Skema.OnSetup = function(timePositionObject)
print("OnSetup (Klien)")
end

seek

seek(time: number)

Mencari ke nilai time, dalam detik, dari awal adegan yang saat ini dimuat.

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

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

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)
end
Skema Server
local 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)
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 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)
end

isLoadingScene

isLoadingScene(): boolean

Dipanggil dari server untuk mengetahui apakah sebuah adegan sedang dimuat.

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

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.

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

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.

Skrip
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)
©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.