BindableEvent e BindableFunction objetos permitem que você vincule comportamentos entre scripts no mesmo lado da fronteira cliente-servidor, e comunicar um resultado desejado específico para ações na experiência.
O caso de uso mais comum para eventos bindables é para experiências que têm uma estrutura baseada em rodadas.Por exemplo, você pode ter um evento "partida iniciada" que permite que outros scripts iniciem um cronômetro e exibam uma tabela de classificação, com um evento correspondente "partida terminada" que permite que outros scripts saibam quando mover os jogadores de volta para um lobby e exibam os vencedores.
Porque eles coordenam atividades entre scripts, eventos vinculáveis são tipicamente usados no servidor, mas você pode usá-los no cliente também.
Dependendo de como a sua experiência funciona, eventos vinculáveis podem ajudar a tornar o seu código mais modular, mas scripts de módulo são frequentemente uma alternativa melhor para situações em que você precisa compartilhar dados entre scripts.Você também pode usar eventos bindables em conjunto com scripts de módulo para uma síntese mais limpa, como observado em eventos personalizados.
Eventos bindáveis
O objeto permite eventos personalizados através de comunicação assíncrona, de um para um, entre scripts.
Quando você dispara um através do método , o script de disparo não produz não e a função alvo recebe os argumentos passados com algumas limitações .Como todos os eventos, BindableEvents cria subprocessos de cada função conectada, então, mesmo que um erro ocorra, outros continuam.
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 do servidor e ReplicatedStorage para comunicação entre scripts do 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, em seguida, Fire() o evento de outro script.
Conexão de Evento
local ServerScriptService = game:GetService("ServerScriptService")
-- Obter referência para 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)
Disparo de Evento
local ServerScriptService = game:GetService("ServerScriptService")-- Obter referência para instância de evento vinculávellocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Evento de fogo bindablebindableEvent:Fire("Round started!")
Chamadas personalizadas
O objeto BindableFunction permite comunicação sincrona, de duas vias, 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 produz até que o correspondente retorno de chamada seja encontrado e o retorno de chamada receba os argumentos que você passou para Invoke() .Se o retorno nunca foi configurar, o script que o invoca não retoma a execução.
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 do servidor e ReplicatedStorage para comunicação entre scripts do 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 se conectar ao seu retorno de chamada OnInvoke em um script, então Invoke() a função de retorno de chamada de outro script.
Conexão de Retorno de Chamada
local ServerScriptService = game:GetService("ServerScriptService")
-- Obtenha referência para função bindable
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Função de retorno
local function addTwoNumbers(a, b)
return a + b
end
-- Defina a função como o retorno de chamada de função bindable
bindableFunction.OnInvoke = addTwoNumbers
Invocação de Evento
local ServerScriptService = game:GetService("ServerScriptService")-- Obtenha referência para função bindablelocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Invocar função de retorno de chamada e valor retornadolocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Limitações de argumento
Quando você dispara um BindableEvent ou invoca um BindableFunction , ele encaminha quaisquer argumentos que você passe com o evento ou para a função de retorno de chamada.Você pode passar qualquer tipo de objeto do Roblox ( Enum , Instance , etc.), bem como tipos Luau como números, strings e booleans, embora você deva considerar com cuidado as seguintes limitações.
Índices não stringentes
Se algum índice de uma tabela passada for de tipos não-string, como um Instance, dados do usuário ou função, o Roblox converte automaticamente esses índices em strings.
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
-- Função de conexão ao evento
bindableEvent.Event:Connect(onEventFire)
Disparo de Evento
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Evento de fogo com tabela que contém uma instância de espaço de trabalho como chavebindableEvent:Fire({[workspace.Baseplate] = true})
Índice de tabela
Se você passar uma tabela de dados, não passe uma tabela mista de chaves numéricas e de texto.Em vez disso, passe uma tabela que consiste inteiramente de pares de chave-valor (um dicionário) ou inteiramente de índices numéricos (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 = Arço
--> CharName = Dragão Diva Assassino
--> CharClass = Inimigo
end
end
-- Função de conexão ao evento
bindableEvent.Event:Connect(onEventFire)
Disparo de Evento
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 de retorno são copiadas, o que significa que elas não serão exatamente equivalentes às fornecidas ao disparar o evento ou invocar o retorno de chamada.Nem as tabelas retornadas ao invocador serão exatamente equivalentes às fornecidas.Você pode demonstrar isso executando o seguinte script em um BindableFunction e observando como as identidades da tabela diferem.
Conexão de Retorno de Chamada
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Função de retorno
local function returnTable(passedTable)
-- Saída da identidade da tabela na invocação
print(tostring(passedTable)) --> tabela: 0x48eb7aead27563d9
return passedTable
end
-- Defina a função como o retorno de chamada de função bindable
bindableFunction.OnInvoke = returnTable
Invocação de Evento
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- Saia a identidade original da tabelaprint(tostring(inventoryData)) --> tabela: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Identidade da tabela de saída ao retornarprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metatábles
Se uma tabela tiver um metatable, toda a informação metatable é perdida na transferência.No seguinte exemplo de código, a propriedade NumWheels é parte do Car metadado.Quando o servidor recebe a tabela a seguir, a tabela truck tem a propriedade Name mas não a propriedade NumWheels.
Conexão de Evento
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Nome"] = "MyTruck"]
end
-- Função de conexão ao evento
bindableEvent.Event:Connect(onEvent)
Disparo de Evento
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 que inclui um metatablebindableEvent:Fire(truck)