BindableEvent und BindableFunction Objekte ermöglichen es dir, Verhaltensweisen zwischen Skripten auf derselben Seite der Client-Server Grenze zu binden und ein spezifisches gewünschtes Ergebnis für In-Game-Aktionen zu kommunizieren.
Der häufigste Anwendungsfall für bindbare Events sind Spiele, die eine rundenbasierte Struktur haben. Zum Beispiel könntest du ein "Match gestartet" Event haben, das anderen Skripten erlaubt, einen Timer zu starten und eine Bestenliste anzuzeigen, mit einem entsprechenden "Match beendet" Event, das anderen Skripten mitteilt, wann sie die Spieler zurück in die Lobby bewegen und die Gewinner anzeigen sollen.
Da sie Aktivitäten zwischen Skripten koordinieren, werden bindbare Events typischerweise auf dem Server verwendet, aber du kannst sie auch auf dem Client nutzen.
Je nachdem, wie dein Spiel funktioniert, können bindbare Events dazu beitragen, deinen Code modularer zu gestalten, aber Modulscripts sind oft eine bessere Alternative für Situationen, in denen du Daten zwischen Skripten teilen musst. Du kannst auch bindbare Events in Verbindung mit Modulscripten für eine sauberere Syntax verwenden, wie in Benutzerdefinierte Events erwähnt.
Bindbare Events
Das BindableEvent Objekt ermöglicht benutzerdefinierte Events durch asynchrone, einseitige Kommunikation zwischen Skripten.
Wenn du ein BindableEvent durch die Methode Fire() auslöst, wird das auslösende Skript nicht angehalten, und die Ziel-Funktion erhält die übergebenen Argumente mit bestimmten Einschränkungen. Wie alle Events erzeugen BindableEvents Threads von jeder verbundenen Funktion, sodass, selbst wenn eine fehlerhaft ist, andere weiterhin ausgeführt werden.
Um ein neues BindableEvent über das Explorer Fenster in Studio zu erstellen:
- Bewege den Mauszeiger über den Container, in den du das BindableEvent einfügen möchtest. Wir empfehlen die Verwendung von ServerScriptService für die Kommunikation zwischen Serverskripten und ReplicatedStorage für die Kommunikation zwischen Clientskripten.
- Klicke auf die ⊕ Schaltfläche, die rechts neben dem Namen des Containers erscheint, und füge eine BindableEvent Instanz ein.
- Benenne die Instanz in TestBindableEvent um.
Nachdem du ein BindableEvent erstellt hast, verbinde eine Funktion mit dem Event Event in einem Skript und dann Fire() das Event aus einem anderen Skript.
Event-Verbindung
local ServerScriptService = game:GetService("ServerScriptService")
-- Hole die Referenz zur bindbaren Event-Instanz
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Verbinde eine anonyme Funktion mit dem Event
bindableEvent.Event:Connect(function(data)
print(data) --> Runde gestartet!
end)
Event-Auslösunglocal ServerScriptService = game:GetService("ServerScriptService")-- Hole die Referenz zur bindbaren Event-Instanzlocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Fire bindbares EventbindableEvent:Fire("Runde gestartet!")
Benutzerdefinierte Rückruffunktionen
Das BindableFunction Objekt ermöglicht eine synchrone, zweiseitige Kommunikation zwischen Skripten. Du kannst es verwenden, um eine benutzerdefinierte Rückruffunktion zu definieren und sie manuell durch Aufrufen von BindableFunction:Invoke() zu aktivieren. Der Code, der die Funktion aufruft, stoppt, bis der entsprechende Rückruf gefunden wird, und der Rückruf erhält die Argumente, die du an Invoke() übergeben hast. Wenn der Rückruf nie festgelegt wurde, setzt das Skript, das ihn aufruft, die Ausführung nicht fort.
Um ein neues BindableFunction über das Explorer Fenster in Studio zu erstellen:
- Bewege den Mauszeiger über den Container, in den du das BindableFunction einfügen möchtest. Wir empfehlen die Verwendung von ServerScriptService für die Kommunikation zwischen Serverskripten und ReplicatedStorage für die Kommunikation zwischen Clientskripten.
- Klicke auf die ⊕ Schaltfläche, die rechts neben dem Namen des Containers erscheint, und füge eine BindableFunction Instanz ein.
- Benenne die Instanz in TestBindableFunction um.
Sobald du ein BindableFunction erstellt hast, kannst du dich in einem Skript mit dem OnInvoke Rückruf verbinden und dann die Rückruffunktion von einem anderen Skript aus Invoke().
Rückruf-Verbindung
local ServerScriptService = game:GetService("ServerScriptService")
-- Hole die Referenz zur bindbaren Funktion
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Rückruffunktion
local function addTwoNumbers(a, b)
return a + b
end
-- Setze die Funktion als Rückruf der bindbaren Funktion
bindableFunction.OnInvoke = addTwoNumbers
Event-Auslösunglocal ServerScriptService = game:GetService("ServerScriptService")-- Hole die Referenz zur bindbaren Funktionlocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Rufe die Rückruffunktion auf und gebe den zurückgegebenen Wert auslocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Argumenteinschränkungen
Wenn du ein BindableEvent auslöst oder eine BindableFunction aufrufst, werden alle Argumente weitergeleitet, die du mit dem Event oder an die Rückruffunktion übergibst. Du kannst jeden Typ von Roblox-Objekt (Enum, Instance usw.) sowie Luau-Typen wie Zahlen, Strings und Booleans übergeben, solltest jedoch die folgenden Einschränkungen sorgfältig berücksichtigen.
Nicht-String-Indizes
Wenn irgendwelche Indizes einer übergebenen Tabelle keine String-Typen sind, wie z. B. ein Instance, userdata oder Funktion, wandelt Roblox diese Indizes automatisch in Strings um.
Event-Verbindung
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
-- Verbinde Funktion mit Event
bindableEvent.Event:Connect(onEventFire)
Event-Auslösunglocal ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Fire Event mit einer Tabelle, die eine Workspace-Instanz als Schlüssel enthältbindableEvent:Fire({[workspace.Baseplate] = true})
Tabellenindizes
Wenn du eine Datentabelle übergibst, übergebe keine gemischte Tabelle mit numerischen und String-Schlüsseln. Dies kann dazu führen, dass Elemente während des Transfers entfernt werden. Stattdessen übergebe eine Tabelle, die ausschließlich aus Schlüssel-Wert-Paaren (einem Wörterbuch) oder ausschließlich aus numerischen Indizes (einem Array) besteht.
Event-Verbindung
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 Drachenbezwinger
--> CharClass = Rogue
end
end
-- Verbinde Funktion mit Event
bindableEvent.Event:Connect(onEventFire)
Event-Auslösunglocal ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Numerisch indizierte Tabellelocal inventoryData = {"Schwert", "Bogen"}-- Wörterbuch-Tabellelocal characterData = {CharName = "Diva Drachenbezwinger",CharClass = "Rogue"}-- Fire Event mit konsistent indizierten TabellenbindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Tabellenidentitäten
Tabellen, die als Argumente an bindbare Events und Rückruffunktionen übergeben werden, werden kopiert, was bedeutet, dass sie nicht genau gleichwertig sind wie die bei der Auslösung des Events oder beim Aufruf des Rückrufs bereitgestellten. Auch Tabellen, die an den Aufrufer zurückgegeben werden, sind nicht genau gleichwertig zu denen, die bereitgestellt wurden. Du kannst dies demonstrieren, indem du das folgende Skript auf einem BindableFunction ausführst und beobachtest, wie die Tabellenidentitäten unterschiedlich sind.
Rückruf-Verbindung
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Rückruffunktion
local function returnTable(passedTable)
-- Ausgabe der Tabellenidentität bei der Aktivierung
print(tostring(passedTable)) --> table: 0x48eb7aead27563d9
return passedTable
end
-- Setze die Funktion als Rückruf der bindbaren Funktion
bindableFunction.OnInvoke = returnTable
Event-Auslösunglocal ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Schwert", "Bogen"}-- Ausgabe der ursprünglichen Tabellenidentitätprint(tostring(inventoryData)) --> table: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Ausgabe der Tabellenidentität bei Rückgabeprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metatabellen
Wenn eine Tabelle eine Metatabelle hat, gehen alle Metainformationen in der Übertragung verloren. Im folgenden Codebeispiel ist die NumWheels Eigenschaft Teil der Car Metatabelle. Wenn der Server die folgende Tabelle erhält, hat die truck Tabelle die Name Eigenschaft, jedoch nicht die NumWheels Eigenschaft.
Event-Verbindung
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> {["Name"] = "MeinLastwagen"}
end
-- Verbinde Funktion mit Event
bindableEvent.Event:Connect(onEvent)
Event-Auslösunglocal ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MeinLastwagen"setmetatable(truck, Car)-- Fire Event mit einer Tabelle, die eine Metatabelle enthältbindableEvent:Fire(truck)