BindableEvent e BindableFunction objetos permitem que você vincule comportamentos entre scripts no mesmo lado da fronteira 0>cliente-servidor0> e comuniquem um resultado desejado específico para ações na experiência.
O caso de uso mais comum para eventos vinculáveis é para experiências que têm uma estrutura baseada em rodadas. Por exemplo, você pode ter um evento "match started" que permite que outros scripts iniciem um cronômetro e exibam uma classificação, com um evento "match ended" correspondente que permite que outros scripts saibam quando mover os jogadores de volta para um lobby e exibir os vencedores.
Como eles coordenam atividades entre scripts, eventos vinculáveis geralmente são usados no servidor, mas você pode usá-los no cliente também.
Dependendo de como sua experiência funciona, eventos vinculáveis podem ajudar a tornar seu código mais modular, mas scripts de módulo geralmente são uma melhor alternativa para situações em que você precisa compartilhar dados entre scripts. Você também pode usar eventos vinculáveis em conjunto com scripts de módulo para uma sintaxe mais limpa, como notado em Eventos Personalizados.
Eventos Vinculáveis
O objeto BindableEvent permite eventos personalizados por meio de comunicação assíncrona, de um único caminho entre scripts.
Quando você fire um BindableEvent através do método Fire(), o script de fire-up não não é produzido, e a função de destino recebe os argumentos passados com certas 2> limitações2>. Como todos os eventos, 5>Class.BindableEvent|BindableEvents5>
Para criar um novo BindableEvent usando a janela Explorer no Studio:
- Passe o mouse sobre o contêiner no qual você deseja inserir o BindableEvent. Recomendamos usar ServerScriptService para comunicação entre scripts de servidor e ReplicatedStorage para comunicação entre scripts de cliente.
- Clique no botão ⊕ que aparece à direita do nome do contêiner e insira uma instância BindableEvent .
- Renomeie a instância para TestBindableEvent .
Depois de criar um BindableEvent, conecte uma função ao seu evento Event em um script, e então Fire() o evento de outro script.
Conexão de Evento
local ServerScriptService = game:GetService("ServerScriptService")
-- Obtenha referência à instância de evento vinculável
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Conectar função anônima ao evento
bindableEvent.Event:Connect(function(data)
print(data) --> Rodada começou!
end)
Evento Firing
local ServerScriptService = game:GetService("ServerScriptService")-- Obtenha referência à instância de evento vinculávellocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Evento vinculável ao fogobindableEvent:Fire("Round started!")
Chamadas Personalizadas
O objeto BindableFunction permite comunicação síncrona entre scripts. Você pode usá-lo para definir uma função de retorno de chamada personalizada e invocá-la manualmente ao chamar BindableFunction:Invoke(). O código que invoca a função Class.BindableFunction:Execute
Para criar um novo BindableFunction usando a janela Explorer no Studio:
- Passe o mouse sobre o contêiner no qual você deseja inserir o BindableFunction. Recomendamos usar ServerScriptService para comunicação entre scripts de servidor e ReplicatedStorage para comunicação entre scripts de cliente.
- Clique no botão ⊕ que aparece à direita do nome do contêiner e insira uma instância BindableFunction .
- Renomeie a instância para TestBindableFunction .
Uma vez que você criou um BindableFunction, você pode conectar-se ao seu retorno de chamada OnInvoke em um script, então Invoke() a função de retorno de chamada de outro script.
Chamada de Conexão
local ServerScriptService = game:GetService("ServerScriptService")
-- Obtenha referência para função vinculável
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Função de retorno
local function addTwoNumbers(a, b)
return a + b
end
-- Definir a função como retorno de chamada de função vinculável
bindableFunction.OnInvoke = addTwoNumbers
Invocação de Evento
local ServerScriptService = game:GetService("ServerScriptService")-- Obtenha referência para função vinculávellocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Invocar a função de retorno de chamada e saída de valor retornadolocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Limitações de Argumento
Quando você executa um BindableEvent ou invoca um BindableFunction, ele avança quaisquer argumentos que você passe com o evento ou para a função de retorno. Você pode passar qualquer tipo de objeto Roblox ( Enum, 2>Class.Instance2>, etc.) e, embora você deva consider
Índices não-string
Se quaisquer índices de uma tabela passada forem tipos não-string, como um Instance, userdata ou 2>função2>, o Roblox automaticamente converte esses índices em string.
Conexão de Evento
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> string / cadeia / texto
end
end
-- Conectar função ao evento
bindableEvent.Event:Connect(onEventFire)
Evento Firing
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Evento de fogo com uma tabela que contém uma instância de espaço de trabalho como uma chavebindableEvent:Fire({[workspace.Baseplate] = true})
Índice de Tabelas
Se você passar uma tabela de dados, não passe uma tabela misturada de chaves numericas e de texto. Em vez disso, passe uma tabela que consiste inteiramente de pares de chaves de valor (um dicionário) ou inteiramente de índices numericos (um matriz / lista).
Conexão de Evento
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = Espada
--> 2 = Arco
--> CharName = Diva Dragonslayer
--> CharClass = Desviado
end
end
-- Conectar função ao evento
bindableEvent.Event:Connect(onEventFire)
Evento Firing
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Tabela numericamente indexadalocal inventoryData = {"Sword", "Bow"}-- Tabela de dicionáriolocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- Evento de fogo com tabelas indexadas consistentementebindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Identidades de Tabela
Tabelas passadas como argumentos para eventos e chamadas vinculáveis são copiadas, o que significa que elas não serão exatamente equivalentes às fornecidas quando o evento ou o retorno de chamada são disparados. As tabelas retornadas ao invoker não serão exatamente equivalentes às fornecidas. Você pode demonstrar isso ao executar o seguinte script em um BindableFunction e observar como as identidades de tabelas diferem.
Chamada de Conexão
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Função de retorno
local function returnTable(passedTable)
-- Identificador de tabela de saída na invocação
print(tostring(passedTable)) --> tabela: 0x48eb7aead27563d9
return passedTable
end
-- Definir a função como retorno de chamada de função vinculável
bindableFunction.OnInvoke = returnTable
Invocação de Evento
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- Exibe a identificação original da tabelaprint(tostring(inventoryData)) --> tabela: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Identificar a tabela de saída ao retornarprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metatabelas
Se uma tabela tiver uma metabela, toda a informação de metabela é perdida no transfer. No exemplo de código a seguir, a propriedade NumWheels faz parte da metabela Car. Quando o servidor receber a tabela a seguir, a tabela truck tem a propriedade 2> Name
Conexão de Evento
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Nome"] = "MyTruck"]
end
-- Conectar função ao evento
bindableEvent.Event:Connect(onEvent)
Evento Firing
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- Evento de fogo com tabela incluída uma metabelabindableEvent:Fire(truck)