BindableEvent e BindableFunction oggetti ti consentono di associare comportamenti tra gli script sullo stesso lato della frontiera 0>client-server0> e comunicare un risultato desiderato specifico per le azioni in-experience.
L'uso più comune per gli eventi legabili è 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 evento "match ended" che consente ad altri script di sapere quando spostare i giocatori nel lobby e visualizzare i vincitori.
Poiché coordinano le attività tra gli script, gli eventi legabili sono tipicamente utilizzati sul Server, ma puoi usarli anche sul client.
A seconda di come la tua esperienza funziona, gli eventi legabili possono aiutare a rendere il tuo codice più modulare, ma gli script del modulo sono spesso un'alternativa migliore per le situazioni in cui devi condividere i dati tra gli script. Puoi anche usare gli script del modulo in conjunction con gli script personalizzati per una sintassi più pulita, come notato in Eventi personalizzati .
Eventi legabili
L'oggetto BindableEvent consente eventi personalizzati tramite comunicazione asincrona tra gli script.
Quando fireni un BindableEvent attraverso il metodo Fire(), lo script di fuoco non rende risultati, e la funzione target riceve gli argumenti passati con alcune 2> limitazioni2> . Come tutti gli eventi, 5>Class.BindableEvent|BindableEvents5> crea thread di c
Per creare un nuovo BindableEvent utilizzando la finestra Explorer in Studio:
- Passa il mouse sul container in cui vuoi inserire il BindableEvent . Raccomandiamo di utilizzare ServerScriptService per la comunicazione tra gli script del server e ReplicatedStorage per la comunicazione tra gli script del client.
- Fai clic sul pulsante ⊕ che appare a destra del nome del container e inserisci un'esempio BindableEvent .
- Rinomina l'istanza in TestBindableEvent .
Dopo aver creato un BindableEvent , connect a function to its Event event in one script, and then Fire() the event from another script.
Connessione evento
local ServerScriptService = game:GetService("ServerScriptService")
-- Ottieni il riferimento all'esempiodi evento legabile
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Connetti funzione anonima all'evento
bindableEvent.Event:Connect(function(data)
print(data) --> Il round ha iniziato!
end)
Fuori dal tema
local ServerScriptService = game:GetService("ServerScriptService")-- Ottieni il riferimento all'esempiodi evento legabilelocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Evento legabile al fuocobindableEvent:Fire("Round started!")
Ritorni personalizzati
L'oggetto BindableFunction consente una comunicazione sincrona tra gli script. Puoi usarlo per definire una funzione di richiamata personalizzata e invocarla manualmente chiamando BindableFunction:Invoke() . Il codice che invoca la funzione rende fino a quando la richiam
Per creare una nuova BindableFunction usando la finestra Explorer in Studio:
- Passa il mouse sul container in cui vuoi inserire il BindableFunction . Raccomandiamo di utilizzare ServerScriptService per la comunicazione tra gli script del server e ReplicatedStorage per la comunicazione tra gli script del client.
- Fai clic sul pulsante ⊕ che appare a destra del nome del container e inserisci un'esempio BindableFunction .
- Rinomina l'istanza in TestBindableFunction .
Una volta creato un BindableFunction, puoi connetterti al suo OnInvoke callback in uno script, quindi Invoke() la funzione di chiamata da un altro script.
Connessione Callback
local ServerScriptService = game:GetService("ServerScriptService")
-- Ottieni il riferimento alla funzione legabile
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Funzione di richiamata
local function addTwoNumbers(a, b)
return a + b
end
-- Imposta la funzione come Richiamadella funzione legabile
bindableFunction.OnInvoke = addTwoNumbers
Invocazione dell'evento
local ServerScriptService = game:GetService("ServerScriptService")-- Ottieni il riferimento alla funzione legabilelocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Invoca la funzione di callback e restituisce il valorelocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Limitazioni dell'argomento
Quando si esegue un BindableEvent o si invoca un BindableFunction, fornisce tutti gli argomenti che passi con l'evento o alla funzione di richiamata. Puoi passare qualsiasi tipo di oggetto Roblox ( Enum, 2>Class.Instance2>, ecc.) e i tipi Luau come numeri
Indici non strutturali
Se qualsiasi indice di una tabella passata è un tipo non nullo, come un Instance , userdata o 1>funzione1>, Roblox convertisce automaticamente questi indici in string.
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
-- Connetti funzione all'evento
bindableEvent.Event:Connect(onEventFire)
Fuori dal tema
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Evento di fuoco con tabella che contiene un'istanza di lavoro come chiavebindableEvent:Fire({[workspace.Baseplate] = true})
Indicizzazione della tabella
Se passi una tabella di dati, non passare una tabella mista di chiavi numeriche e di chiave. Invece, passa una tabella che consiste interamente di paia di chiavi (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 = Diva Dragonslayer
--> CharClass = Inflessibile
end
end
-- Connetti funzione all'evento
bindableEvent.Event:Connect(onEventFire)
Fuori dal tema
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Tavola indizzata numericamentelocal inventoryData = {"Sword", "Bow"}-- Tavola di dizionariolocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- Evento di fuoco con tabelle inizializzate in modo coerentebindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Identità della tabella
Le tabelle passate come argenti per gli eventi e i richiami legabili sono copiate, il che significa che non saranno esattamente equivalenti a quelle fornite quando si esegue l'evento o si invoca il Richiama. Le tabelle restituite all'invoker non saranno esattamente uguali a quelle fornite. Puoi dimostrarlo facendo clic con lo script seguente su una BindableFunction e osservando come le identità delle tabelle differiscono.
Connessione Callback
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Funzione di richiamata
local function returnTable(passedTable)
-- Identificatore della tabella di uscita all'invocazione
print(tostring(passedTable)) --> tabella: 0x48eb7aead27563d9
return passedTable
end
-- Imposta la funzione come Richiamadella funzione legabile
bindableFunction.OnInvoke = returnTable
Invocazione dell'evento
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- Estrae l'identità della tabella originaleprint(tostring(inventoryData)) --> tabella: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Output dell'identità della tabella all'Riportareprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metatabelle
Se una tabella ha un metitable, tutte le informazioni metitable vengono persi nel trasferimento. Nel seguente esempio di codice, la proprietà NumWheels fa parte del metitable Car . Quando il server riceve la seguente tabella, la proprietà truck della tabella 2>non2> è 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
-- Connetti funzione all'evento
bindableEvent.Event:Connect(onEvent)
Fuori dal tema
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 di fuoco con tavola che include una mettabilebindableEvent:Fire(truck)