BindableEvent y BindableFunction objetos te permiten vincular comportamientos entre scripts en el mismo lado de la frontera del cliente-servidor y comunicar un resultado deseado específico para las acciones en la experiencia.
El caso de uso más común para los eventos vinculables es para las experiencias que tienen una estructura basada en la ronda. Por ejemplo, puede tener un evento "match started" que permite que otros scripts comienen un temporizador y muestren un tablero de clasificación, con un evento "match ended" que permite que otros scripts sepan cuándo mover a los jugadores de vuelta a un lobby y mostrar los ganadores.
Dado que coordinan actividades entre scripts, los eventos vinculables generalmente se usan en el servidor, pero también puedes usarlos en el cliente.
Dependiendo de cómo funcione tu experiencia, los eventos vinculables pueden ayudar a hacer que tu código sea 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 los eventos vinculables con los scripts de módulo para una sintaxis más limpia, como se indica en Eventos personalizados .
Eventos vinculables
El objeto BindableEvent permite los eventos personalizados a través de la comunicación asíncrona entre los scripts.
Cuando disparas un BindableEvent a través del método Fire(), el guión de disparo no no genera, y la función de destino recibe los argumentos pasados con ciertas 2> limitaciones2>. Como todos los eventos, 5>Class.BindableEvent|BindableEvents5> crea subpro
Para crear un nuevo BindableEvent usando la ventana Explorador en Studio:
- 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 clientes.
- Haga clic en el botón ⊕ que aparece a la derecha del nombre del contenedor y Insertar una instancia de Evento vinculable.
- Renombre la instancia a TestBindableEvent .
Después de que hayas creado un BindableEvent, conecta una función a su evento Event en un script, y luego Fire() el evento desde otro script.
Conexión de eventos
local ServerScriptService = game:GetService("ServerScriptService")
-- Obtén 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)
Lanzamiento de Eventos
local ServerScriptService = game:GetService("ServerScriptService")-- Obtén referencia a la instancia de evento vinculablelocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Evento vinculable de FirebindableEvent:Fire("Round started!")
Llamadas personalizadas
El objeto BindableFunction permite una comunicación sincrona entre los scripts. Puedes usarlo para definir una función de llamada personalizada y invocarla manualmente al llamar BindableFunction:Invoke() . El código que invoca la función de llamada personalizada rendimiento hasta que se encuentra
Para crear una nueva BindableFunction usando la ventana Explorer en Studio:
- 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 clientes.
- Haga clic en el botón ⊕ que aparece a la derecha del nombre del contenedor y Insertar una instancia de BindableFunction .
- Renombre la instancia a TestBindableFunction .
Una vez que hayas creado un BindableFunction, puedes conectarte a su llamada de OnInvoke en un solo script, luego Invoke() la función de llamada de otro script.
Conexión de llamada
local ServerScriptService = game:GetService("ServerScriptService")
-- Obtén referencia a la función vinculable
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Función de llamada
local function addTwoNumbers(a, b)
return a + b
end
-- Establecer la función como llamada de función vinculable
bindableFunction.OnInvoke = addTwoNumbers
Invocación de eventos
local ServerScriptService = game:GetService("ServerScriptService")-- Obtén referencia a la función vinculablelocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Invocar la función de llamada y el valor de salidalocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Limitaciones de argumentos
Cuando lanzas un BindableEvent o invocas un BindableFunction, proyecta cualquier argumento que pases con el evento o a la función de llamada. Puedes pasar cualquier tipo de objeto de Roblox ( Enum, 2>Class.Instance2>, etc.), así como los tipos Luau como números, cadenas y
Índices no estructurados
Si cualquier Índice de una tabla pasada es de tipos no estructurados, como un Instance , userdata o 1>función1>, Roblox convierte automáticamente esos índices en cadenas.
Conexión de eventos
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
-- Conectar función a evento
bindableEvent.Event:Connect(onEventFire)
Lanzamiento de Eventos
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Evento de fuego con una tabla que contiene una instancia de espacio de trabajo como clavebindableEvent:Fire({[workspace.Baseplate] = true})
Índice de tablas
Si pasa una tabla de datos, no pase una tabla mixta de números y valores de cuerda. En cambio, pase una tabla que consiste entero de parejas de valores de llave (un diccionario) o entero de índices numéricos (un matriz/lista).
Conexión de eventos
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 = Tirador
end
end
-- Conectar función a evento
bindableEvent.Event:Connect(onEventFire)
Lanzamiento de Eventos
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Tabla numéricamente indexadalocal inventoryData = {"Sword", "Bow"}-- mesa de diccionariolocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- Evento de fuego con tablas de índice consistentesbindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Identidades de la tabla
Las tablas pasadas como argumentos a los eventos y llamadas de vinculación se copian, lo que significa que no serán exactamente equivalentes a las que se proporcionan al disparar el evento o invocar el devolución de llamada. Tampoco las tablas devueltas al invocador serán exactamente equivalentes a las que se proporcionan. Puedes demostrar esto al ejecutar el siguiente script en un BindableFunction y observar cómo las identidades de la tabla cambian.
Conexión de llamada
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Función de llamada
local function returnTable(passedTable)
-- Identificación de la tabla de salida al invocar
print(tostring(passedTable)) --> tabla: 0x48eb7aead27563d9
return passedTable
end
-- Establecer la función como llamada de función vinculable
bindableFunction.OnInvoke = returnTable
Invocación de eventos
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- Identificación de la tabla originalprint(tostring(inventoryData)) --> tabla: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Identificación de la tabla de salida al devolverprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metatables
Si una tabla tiene una metavertiente, toda la información de la metavertiente se pierde en el transfer. En el ejemplo de código siguiente, la propiedad NumWheels es parte de la metavertiente Car. Cuando el servidor recibe la siguiente tabla, la propiedad truck de la tabla 2>truck2>
Conexión de eventos
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Nombre"] = "MyTruck" }
end
-- Conectar función a evento
bindableEvent.Event:Connect(onEvent)
Lanzamiento de Eventos
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 fuego con una tabla que incluye una metaverticalbindableEvent:Fire(truck)