Acara dan panggilan balasan yang dapat diikat

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

dan objek memungkinkan anda mengikat perilaku di antara skrip di sisi yang sama dari batas klien-server dan berkomunikasi hasil yang diinginkan khusus untuk tindakan dalam pengalaman.

Kasus penggunaan paling umum untuk acara yang dapat diikat adalah untuk pengalaman yang memiliki struktur berbasis bulat.Sebagai contoh, Anda mungkin memiliki acara "pertandingan dimulai" yang memungkinkan skrip lain memulai timer dan menampilkan papan peringkat, dengan acara "pertandingan berakhir" yang sesuai yang memungkinkan skrip lain tahu kapan harus memindahkan pemain kembali ke lobi dan menampilkan pemenang.

Karena mereka mengkoordinasikan aktivitas antara skrip, acara yang dapat diikat biasanya digunakan di server, tetapi Anda juga dapat menggunakannya di klien.

Tergantung pada bagaimana pengalaman Anda bekerja, acara yang dapat diikat dapat membantu membuat kode Anda lebih modular, tetapi skrip modul seringkali merupakan alternatif yang lebih baik untuk situasi di mana Anda perlu berbagi data di antara skrip.Anda juga dapat menggunakan peristiwa yang dapat diikat bersama dengan skrip modul untuk sindesis yang lebih bersih, seperti yang ditunjukkan di peristiwa khusus.

Peristiwa yang dapat diikat

Objek BindableEvent memungkinkan acara khusus melalui komunikasi asinkron, satu arah antara skrip.

Ketika Anda menembak melalui metode , skrip penembakan tidak tidak menghasilkan, dan fungsi target menerima argumen yang diberikan dengan batasan tertentu .Seperti semua acara, BindableEvents membuat thread dari setiap fungsi terhubung, sehingga bahkan jika satu kesalahan, yang lain terus berlanjut.

Untuk membuat baru BindableEvent menggunakan jendela Explorer di Studio:

  1. Pasang di atas wadah ke dalam mana Anda ingin menyisipkan BindableEvent .Kami merekomendasikan menggunakan ServerScriptService untuk komunikasi antara skrip server dan ReplicatedStorage untuk komunikasi antara skrip klien.
  2. Klik tombol yang muncul di sebelah kanan nama kontainer dan masukkan instansi kejadianBindable.
  3. Ganti nama instansi menjadi TestBindableEvent.

Setelah Anda membuat BindableEvent , hubungkan fungsi ke acara Event nya di satu skrip, lalu Fire() acara dari skrip lain.

Koneksi Acara

local ServerScriptService = game:GetService("ServerScriptService")
-- Dapatkan referensi untuk instansi acara yang dapat kejadian
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Hubungkan fungsi anonim ke acara
bindableEvent.Event:Connect(function(data)
print(data) --> Putaran dimulai!
end)
Pembakaran Acara

local ServerScriptService = game:GetService("ServerScriptService")
-- Dapatkan referensi untuk instansi acara yang dapat kejadian
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Acara terikat api
bindableEvent:Fire("Round started!")

Panggilan balasan khusus

Objek BindableFunction memungkinkan komunikasi sinkron dua arah antara skrip.Anda dapat menggunakannya untuk mendefinisikan fungsi panggilan kembali khusus dan memanggilnya secara manual dengan memanggil BindableFunction:Invoke() .Kode yang memanggil fungsi menghasilkan sampai callback yang sesuai ditemukan, dan callback menerima argumen yang Anda berikan ke Invoke() .Jika panggilan balik tidak pernah atur, skrip yang memanggilnya tidak melanjutkan eksekusi.

Untuk membuat baru BindableFunction menggunakan jendela Explorer di Studio:

  1. Pasang di atas wadah ke dalam mana Anda ingin menyisipkan BindableFunction .Kami merekomendasikan menggunakan ServerScriptService untuk komunikasi antara skrip server dan ReplicatedStorage untuk komunikasi antara skrip klien.
  2. Klik tombol yang muncul di sebelah kanan nama kontainer dan masukkan instansi Fungsi Bindable .
  3. Ganti nama instansi menjadi TestBindableFunction.

