BindableEvent 和 BindableFunction 對象讓您可以在同一個 сторо面的客戶端-伺服器邊界和通訊特定的目標,以達到在體驗中的行為。
最常見的使用例子為具有回合結構的體驗,例如,你可以有一個名為「匹配開始」的事件,讓其他腳本啟動計時器並顯示排行榜,並且對應的「匹配結束」事件讓其他腳本知道移動玩家回到大廳並顯示勝利者。
因為它們可以在多個程式碼之間協調作業,因此綁定的事件通常在服務伺服器上使用,但您也可以在客戶端上使用。
隨著您的體驗如何運作,可以綁定的事件可以幫助讓您的代碼更模組化,但 模組腳本 通常是一種更好的選擇在您需要在多個腳本之間共享資料的情況下。您也可以使用 模組腳本 與模組腳本一起使用,以獲得更清潔的語法,如在 自訂事件 中
可綁定的事件
Class.BindableEvent 對象可以啟用異步通訊,使用 Javascript 之一一方通訊來啟用自訂事件。
當你通過 Fire() 方法發射 Class.BindableEvent 時,發射指令不會生成,並且目標函數接受傳回的參數以某些 1>限制1> 。 像所有事件一樣,4>Class.BindableEvent|BindableEvents4> 會��
要使用 Studio 中的 BindableEvent 窗口在新建的 Class.BindableEvent 中:
- 點擊容器名稱右侧的 ⊕ 按鈕,並插入 BindableEvent 個體、實例。
- 將實例重命名為 TestBindableEvent。
在你創建了一個 BindableEvent 之後,連接一個函數到其 Event 事件在一個指令碼中,然後再從另一個指令碼中 Fire() 事件。
事件連接
local ServerScriptService = game:GetService("ServerScriptService")
-- 取得可綁定的事件實個體、實例
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- 連接匿名函數到事件
bindableEvent.Event:Connect(function(data)
print(data) --> 回合開始!
end)
事件發射
local ServerScriptService = game:GetService("ServerScriptService")-- 取得可綁定的事件實個體、實例local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- 可以發生的事件bindableEvent:Fire("Round started!")
自訂回撥
Class.BindableFunction 對象允許您在指定的程式碼之間的同步兩向通訊。您可以使用它來定義自訂回報函數,並且手動呼叫 BindableFunction:Invoke() 。 Class.BindableFunction 會在找
要使用 Studio 中的 BindableFunction 窗口在新建的 Class.BindableFunction 中:
- 將鼠標指针擺動到你想要插入 BindableFunction 的容器上。我們建議使用 ServerScriptService 來通信服務器指令碼和 ReplicatedStorage 來通信客戶端指令碼。
- 點擊容器名稱右侧的 ⊕ 按鈕,並插入 BindableFunction 個體、實例。
- 將實例重命名為 TestBindableFunction。
一旦你創建了 BindableFunction,你可以在一個 OnInvoke 回來上連接它的 Invoke() 回,然後在另一個 2>Class.BindableFunction:Execute()|Execute()2> 回來執行回來函數。
回來連接
local ServerScriptService = game:GetService("ServerScriptService")
-- 取得可綁定的函數
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- 回調函數
local function addTwoNumbers(a, b)
return a + b
end
-- 將函數設為可觸發的函數回潮
bindableFunction.OnInvoke = addTwoNumbers
事件邀請
local ServerScriptService = game:GetService("ServerScriptService")-- 取得可綁定的函數local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- 呼叫回潮式函數並輸出值local sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
參數限制
當你發射 BindableEvent 或呼叫 BindableFunction 時,它會向你所傳送的任何參數傳送。你可以傳送任何 Roblox 對象 ( Enum , 1> Class.Instance1> 等),以及 Luau 類型 ( 4> 數
非字串指數
如果傳送的表中的任何 索引 為非字串類型,例如 Instance 、userdata 或 1> function1>,Roblox 會自動將這些索引轉換為字串。
事件連接
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> 字串
end
end
-- 連接功能到事件
bindableEvent.Event:Connect(onEventFire)
事件發射
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- 含有工作區實例為鑰鍵的火焰事件bindableEvent:Fire({[workspace.Baseplate] = true})
桌子索引
如果您通過一個包含數值和字串鑰匙的數據桌,不要通過混合表的數值和字串鑰匙。相反,通過包含 全部 的鑰匙值對 (一個字典) 或 全部 的數據索引 (一個陣列) 的桌子。
事件連接
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = 劍
--> 2 = 弓
--> CharName = 女神拖onslayer
--> CharClass = 惡棍
end
end
-- 連接功能到事件
bindableEvent.Event:Connect(onEventFire)
事件發射
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- 數量化桌子local inventoryData = {"Sword", "Bow"}-- 字典桌local characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- 使用一致的索引桌子發生事件bindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
桌子身份
傳送為可綁定事件和回潮的桌子作為參數傳送至可綁定的事件和回潮即可複製,這意味著它們不會正確相等於當發射事件或啟動回調時提供的。 也可以使用 BindableFunction 上的脚本來執行此操作,並觀察桌子在發射事件或召回潮時提供的區別。您可以示例這點通過執
回來連接
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- 回調函數
local function returnTable(passedTable)
-- 輸入表時輸出表身份
print(tostring(passedTable)) --> 桌子: 0x48eb7aead27563d9
return passedTable
end
-- 將函數設為可觸發的函數回潮
bindableFunction.OnInvoke = returnTable
事件邀請
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- 輸出原始桌子身份print(tostring(inventoryData)) --> 桌子: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- 輸出表傳回號碼print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
金屬表
如果桌子有 metatable,所有的 metatable 資訊都會在轉移中丟失。 在下一個代碼示例中, NumWheels 屬性是 Car 的一部分。當服務器收到下一個表時, truck 桌子包含 2>Name
事件連接
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Name"] = "MyTruck"
end
-- 連接功能到事件
bindableEvent.Event:Connect(onEvent)
事件發射
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- 包含 metable 的火焰事件bindableEvent:Fire(truck)