Eventos vinculables y llamadas

*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 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:

  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 clientes.
  2. Haga clic en el botón que aparece a la derecha del nombre del contenedor y Insertar una instancia de Evento vinculable.
  3. 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 vinculable
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Evento vinculable de Fire
bindableEvent: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:

  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 clientes.
  2. Haga clic en el botón que aparece a la derecha del nombre del contenedor y Insertar una instancia de BindableFunction .
  3. 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 vinculable
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Invocar la función de llamada y el valor de salida
local 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 clave
bindableEvent: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 indexada
local inventoryData = {
"Sword", "Bow"
}
-- mesa de diccionario
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Evento de fuego con tablas de índice consistentes
bindableEvent: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 original
print(tostring(inventoryData)) --> tabla: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Identificación de la tabla de salida al devolver
print(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 = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- Evento de fuego con una tabla que incluye una metavertical
bindableEvent:Fire(truck)