可绑定的事件和回调

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

BindableEventBindableFunction 对象允许您在同一侧面的客户端-服务器边界之间绑定行为,并通过在体验中实现特定的期望结果来交流特定的期望结果。

对于可绑定的事件,最常见的使用例子是那些有圆形结构的体验。例如,您可以有一个 “匹配开始” 事件,其他脚本可以开始计时器并显示排行榜,并且相应的 “匹配结束” 事件可以让其他脚本知道当前玩家是否要返回大厅并显示获胜者。

因为它们在脚本之间协调活动,可用的事件通常在服务器上使用,但您也可以在客户端使用它们。

随着您的体验如何工作,可以绑定的事件可以帮助使您的代码更模块化,但 模块脚本 通常是一种更好的替代情况,在您需要在脚本之间共享数据的情况下。您还可以使用 模块脚本 与模块脚本一起使用以获得更清晰的语法,如在 自定义事件 中所示。

可绑定的事件

Class.BindableEvent 对象通过异步一方通信使脚本之间的自定义事件可用。

当您通过 Fire() 通过方法发射一个 Class.BindableEvent:Fire()|Fire() 通过方法,发射脚本不会生成,目标函数接受通过特定 1>限制1> 收到的参数。 像所有事件, 4> Class.BindableEvent|BindableEvents4>

要使用 Studio 中的 BindableEvent 窗口在创建一个新的 Class.BindableEvent:

  1. 将鼠标悬停在你想要插入 BindableEvent 的容器上。我们建议使用 ServerScriptService 为服务器脚本和 ReplicatedStorage 为客户脚本之间的通信。
  2. 点击容器名称右侧的 按钮,并插入一个 可绑定事件 实例。
  3. 将实例重命名为 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:

  1. 将鼠标悬停在你想要插入 BindableFunction 的容器上。我们建议使用 ServerScriptService 为服务器脚本通信提供通信,而 ReplicatedStorage 为客户脚本提供通信。
  2. 点击容器名称右侧的 按钮,并插入一个 可绑定函数 实例。
  3. 将实例重命名为 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 类型

非字符索引

如果传入的表中的任何 索引 为非字符串类型,例如Instanceuserdata或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)) --> 表:0x059bcdbb2b576549
local 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 = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- 带有 metatable 的火焰事件
bindableEvent:Fire(truck)