Acara yang Dapat Dipasangkan dan Panggilan Kembali

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

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:

  1. 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.
  2. Klik tombol yang muncul di sebelah nama kontainer dan masukkan instansi kejadianBindable.
  3. 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 dipasang
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Acara yang dapat diaktifkan
bindableEvent: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:

  1. 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.
  2. Klik tombol yang muncul di sebelah nama kontainer dan masukkan instansi BindableFunction .
  3. 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 dipasang
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Panggil fungsi panggilan dan keluarkan nilai yang dikembalikan
local 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 unit
bindableEvent: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 numerik
local inventoryData = {
"Sword", "Bow"
}
-- Tabel Kamus
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Acara api dengan tabel yang dikurasi secara konsisten
bindableEvent: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 asli
print(tostring(inventoryData)) --> tabel: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Output tabel identitas saat kembali
print(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 = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- Acara api dengan tabel termasuk tabel metabel
bindableEvent:Fire(truck)