BindableEvent 和 BindableFunction 对象允许您在同一侧面的客户端-服务器边界之间绑定行为,并通过在体验中实现特定的期望结果来交流特定的期望结果。
对于可绑定的事件,最常见的使用例子是那些有圆形结构的体验。例如,您可以有一个 “匹配开始” 事件,其他脚本可以开始计时器并显示排行榜,并且相应的 “匹配结束” 事件可以让其他脚本知道当前玩家是否要返回大厅并显示获胜者。
因为它们在脚本之间协调活动,可用的事件通常在服务器上使用,但您也可以在客户端使用它们。
随着您的体验如何工作,可以绑定的事件可以帮助使您的代码更模块化,但 模块脚本 通常是一种更好的替代情况,在您需要在脚本之间共享数据的情况下。您还可以使用 模块脚本 与模块脚本一起使用以获得更清晰的语法,如在 自定义事件 中所示。
可绑定的事件
Class.BindableEvent 对象通过异步一方通信使脚本之间的自定义事件可用。
当您通过 Fire() 通过方法发射一个 Class.BindableEvent:Fire()|Fire() 通过方法,发射脚本不会生成,目标函数接受通过特定 1>限制1> 收到的参数。 像所有事件, 4> Class.BindableEvent|BindableEvents4>
要使用 Studio 中的 BindableEvent 窗口在创建一个新的 Class.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() 。代码使用函数 设置成 直到相应的回
要使用 Studio 中的 BindableFunction 窗口在创建一个新的 Class.BindableFunction:
- 将鼠标悬停在你想要插入 BindableFunction 的容器上。我们建议使用 ServerScriptService 为服务器脚本通信提供通信,而 ReplicatedStorage 为客户脚本提供通信。
- 点击容器名称右侧的 ⊕ 按钮,并插入一个 可绑定函数 实例。
- 将实例重命名为 TestBindableFunction 。
一旦您创建了一个 BindableFunction ,您可以在一个脚本中连接到其 OnInvoke 回调,然后从另一个脚本调用 Invoke() 函数。
调用回连接
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 类型
非字符索引
如果传入的表中的任何 索引 为非字符串类型,例如Instance、userdata或1>函数1>,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})
桌子索引
如果您通过数据表,通过一个混合表的数字和字符键,不要通过一个包含 键值对 (字典) 或 数字索引 (阵列) 的表。相反,通过包含 键值对 (字典) 或 1> 数字索引 (阵数组)1> 的表的表。
事件连接
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 = Diva 拖动器
--> 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)-- 输出表达式I回传print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
金属表
如果表有一个 metatable,所有的 metatable 信息都会在转换中丢失。在以下代码示例中, NumWheels 属性是 Car 的 metatable 的一部分。当服务器收到下表时,truck 表有 1> Name1> 属性,但
事件连接
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)-- 带有 metatable 的火焰事件bindableEvent:Fire(truck)