Urutan Acara

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

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:

  1. Dari menu Window Studio atau bilah alat tab Home, buka Toolbox dan pilih tab Toko Pembuat.

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

  3. Temukan dan klik ubin Paket.

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

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

  1. Di dalam model Urutan Acara yang Anda tempatkan di ServerScriptService, cari dan pilih nilai Inline di dalam folder ReplicatedStorage.

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

  1. Perluas folder Urutan Acara 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 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:

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

  1. Buat Script baru di dalam ServerScriptService.

  2. Tempelkan kode berikut ke dalam skrip baru.

    Script - Set Seeking Permissions

    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    EventSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Isi tabel berikut dalam panggilan setSeekingPermissions seperti berikut:

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

  1. Dari menu Window Studio atau bilah alat tab Home, buka Toolbox.

  2. Dengan tab Toko Pembuat yang terpilih, pilih Plugins dari menu dropdown.

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

  1. Konfigurasikan properti pencahayaan, efek pasca-pemrosesan, efek atmosfer, dan skyboxes dari 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 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.

  1. Konfigurasikan terrain dari 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

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
StartTimeKapan audio diputar sehubungan dengan durasi adegan, dalam detik.
SoundIdID Aset dari audio yang akan diputar.
OnStartFungsi khusus yang dieksekusi ketika audio mulai diputar.
OnEndFungsi khusus yang dieksekusi ketika audio selesai diputar.
VolumeVolume 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
StartTimeKapan animasi diputar sehubungan dengan durasi adegan, dalam detik.
EndTimeWaktu opsional kapan animasi berakhir sehubungan dengan durasi adegan, dalam detik.
RigRig animasi yang dipilih 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 khusus yang dieksekusi ketika animasi mulai diputar.
OnEndFungsi khusus yang dieksekusi ketika animasi selesai diputar.
LoopedApakah animasi akan diulang; default adalah false.
SyncToAudioTabel yang mendefinisikan apakah harus menyinkronkan animasi dengan konfigurasi audio. Menerima kunci berikut:
  • Audio – Referensi ke konfigurasi audio.
  • StartAtAudioTime – Kapan animasi diputar sehubungan dengan durasi audio.
  • EndAtAudioTime – Waktu opsional di mana animasi berakhir sehubungan dengan durasi audio.
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
StartTimesTabel waktu mulai sehubungan dengan durasi adegan, dalam detik.
TweenTabel yang mendefinisikan objek dan properti untuk tween. Menerima kunci berikut:
OnStartFungsi khusus yang dieksekusi ketika tween mulai diputar.
OnHeartbeatFungsi khusus yang dieksekusi pada setiap Heartbeat; menerima alpha tween sebagai parameter keduanya.
OnEndFungsi khusus yang dieksekusi ketika tween selesai diputar.
SyncToAudioTabel yang mendefinisikan apakah harus menyinkronkan tween dengan konfigurasi audio. Menerima kunci berikut:
  • Audio – Referensi ke konfigurasi audio.
  • StartAtAudioTimes – Tabel waktu mulai yang mendefinisikan kapan tween akan diputar sehubungan dengan durasi audio.
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
StartTimeAwal durasi interval sehubungan dengan durasi adegan, dalam detik.
EndTimeAkhir durasi interval sehubungan dengan durasi adegan, dalam detik.
FrequencySeberapa sering fungsi OnInterval harus dieksekusi, dalam detik, dengan eksekusi pertama terjadi pada StartTime.
OnStartFungsi khusus yang dieksekusi ketika serangkaian interval dimulai.
OnIntervalFungsi khusus yang dieksekusi pada setiap interval dalam durasi yang ditentukan (StartTime hingga EndTime).
OnEndFungsi khusus yang dieksekusi ketika serangkaian interval berakhir.
SyncToAudioTabel yang mendefinisikan apakah harus menyinkronkan durasi interval 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 memulai durasi interval sehubungan dengan durasi audio.
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
StartTimesTabel waktu mulai sehubungan dengan durasi adegan, dalam detik.
OnStartFungsi khusus yang dieksekusi pada setiap waktu yang ditentukan di tabel StartTimes.
SkippableBoolean 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.
SyncToAudioTabel yang mendefinisikan apakah harus menyinkronkan jadwal dengan konfigurasi audio. Menerima kunci berikut:
  • Audio – Referensi ke konfigurasi audio.
  • StartAtAudioTimes – Tabel waktu mulai yang mendefinisikan kapan untuk mengeksekusi fungsi OnStart sehubungan dengan durasi audio.
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 Server

    Schema.OnRun = function()
    print("OnRun (Server)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Menginisialisasi koneksi heartbeat sementara
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Memberitahu kerangka tentang koneksi
    Schema:inform(tempConnection)
    end
    })
    end
  • Memanggil fungsi "pembersihan" khusus di dalam ModuleScript yang menginisialisasi koneksi atau referensi lainnya selama hook lifecycle OnRun.

    Skema Server

    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 (Server)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Memanggil fungsi "init" pada modul kustom
    customModule.init()
    -- Memanggil fungsi "clean" pada modul kustom saat pembersihan adegan
    Schema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule

    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Menginisialisasi koneksi heartbeat
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Memutuskan dan membersihkan 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 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.

Skrip

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

Skrip

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("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)
©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.