BindableEvent und BindableFunction Objekte ermöglichen es Ihnen, Verhaltensweisen zwischen Skripten auf der gleichen Seite der 0> Client-Server-Grenze0> und Kommunizieren Sie ein bestimmtes gewünschtes Ergebnis für In-Experience-Aktionen.
Der häufigste Anwendungsfall für gebundenereignisse ist für erlebnisse, die eine rundenbasierte struktur haben. zum beispiel könnte ein "match started" -ereignis, das andere skripte dazu bringt, einen timer zu starten und eine Bestenlisteanzuzeigen, mit einem entsprechenden "match ended" -ereignis, das andere skripte anzeigt, wenn sie spieler in eine lobby zurückkehren und die gewinner anzeigen sollen.
Da sie Aktivitäten zwischen Skripten koordinieren, werden sie in der Regel auf dem Server verwendet, aber Sie können sie auch auf dem Client verwenden.
Abhängig von der Art und Weise, wie deine Erfahrung funktioniert, können verbindliche Ereignisse dazu beitragen, deinen Code modularer zu machen, aber Modul-Skripte sind oft eine bessere Alternative für Situationen, in denen du Daten zwischen Skripts teilen musst. Du kannst auch Modul-Skripte in Kombination mit Benutzerdefinierte Ereignisse für eine sauberere Syntax verwenden, wie in 2>Benutzerdefinierte Ereignisse</
Bindbare Ereignisse
Das BindableEvent-Objekt ermöglicht benutzerdefinierte Ereignisse durch asynchrones, einseitiges Kommunikations zwischen Skripten.
Wenn Sie ein BindableEvent durch die Methode Fire() feuern, ergibt das Feuerskript kein Ergebnis, und die Zielfunktion erhält die übergebenen Argumente mit bestimmten Einschränkungen . Wie alle Ereignisse erstellt 1> Class.BindableEvent|
Um ein neues BindableEvent mit dem Explorer-Fenster in Studio zu erstellen:
- Bewegen Sie den Mauszeiger über den Container, in den Sie das BindableEvent einfügen möchten. Wir empfehlen die Verwendung von ServerScriptService für die Kommunikation zwischen Server-Skripts und ReplicatedStorage für die Kommunikation zwischen Client-Skripts.
- Klicken Sie auf die ⊕ Schaltfläche, die rechts vom Namen des Containers erscheint, und fügen Sie eine BindableEvent Instanz ein.
- Benennen Sie die Instanz zu TestBindableEvent .
Nachdem du einen BindableEvent erstellt hast, verbinde eine Funktion mit ihrem Event -Ereignis in einem Skript, das. PL: die Skriptsund dann Fire() dem Ereignis aus einem anderen Skript, das. PL: die Skripts.
Verbindung mit Ereignis
local ServerScriptService = game:GetService("ServerScriptService")
-- Erhalten Sie die Referenz zu der zu bindenden Ereignis-Instanz
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Verbinden Sie die anonyme Funktion mit dem Ereignis
bindableEvent.Event:Connect(function(data)
print(data) --> Die Runde hat begonnen!
end)
Ereignis-Auslösen
local ServerScriptService = game:GetService("ServerScriptService")-- Erhalten Sie die Referenz zu der zu bindenden Ereignis-Instanzlocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Feuerbare EreignisbindableEvent:Fire("Round started!")
Benutzerdefinierte Rückrufe
Das BindableFunction-Objekt ermöglicht die synchronische Zwei-Weg-Kommunikation zwischen Skripten. Sie können es verwenden, um eine benutzerdefinierte Rückruffunktion zu definieren und sie manuell zu aufrufen, indem Sie BindableFunction:Invoke() aufrufen.
Um einen neuen BindableFunction zu erstellen, der die Explorer-Fenster in Studio verwendet:
- Bewegen Sie den Mauszeiger über den Container, in den Sie die BindableFunction einfügen möchten. Wir empfehlen die Verwendung von ServerScriptService für die Kommunikation zwischen Server-Skripts und ReplicatedStorage für die Kommunikation zwischen Client-Skripts.
- Klicken Sie auf die ⊕ Schaltfläche, die rechts vom Namen des Containers erscheint, und fügen Sie eine BindableFunction Instanz ein.
- Renennen Sie die Instanz zu TestBindableFunction .
Sobald du einen BindableFunction erstellt hast, kannst du dich mit seinem OnInvoke-Callback in einem Skript, das. PL: die Skriptsverbinden, dann Class.BindableFunction:Execute()|Execute() die Rückruffunktion von einem anderen Skript, das. PL: die Skripts.
Rückruf-Verbindung
local ServerScriptService = game:GetService("ServerScriptService")
-- Holen Sie sich die Referenz auf die baubare Funktion
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Rückruf-Funktion
local function addTwoNumbers(a, b)
return a + b
end
-- Setze die Funktion als Callbackder gebunden Funktion
bindableFunction.OnInvoke = addTwoNumbers
Ereigniseite
local ServerScriptService = game:GetService("ServerScriptService")-- Holen Sie sich die Referenz auf die baubare Funktionlocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Rufe die Rückruffunktion auf und geben Sie den zurückgegebenen Wert auslocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Argument-Einschränkungen
Wenn du ein BindableEvent auslöst oder eine BindableFunction aufrufst, überträgt es alle Argumente, die du mit dem Ereignis oder der Rückruffunktion passt, an das Enum. Du kannst alle Arten von Roblox-Objekten 2>Datatype. Enum2>, 5>Class.Instance5>
Nicht-String-Indizes
Wenn einige Indizes einer bestimmten Tabelle nicht-string-Typen sind, wie z. B. ein Instance , Benutzerdaten oder 1> Funktion1>, wird diese Tabelle automatisch in Strings umgewandelt.
Verbindung mit Ereignis
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> string
end
end
-- Verbindungsfunktion mit Ereignis
bindableEvent.Event:Connect(onEventFire)
Ereignis-Auslösen
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Feuer-Ereignis mit Tabelle, in der eine Arbeitsbereich-Instanz als Schlüssel enthalten istbindableEvent:Fire({[workspace.Baseplate] = true})
Tabelle-Indexierung
Wenn Sie eine Tabelle von Daten passieren, nicht passieren Sie eine gemischte Tabelle von Zahlen- und Zeichenschlüssel. Stattdessen passieren Sie eine Tabelle, die vollständig ist ausschließlich von Schlüsselwertenpaaren (ein Wörterbuch) oder vollständig ist vollständig von Zahlen索weisen (ein Array).
Verbindung mit Ereignis
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = Schwert
--> 2 = Bogen
--> CharName = Diva-Drachenspieler
--> CharClass = Streuner
end
end
-- Verbindungsfunktion mit Ereignis
bindableEvent.Event:Connect(onEventFire)
Ereignis-Auslösen
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Zahlen索ierte Tabellelocal inventoryData = {"Sword", "Bow"}-- Wörterbuch-Tabellelocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- Feuer-Ereignis mit konstanten TabellenbindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Tabelle Identitäten
Tabelle als Argument für zu bindbare Ereignisse und Rückrufe kopiert werden, was bedeutet, dass sie nicht genau gleich sind, wie sie beim Auslösen des Ereignisses oder beim Aufrufen des Callbackbereitgestellt werden. Tabelle, die dem Invoker zurückgegeben werden, sind nicht genau gleich, wie sie bereitgestellt werden. Sie können dies durch Ausführen des folgenden Skripts auf einem BindableFunction zeigen, und beobachten, wie sich die Tabelleidentitäten unterscheiden.
Rückruf-Verbindung
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Rückruf-Funktion
local function returnTable(passedTable)
-- Ausgabe-Tabelle-Identität bei der Invocation
print(tostring(passedTable)) --> tabelle: 0x48eb7aead27563d9
return passedTable
end
-- Setze die Funktion als Callbackder gebunden Funktion
bindableFunction.OnInvoke = returnTable
Ereigniseite
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- Geben Sie die ursprüngliche TabelleIdentität ausprint(tostring(inventoryData)) --> tabelle: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Ausgabe-Tabelle-Identität bei zurückgebenprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metatables
Wenn eine Tabelle eine Metatable hat, wird der gesamte Metatable-Inhalt im Zusammenhang verloren. Im folgenden Codebeispiel ist die Eigenschaft NumWheels Teil der Metabelle Car. Wenn der Server die folgende Tabelle erhält, hat die truck Tabelle das Eigenschaft 2> Name2> aber
Verbindung mit Ereignis
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Name"] = "MyTruck"
end
-- Verbindungsfunktion mit Ereignis
bindableEvent.Event:Connect(onEvent)
Ereignis-Auslösen
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- Feuer-Ereignis mit Tabelle, einschließlich einer MetatabellebindableEvent:Fire(truck)