BindableEvent dan BindableFunction objek memungkinkan Anda untuk menyambungkan perilaku antara skrip di sisi yang sama dari batas 0>klien-server0> dan berkomunikasi hasil yang diinginkan khusus untuk tindakan dalam pengalaman.
Kasus penggunaan yang paling umum untuk acara yang dapat diikat adalah untuk pengalaman yang memiliki struktur berbasis putaran. Misalnya, Anda mungkin memiliki acara "match started" yang memungkinkan pengguna lain untuk memulai timer dan menunjukkan papan peringkat, dengan acara "match ended" yang memungkinkan pengguna lain untuk pindahkan pemain kembali ke lobi dan menunjukkan pemenang.
Karena mereka mengkoordinasikan aktivitas antara skrip, acara yang dapat dipasang biasanya digunakan di server, tetapi Anda dapat menggunakannya di klien juga.
Tergantung pada cara pengalaman Anda bekerja, acara yang dapat disesuaikan dapat membantu membuat kode Anda lebih modular, tetapi skrip modul sering merupakan alternatif yang lebih baik untuk situasi di mana Anda perlu berbagi data antara skrip. Anda juga dapat menggunakan acara yang dapat disesuaikan bersama-sama dengan modul skrip untuk membuat tata bahasa yang lebih bers
Acara yang Dapat Dipasang
Objek BindableEvent mengaktifkan acara khusus melalui komunikasi asinkronis antara skrip.
Ketika Anda menembakkan BindableEvent melalui metode Fire(), script penembakan tidak menghasilkan, dan fungsi target menerima argumen yang dilewati dengan beberapa batasan . Seperti semua acara, 1> Class.BindableEvent|
Untuk membuat <a href="/scripting/events/reference/engine/datatable">Class.BindableEvent</a> baru menggunakan jendela Explorer di Studio:
- Hover over the container into which you want to insert the BindableEvent . We recommend using ServerScriptService for communication between server scripts and ReplicatedStorage for communication between client scripts.
- Klik tombol ⊕ yang muncul di sebelah nama kontainer dan masukkan instansi kejadianBindable.
- Ganti nama instans untuk TestBindableEvent .
Setelah Anda telah menciptakan fungsi BindableEvent, koneksikan fungsi ke acara Event nya dalam satu script, dan kemudian Fire() acara dari script lain.
Koneksi Acara
local ServerScriptService = game:GetService("ServerScriptService")
-- Dapatkan referensi untuk instansi acara yang dapat dipasang
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Tautkan fungsi anonim ke acara
bindableEvent.Event:Connect(function(data)
print(data) --> Putaran dimulai!
end)
Acara Berakhir
local ServerScriptService = game:GetService("ServerScriptService")-- Dapatkan referensi untuk instansi acara yang dapat dipasanglocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Acara yang dapat diaktifkanbindableEvent:Fire("Round started!")
Panggilan Kustom
Objek BindableFunction mengizinkan komunikasi dua arah antara skrip. Anda dapat menggunakannya untuk mendefinisikan fungsi panggilan khusus dan meneleponnya secara manual dengan menelepon BindableFunction:Invoke() . K
Untuk membuat <a href="/reference/engine/dataserver">Class.BindableFunction</a> baru menggunakan jendela <a href="../../explorer/">Class.BindableFunction</a> di Studio:
- Hover over the container into which you want to insert the BindableFunction . We recommend using ServerScriptService for communication between server scripts and ReplicatedStorage for communication between client scripts.
- Klik tombol ⊕ yang muncul di sebelah nama kontainer dan masukkan instansi BindableFunction .
- Ganti nama instans untuk TestBindableFunction .
Setelah Anda menciptakan BindableFunction, Anda dapat terhubung ke OnInvoke panggilan kembali di satu skrip, lalu Invoke() fungsi panggilan dari script lain.
Panggilan Koneksi
local ServerScriptService = game:GetService("ServerScriptService")
-- Dapatkan referensi untuk fungsi yang dapat dipasang
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Fungsi panggilan
local function addTwoNumbers(a, b)
return a + b
end
-- Tetapkan fungsi sebagai panggilan fungsi yang dapat diatur
bindableFunction.OnInvoke = addTwoNumbers
Panggilan Acara
local ServerScriptService = game:GetService("ServerScriptService")-- Dapatkan referensi untuk fungsi yang dapat dipasanglocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Panggil fungsi panggilan dan keluarkan nilai yang dikembalikanlocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Limitasi Argument
Ketika Anda mengekspor BindableEvent atau mengundang BindableFunction, itu menyampaikan semua argumen yang Anda berikan dengan acara atau ke fungsi panggilan. Anda dapat menyampaikan semua jenis objek Roblox ( Enum ,
Indeks Tidak Struktur
Jika ada indeks dari tabel yang dilewati menjadi jenis non-string, seperti Instance , userdata , atau 1>fungsi1>, Roblox secara otomatis mengubah jenis indeks ini menjadi string.
Koneksi Acara
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> string
end
end
-- Tautkan fungsi ke acara
bindableEvent.Event:Connect(onEventFire)
Acara Berakhir
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Acara api dengan tabel berisi instansi ruang kerja sebagai unitbindableEvent:Fire({[workspace.Baseplate] = true})
Indeks Tabel
Jika Anda melewati tabel data, jangan melewati tabel campuran angka dan kunci numerik. Sebaliknya, melewati tabel yang terdiri dari sepenuhnya pasangan kunci-值 (diksi) atau sepenuhnya indeks numerik ( array ).
Koneksi Acara
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = Pedang
--> 2 = Panah
--> CharName = Pembunuh Naga Diva
--> CharClass = Rogue
end
end
-- Tautkan fungsi ke acara
bindableEvent.Event:Connect(onEventFire)
Acara Berakhir
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Tabel yang diindeks secara numeriklocal inventoryData = {"Sword", "Bow"}-- Tabel Kamuslocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- Acara api dengan tabel yang dikurasi secara konsistenbindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Identitas Meja
Tabel dikirim sebagai argumen untuk acara dan panggilan yang dapat dipasangkan adalah dityalinkan, yang berarti mereka tidak akan persis sama dengan yang diberikan ketika mengeksekusi acara atau menyebutkan panggilan. Tabel yang dikembalikan ke invoker tidak akan persis sama dengan yang diberikan. Anda dapat menunjukkan ini dengan mengeksekusi skrip berikut di
Panggilan Koneksi
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Fungsi panggilan
local function returnTable(passedTable)
-- Output tabel identitas pada panggilan
print(tostring(passedTable)) --> tabel: 0x48eb7aead27563d9
return passedTable
end
-- Tetapkan fungsi sebagai panggilan fungsi yang dapat diatur
bindableFunction.OnInvoke = returnTable
Panggilan Acara
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- Output identitas tabel asliprint(tostring(inventoryData)) --> tabel: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Output tabel identitas saat kembaliprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metabel
Jika tabel memiliki metabel, semua informasi metabel dihilangkan dalam transfer. Dalam contoh kode berikut, properti NumWheels adalah bagian dari metabel Car. Saat server menerima tabel berikut, tabel truck memiliki properti 1> Name</
Koneksi Acara
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Name"] = "MyTruck")
end
-- Tautkan fungsi ke acara
bindableEvent.Event:Connect(onEvent)
Acara Berakhir
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- Acara api dengan tabel termasuk tabel metabelbindableEvent:Fire(truck)