BindableEvent và BindableFunction các đối tượng cho phép bạn gắn các hành vi giữa các tập lệnh trên cùng một bên của ranh giới khách-máy chủ và truyền một kết quả mong muốn cụ thể cho các hành động trong kinh nghiệm.
Trường hợp sử dụng phổ biến nhất cho sự kiện có thể gắn kết là cho các trải nghiệm có cấu trúc theo vòng.Ví dụ, bạn có thể có sự kiện "trận đấu bắt đầu" cho phép các trình khởi chạy khác bắt đầu một bộ đếm thời gian và hiển thị bảng xếp hạng, với sự kiện "trận đấu kết thúc" tương ứng cho phép các trình khởi chạy khác biết khi nào di chuyển người chơi trở lại sảnh và hiển thị những người chiến thắng.
Bởi vì chúng phối hợp các hoạt động giữa các kịch bản, sự kiện có thể gắn kết thường được sử dụng trên máy chủ, nhưng bạn cũng có thể sử dụng chúng trên máy khách.
Tùy thuộc vào cách trải nghiệm của bạn hoạt động, các sự kiện có thể gắn kết có thể giúp làm cho mã của bạn trở nên modular hơn, nhưng tập lệnh module thường là lựa chọn tốt hơn cho các tình huống mà bạn cần chia sẻ dữ liệu giữa các tập lệnh.Bạn cũng có thể sử dụng sự kiện có thể gắn kết cùng với các kịch bản mô-đun để có một ngữ pháp sạch hơn, như đã lưu ý trong Sự kiện tùy chỉnh.
Sự kiện có thể gắn kết
Vật thể BindableEvent cho phép sự kiện tùy chỉnh thông qua giao tiếp không đồng bộ, một chiều giữa các tập lệnh.
Khi bạn bắn một BindableEvent qua phương pháp Fire() , kịch bản bắn không sản xuất và chức năng mục tiêu nhận được các tham số được truyền với một số hạn chế nhất định.Giống như tất cả các sự kiện, BindableEvents tạo các luồng của mỗi chức năng kết nối, vì vậy ngay cả khi một lỗi, những người khác tiếp tục.
Để tạo một cửa sổ mới BindableEvent bằng cửa sổ Explorer trong Studio:
- Di chuột qua thùng chứa mà bạn muốn chèn BindableEvent .Chúng tôi khuyên bạn nên sử dụng ServerScriptService cho giao tiếp giữa các kịch bản máy chủ và ReplicatedStorage cho giao tiếp giữa các kịch bản khách hàng.
- Nhấp vào nút ⊕ xuất hiện bên phải tên của thùng chứa và chèn một ví ví dụ / trường hợp BindableEvent .
- Đổi tên instance thành TestBindableEvent.
Sau khi bạn đã tạo một BindableEvent , kết nối một chức năng vào sự kiện Event của nó trong một kịch bản, và sau đó Fire() sự kiện từ kịch bản khác.
Kết Nối Sự Kiện
local ServerScriptService = game:GetService("ServerScriptService")
-- Nhận tham chiếu đến ví dụ sự kiện có thể gắn kết
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Kết nối chức năng vô danh với sự kiện
bindableEvent.Event:Connect(function(data)
print(data) --> Vòng bắt đầu!
end)
Bắn sự kiện
local ServerScriptService = game:GetService("ServerScriptService")-- Nhận tham chiếu đến ví dụ sự kiện có thể gắn kếtlocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Sự kiện kết nối lửabindableEvent:Fire("Round started!")
Không gọi lại tùy chỉnh
Vật thể BindableFunction cho phép giao tiếp song song, hai chiều giữa các tập lệnh.Bạn có thể sử dụng nó để định nghĩa một chức năng trả lời tùy chỉnh và kích hoạt nó thủ công bằng cách gọi BindableFunction:Invoke() .Mã gọi chức năng cho ra cho đến khi tìm thấy phản hồi tương ứng, và phản hồi nhận các tham số mà bạn đã chuyển cho Invoke() .Nếu cuộc gọi trả lại không bao giờ được thiết cài đặt, thì kịch bản gọi nó không tiếp tục thực thi.
Để tạo một cửa sổ mới BindableFunction bằng cửa sổ Explorer trong Studio:
- Di chuột qua thùng chứa mà bạn muốn chèn BindableFunction .Chúng tôi khuyên bạn nên sử dụng ServerScriptService cho giao tiếp giữa các kịch bản máy chủ và ReplicatedStorage cho giao tiếp giữa các kịch bản khách hàng.
- Nhấp vào nút ⊕ xuất hiện bên phải tên của thùng chứa và chèn một ví ví dụ / trường hợp BindableFunction .
- Đổi tên instance thành TestBindableFunction.
Khi bạn đã tạo một BindableFunction , bạn có thể kết nối với công cụ gọi lại của nó OnInvoke trong một kịch bản, sau đó Invoke() chức năng gọi lại từ kịch bản khác.
Kết Nối Trả Lại
local ServerScriptService = game:GetService("ServerScriptService")
-- Nhận tham chiếu đến chức năng có thể gắn kết
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Chức năng gọi lại
local function addTwoNumbers(a, b)
return a + b
end
-- Đặt chức năng làm callback của chức năng có thể gắn kết
bindableFunction.OnInvoke = addTwoNumbers
Lời mời sự kiện
local ServerScriptService = game:GetService("ServerScriptService")-- Nhận tham chiếu đến chức năng có thể gắn kếtlocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Gọi chức năng trả lời cuộc gọi và giá trị trả lại được trả vềlocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Giới hạn các tham số
Khi bạn khai hỏa một BindableEvent hoặc gọi một BindableFunction , nó chuyển tiếp bất kỳ tham số nào bạn truyền với sự kiện hoặc đến chức năng gọi lại.Bạn có thể truyền bất kỳ loại đối tượng Roblox nào (Enum , Instance , v.v.), cũng như các loại Luau như số, chuỗi và boolean, mặc dù bạn nên cẩn thận xem xét các hạn chế sau.
Chỉ mục không phải chuỗi
Nếu bất kỳ chỉ mục của một bảng đã truyền qua là kiểu không chuỗi, chẳng hạn như Instance , dữ liệu người dùng hoặc chức năng , Roblox tự động chuyển các chỉ mục này thành chuỗi.
Kết Nối Sự Kiện
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> chuỗi
end
end
-- Kết nối chức năng với sự kiện
bindableEvent.Event:Connect(onEventFire)
Bắn sự kiện
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Sự kiện lửa với bảng chứa một ví trí công trình làm chìa khóabindableEvent:Fire({[workspace.Baseplate] = true})
Lập chỉ mục bảng
Nếu bạn truyền một bảng dữ liệu, đừng truyền một bảng trộn các chìa khóa số và chuỗi.Thay vào đó, truyền một bảng bao gồm hoàn toàn các cặp chìa khóa-giá trị (một từ điển) hoặc hoàn toàn các chỉ mục số (một mảng).
Kết Nối Sự Kiện
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = Kiếm
--> 2 = Cung tên
--> Tên CharName = Diva Dragonslayer
--> CharClass = Kẻ lừa đảo
end
end
-- Kết nối chức năng với sự kiện
bindableEvent.Event:Connect(onEventFire)
Bắn sự kiện
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Bảng được đánh số theo thứ tựlocal inventoryData = {"Sword", "Bow"}-- Bảng từ điểnlocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- Sự kiện lửa với các bảng được lập chỉ một cách nhất quánbindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Nhận dạng bảng
Các bảng được chuyển đến như tham số cho các sự kiện có thể gắn kết và cuộc gọi trả lại được sao chép, có nghĩa là chúng sẽ không chính xác tương đương với những gì được cung cấp khi bắn sự kiện hoặc kích hoạt cuộc gọi trả lại.Các bảng được trả lại cho người gọi cũng sẽ không tương đương chính xác với những gì được cung cấp.Bạn có thể minh chứng điều này bằng cách chạy lệnh sau trên một BindableFunction và quan sát cách các danh xưng bảng khác nhau.
Kết Nối Trả Lại
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Chức năng gọi lại
local function returnTable(passedTable)
-- Xuất ID bảng trên lời gọi
print(tostring(passedTable)) --> bảng: 0x48eb7aead27563d9
return passedTable
end
-- Đặt chức năng làm callback của chức năng có thể gắn kết
bindableFunction.OnInvoke = returnTable
Lời mời sự kiện
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- Xuất ID bảng gốcprint(tostring(inventoryData)) --> bảng: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Nhận dạng bảng xuất ra khi trở lạiprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Bảng biểu Metatables
Nếu một bảng có một metatable, tất cả thông tin metatable được mất trong quá trình chuyển.Trong ví dụ mã sau, thuộc tính NumWheels là một phần của Car bảng truyền đạt.Khi máy chủ nhận được bảng sau, bảng truck có tính chất Name nhưng không tính chất NumWheels.
Kết Nối Sự Kiện
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Tên"] = "MyTruck"]
end
-- Kết nối chức năng với sự kiện
bindableEvent.Event:Connect(onEvent)
Bắn sự kiện
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- Sự kiện lửa với bảng bao gồm một metatablebindableEvent:Fire(truck)