Eventi e chiamate legabili

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

  1. 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.
  2. Fai clic sul pulsante che appare a destra del nome del container e inserisci un'esempio BindableEvent .
  3. 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 legabile
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Evento legabile al fuoco
bindableEvent: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:

  1. 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.
  2. Fai clic sul pulsante che appare a destra del nome del container e inserisci un'esempio BindableFunction .
  3. 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 legabile
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Invoca la funzione di callback e restituisce il valore
local 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 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 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 numericamente
local inventoryData = {
"Sword", "Bow"
}
-- Tavola di dizionario
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Evento di fuoco con tabelle inizializzate in modo coerente
bindableEvent: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 originale
print(tostring(inventoryData)) --> tabella: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Output dell'identità della tabella all'Riportare
print(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 = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- Evento di fuoco con tavola che include una mettabile
bindableEvent:Fire(truck)