Setelah Anda membuat BindableFunction , Anda dapat terhubung ke panggilan baliknya OnInvoke di satu skrip, lalu Invoke() fungsi panggilan dari skrip lain.

Koneksi Panggil Balik

local ServerScriptService = game:GetService("ServerScriptService")
-- Dapatkan referensi untuk fungsi yang dapat diikat
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Fungsi panggil kembali
local function addTwoNumbers(a, b)
return a + b
end
-- Tetapkan fungsi sebagai panggil balik fungsi yang dapat diikat
bindableFunction.OnInvoke = addTwoNumbers
Panggilan Acara

local ServerScriptService = game:GetService("ServerScriptService")
-- Dapatkan referensi untuk fungsi yang dapat diikat
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Memanggil fungsi panggil balasan dan nilai output yang dikembalikan
local sum = bindableFunction:Invoke(2, 4)
print(sum) --> 6

Keterbatasan argumen

Ketika Anda menembakkan BindableEvent atau memanggil BindableFunction , ia mengirimkan argumen apa pun yang Anda berikan dengan peristiwa atau ke fungsi panggil balik.Anda dapat melewati objek Roblox apa pun ( Enum , Instance , dll.), serta jenis Luau seperti angka, string, dan boolean, meskipun Anda harus hati-hati mempertimbangkan batasan berikut.

Indeks non-teks

Jika ada indeks dari tabel yang lewat tidak berjenis string, seperti Instance , data pengguna , atau fungsi , Roblox secara otomatis mengubah indeks tersebut 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
-- Hubungkan fungsi ke acara
bindableEvent.Event:Connect(onEventFire)
Pembakaran Acara

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Acara api dengan tabel yang berisi instansi ruang kerja sebagai unit
bindableEvent:Fire({
[workspace.Baseplate] = true
})

Pengindeksan meja

Jika Anda melewati tabel data, jangan lewati tabel campuran kunci numerik dan string.Sebagai gantinya, lewati tabel yang terdiri dari seluruhnya pasangan nilai-kunci (sebuah kamus) atau seluruhnya indeks numerik (sebuah 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 = Lengkung
--> Nama Karakter = Diva Dragonslayer
--> CharClass = Penipu
end
end
-- Hubungkan fungsi ke acara
bindableEvent.Event:Connect(onEventFire)
Pembakaran Acara

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Tabel terindeks secara numerik
local inventoryData = {
"Sword", "Bow"
}
-- Tabel kamus
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Acara api dengan tabel yang diindeks secara konsisten
bindableEvent:Fire(inventoryData)
bindableEvent:Fire(characterData)

Identitas tabel

Tabel yang disampaikan sebagai argumen untuk acara dan panggilan balasan dikopi, artinya mereka tidak akan persis sama dengan yang disediakan saat menembak acara atau memanggil panggilan balasan.Juga, tabel tidak akan dikembalikan ke invoker persis sama dengan yang disediakan.Anda dapat menunjukkan ini dengan menjalankan skrip berikut di BindableFunction dan mengamati bagaimana identitas tabel berbeda.

Koneksi Panggil Balik

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Fungsi panggil kembali
local function returnTable(passedTable)
-- Identitas tabel output pada panggilan
print(tostring(passedTable)) --> tabel: 0x48eb7aead27563d9
return passedTable
end
-- Tetapkan fungsi sebagai panggil balik fungsi yang dapat diikat
bindableFunction.OnInvoke = returnTable
Panggilan Acara

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
local inventoryData = {
"Sword", "Bow"
}
-- Output identitas tabel asli
print(tostring(inventoryData)) --> bagan: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Identitas tabel output saat kembali
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9

Metabel

Jika tabel memiliki metabel, semua informasi metabel hilang dalam transfer.Dalam contoh kode berikut, properti NumWheels adalah bagian dari Car metabel.Ketika server menerima tabel berikut, tabel truck memiliki properti Name tetapi tidak properti NumWheels.

Koneksi Acara

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Nama"] = "MyTruck"]
end
-- Hubungkan fungsi ke acara
bindableEvent.Event:Connect(onEvent)
Pembakaran Acara

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local Car = {}
Car.NumWheels = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- Acara api dengan meja termasuk metabel
bindableEvent:Fire(truck)