Eventi e richiami bindabili

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

BindableEvent e BindableFunction oggetti ti consentono di legare i comportamenti tra gli script sul lato stesso del confine client-server e comunicare un risultato desiderato specifico per le azioni in-experience.

Il caso d'uso più comune per gli eventi leganti è per le esperienze che hanno una struttura basata sul round.Ad esempio, potresti avere un evento "match started" che consente ad altri script di avviare un timer e visualizzare una Classifica, con un corrispondente evento "match ended" che consente ad altri script di sapere quando spostare i giocatori indietro in una lobby e visualizzare i vincitori.

Poiché coordinano le attività tra gli script, gli eventi bindabili vengono tipicamente utilizzati sul Server, ma puoi anche utilizzarli sul client.

A seconda di come funziona la tua esperienza, gli eventi bindabili possono aiutare a rendere il tuo codice più modulare, ma gli script di modulo sono spesso una migliore alternativa per situazioni in cui è necessario condividere dati tra gli script.Puoi anche utilizzare eventi bindabili in combinazione con gli script del modulo per una sintassi più pulita, come notato in eventi personalizzati.

Eventi leganti

L'oggetto BindableEvent abilita eventi personalizzati attraverso una comunicazione asincrona, unidirezionale tra gli script.

Quando spari un attraverso il metodo , lo script di fuoco non produce e la funzione target riceve gli argomenti passati con alcune limitazioni .Come tutti gli eventi, BindableEvents crea thread di ogni funzione connessa, quindi anche se uno errore, gli altri continuano.

Per creare una nuova BindableEvent utilizzando la finestra Explorer in Studio:

  1. Passa il mouse sul contenitore in cui vuoi inserire il BindableEvent .Consigliamo di utilizzare ServerScriptService per la comunicazione tra gli script del server e ReplicatedStorage per la comunicazione tra gli script del client.
  2. Fai clic sul pulsante che appare a destra del nome del contenitore e inserisci un'esempio BindableEvent .
  3. Rinomina l'istanza a TestBindableEvent .

Dopo aver creato un BindableEvent, connetti una funzione al suo evento Event in uno script e poi Fire() l'evento da un altro script.

Connessione evento

local ServerScriptService = game:GetService("ServerScriptService")
-- Ottieni il riferimento all'esempiodi evento bindabile
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Connetti la funzione anonima all'evento
bindableEvent.Event:Connect(function(data)
print(data) --> La partita è iniziata!
end)
Sparring eventi

local ServerScriptService = game:GetService("ServerScriptService")
-- Ottieni il riferimento all'esempiodi evento bindabile
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Evento legato al fuoco
bindableEvent:Fire("Round started!")

Richieste personalizzate

L'oggetto BindableFunction consente la comunicazione sincrona, a due vie, tra gli script.Puoi usarlo per definire una funzione di richiamo personalizzata e invocarla manualmente chiamando BindableFunction:Invoke() .Il codice che invoca la funzione produce fino a quando non viene trovato il corrispondente callback e il callback riceve gli argomenti che hai passato a Invoke() .Se il richiamo non è mai stato Impostare, lo script che lo invoca non riprende l'esecuzione.

Per creare una nuova BindableFunction utilizzando la finestra Explorer in Studio:

  1. Passa il mouse sul contenitore in cui vuoi inserire il BindableFunction .Consigliamo di utilizzare ServerScriptService per la comunicazione tra gli script del server e ReplicatedStorage per la comunicazione tra gli script del client.
  2. Fai clic sul pulsante che appare a destra del nome del contenitore e inserisci un'esempio BindableFunction .
  3. Rinomina l'istanza a TestBindableFunction .

Una volta creato un BindableFunction , puoi connetterti al suo richiamo OnInvoke in un solo script, quindi Invoke() la funzione di richiamo da un altro script.

Connessione di richiamo

local ServerScriptService = game:GetService("ServerScriptService")
-- Ottieni il riferimento alla funzione bindable
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Funzione di richiamo
local function addTwoNumbers(a, b)
return a + b
end
-- Imposta la funzione come Richiamadella funzione bindable
bindableFunction.OnInvoke = addTwoNumbers
Invocazione evento

local ServerScriptService = game:GetService("ServerScriptService")
-- Ottieni il riferimento alla funzione bindable
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Invoca la funzione di richiamo e il valore di output restituito
local sum = bindableFunction:Invoke(2, 4)
print(sum) --> 6

Limitazioni degli argomenti

Quando spari un BindableEvent o invochi un BindableFunction , forwarda tutti gli argomenti che passi con l'evento o alla funzione di richiamo.Puoi passare qualsiasi tipo di oggetto Roblox ( Enum , Instance , ecc.), nonché tipi Luau come numeri, stringhe e booleani, anche se dovresti prendere in considerazione con attenzione le seguenti limitazioni.

Indici non stringhe

Se qualsiasi indice di una tabella passata è di tipo non stringa, come un Instance , dati utente o funzione, Roblox converte automaticamente tali indici in stringhe.

Connessione evento

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> stringa
end
end
-- Funzione di connessione all'evento
bindableEvent.Event:Connect(onEventFire)
Sparring eventi

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Evento di fuoco con tabella che contiene un'istanza di spazio di lavoro come chiave
bindableEvent:Fire({
[workspace.Baseplate] = true
})

Indicizzazione della tabella

Se passi una tabella di dati, non passare una tabella mista di chiavi numeriche e di stringhe.Invece, passa un tavolo che consiste interamente di coppie chiave-valore (un dizionario) o interamente di indici numerici (un vettore).

Connessione 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 = Spada
--> 2 = Arco
--> CharName = Divano Dragonslayer
--> CharClass = Cattivo
end
end
-- Funzione di connessione all'evento
bindableEvent.Event:Connect(onEventFire)
Sparring eventi

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Tabella numericamente indicizzata
local inventoryData = {
"Sword", "Bow"
}
-- Tabella dizionario
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Evento di fuoco con tabelle indexate in modo coerente
bindableEvent:Fire(inventoryData)
bindableEvent:Fire(characterData)

Identità della tabella

Le tabelle passate come argomenti a eventi e richiami leganti vengono copiate, il che significa che non saranno esattamente equivalenti a quelle fornite quando si attiva l'evento o si invoca il Richiama.Né le tabelle restituite all'invocatore saranno esattamente equivalenti a quelle fornite.Puoi dimostrarlo eseguendo il seguente script su un BindableFunction e osservando come le identità della tabella differiscono.

Connessione di richiamo

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Funzione di richiamo
local function returnTable(passedTable)
-- Identità della tabella di output durante l'invocazione
print(tostring(passedTable)) --> tabella: 0x48eb7aebook27563d9
return passedTable
end
-- Imposta la funzione come Richiamadella funzione bindable
bindableFunction.OnInvoke = returnTable
Invocazione evento

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
local inventoryData = {
"Sword", "Bow"
}
-- Output dell'identità della tabella originale
print(tostring(inventoryData)) --> tabella: 0x059bcmdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Identità della tabella di output al Riportare
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9

Metatabele

Se una tabella ha un metatable, tutte le informazioni metatable vengono perse durante il trasferimento.Nell'esempio di codice seguente, la proprietà NumWheels è parte del Car metabile.Quando il server riceve la seguente tabella, la tabella ha la proprietà ma non la Proprietà.

Connessione evento

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Nome"] = "MyTruck"]}
end
-- Funzione di connessione all'evento
bindableEvent.Event:Connect(onEvent)
Sparring eventi

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 di fuoco con tavolo che include un metatable
bindableEvent:Fire(truck)