Eventos y llamadas de devolución vinculables

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

BindableEvent y BindableFunction objetos le permiten vincular comportamientos entre scripts en el mismo lado del límite cliente-servidor y comunicar un resultado deseado específico para acciones en experiencia.

El caso de uso más común para eventos vinculables es para experiencias que tienen una estructura basada en rondas.Por ejemplo, es posible que tenga un evento "match started" que permita que otros scripts inicien un temporizador y muestren una tabla de clasificación, con un evento "match ended" correspondiente que permita que otros scripts sepan cuándo devolver a los jugadores a un vestíbulo y mostrar a los ganadores.

Debido a que coordinan actividades entre scripts, los eventos vinculables se utilizan típicamente en el servidor, pero también puedes utilizarlos en el cliente.

Dependiendo de cómo funcione tu experiencia, los eventos vinculables pueden ayudar a hacer tu código más modular, pero los scripts de módulo a menudo son una mejor alternativa para situaciones en las que necesitas compartir datos entre scripts.También puedes usar eventos enlazables en conjunción con los scripts de módulo para una sintaxis más limpia, como se indica en eventos personalizados.

Acontecimientos vinculables

El objeto BindableEvent habilita eventos personalizados a través de comunicación asincrónica, de un solo sentido entre scripts.

Cuando disparas un a través del método , el guión de disparo no produce no y la función objetivo recibe los argumentos pasados con ciertas limitaciones .Al igual que todos los eventos, BindableEvents crea hilos de cada función conectada, por lo que incluso si uno falla, otros continúan.

Para crear un nuevo BindableEvent usando la ventana Explorador en Studio:

  1. Pase el mouse sobre el contenedor en el que desea insertar el BindableEvent .Recomendamos usar ServerScriptService para la comunicación entre scripts del servidor y ReplicatedStorage para la comunicación entre scripts del cliente.
  2. Haga clic en el botón que aparece a la derecha del nombre del contenedor e insira una instancia de evento vinculable .
  3. Renombra la instancia a TestBindableEvent.

Después de haber creado un BindableEvent , conecta una función a su evento Event en un solo script, y luego Fire() el evento de otro script.

Conexión de evento

local ServerScriptService = game:GetService("ServerScriptService")
-- Obtener referencia a la instancia de evento vinculable
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Conectar función anónima al evento
bindableEvent.Event:Connect(function(data)
print(data) --> ¡La ronda comenzó!
end)
Disparo de eventos

local ServerScriptService = game:GetService("ServerScriptService")
-- Obtener referencia a la instancia de evento vinculable
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Evento combinable de fuego
bindableEvent:Fire("Round started!")

Llamadas personalizadas

El objeto BindableFunction permite la comunicación sincronizada de ida y vuelta entre scripts.Puedes usarlo para definir una función de llamada personalizada y invocarla manualmente llamando BindableFunction:Invoke() .El código que invoca la función produce hasta que se encuentra el correspondiente llamado de devolución, y el llamado recibe los argumentos que pasaste a Invoke() .Si el retorno nunca establecerestableció, el script que lo invoca no reanuda la ejecución.

Para crear un nuevo BindableFunction usando la ventana Explorador en Studio:

  1. Pase el mouse sobre el contenedor en el que desea insertar el BindableFunction .Recomendamos usar ServerScriptService para la comunicación entre scripts del servidor y ReplicatedStorage para la comunicación entre scripts del cliente.
  2. Haga clic en el botón que aparece a la derecha del nombre del contenedor e insira una instancia BindableFunction .
  3. Renombra la instancia a TestBindableFunction.

Una vez que hayas creado un BindableFunction , puedes conectarte a su llamada de devolución OnInvoke en un solo script, luego Invoke() la función de llamada de devolución de otro script.

Conexión de devolución de llamada

local ServerScriptService = game:GetService("ServerScriptService")
-- Obtener referencia a la función vinculable
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Función de devolución de llamada
local function addTwoNumbers(a, b)
return a + b
end
-- Establecer la función como devolución de llamadade devolución de la función vinculable
bindableFunction.OnInvoke = addTwoNumbers
Invocación de evento

local ServerScriptService = game:GetService("ServerScriptService")
-- Obtener referencia a la función vinculable
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Invoca la función de llamada de devolución y el valor devuelto
local sum = bindableFunction:Invoke(2, 4)
print(sum) --> 6

Limitaciones de argumentos

Cuando disparas un BindableEvent o invocas un BindableFunction , envía cualquier argumento que pases con el evento o a la función de llamada de devolución.Puedes pasar cualquier tipo de objeto de Roblox (Enum , Instance , etc.), así como tipos Luau como números, cadenas y booleanos, aunque deberías considerar cuidadosamente las siguientes limitaciones.

Índices no de cadena

Si algún índice de una tabla pasada es de tipo no cadena, como un Instance , datos de usuario o función, Roblox convierte automáticamente esos índices a cadenas.

Conexión 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)) --> cadena
end
end
-- Función de conexión al evento
bindableEvent.Event:Connect(onEventFire)
Disparo de eventos

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Evento de fuego con tabla que contiene una instancia de espacio de trabajo como clave
bindableEvent:Fire({
[workspace.Baseplate] = true
})

Indexación de tablas

Si pasas una tabla de datos, no pases una tabla mixta de claves numéricas y de texto.En cambio, pasa una tabla que consiste completamente de pares de clave-valor (un diccionario) o completamente de índices numéricos (un matriz/lista).

Conexión 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 = Lazo
--> Nombre de personaje = Diva Dragonslayer
--> CharClass = Ladrón
end
end
-- Función de conexión al evento
bindableEvent.Event:Connect(onEventFire)
Disparo de eventos

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Tabla indexada numéricamente
local inventoryData = {
"Sword", "Bow"
}
-- Tabla de diccionario
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Evento de fuego con tablas indexadas consistentemente
bindableEvent:Fire(inventoryData)
bindableEvent:Fire(characterData)

Identidades de tabla

Las tablas pasadas como argumentos a eventos vinculables y llamadas se copian, lo que significa que no serán exactamente equivalentes a las proporcionadas al disparar el evento o invocar la devolución de llamada.Tampoco las tablas devueltas al invocador serán exactamente equivalentes a las proporcionadas.Puedes demostrar esto ejecutando el siguiente script en un BindableFunction y observando cómo difieren las identidades de la tabla.

Conexión de devolución de llamada

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Función de devolución de llamada
local function returnTable(passedTable)
-- Identificación de tabla de salida al invocar
print(tostring(passedTable)) --> tabla: 0x48eb7aead27563d9
return passedTable
end
-- Establecer la función como devolución de llamadade devolución de la función vinculable
bindableFunction.OnInvoke = returnTable
Invocación de evento

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
local inventoryData = {
"Sword", "Bow"
}
-- Identificación de tabla original de salida
print(tostring(inventoryData)) --> tabla: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Identificación de tabla de salida al devolver
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9

Tablas metálicas

Si una tabla tiene una información metatable, se pierde toda la información metatable en la transferencia.En el siguiente ejemplo de código, la propiedad NumWheels es parte del Car metatable.Cuando el servidor recibe la siguiente tabla, la tabla truck tiene la propiedad Name pero no la propiedad NumWheels.

Conexión de evento

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Nombre"] = "MyTruck"}
end
-- Función de conexión al evento
bindableEvent.Event:Connect(onEvent)
Disparo de eventos

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)
-- Evento de fuego con tabla que incluye una tabla metálica
bindableEvent:Fire(truck)