Bindbare Ereignisse und Rückrufe

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

BindableEvent und BindableFunction objekte lassen sie verhaltensweisen zwischen skripten auf derselben seite des client-servers binden und kommunizieren ein bestimmtes gewünschtes ergebnis für in-experience-aktionen.

Der häufigste Anwendungsfall für bindbare Ereignisse ist für Erlebnisse mit einer rundenbasierten Struktur.Zum Beispiel könnten Sie ein "Match gestartet"-Ereignis haben, das anderen Skripten erlaubt, einen Timer zu starten und eine Rangliste anzuzeigen, mit einem entsprechenden "Match beendet"-Ereignis, das anderen Skripten mitteilt, wann Spieler in eine Lobby zurückverlegt werden sollen und die Gewinner angezeigt werden.

Da sie Aktivitäten zwischen Skripten koordinieren, werden bindbare Ereignisse in der Regel auf dem Server verwendet, aber du kannst sie auch auf dem Client verwenden.

Abhängig davon, wie dein Erlebnis funktioniert, können bindbare Ereignisse dazu beitragen, deinen Code modularer zu machen, aber Modulskripte sind oft eine bessere Alternative für Situationen, in denen du Daten zwischen Skripten teilen musst.Du kannst auch bindbare Ereignisse in Kombination mit Modulskripten für eine sauberere Syntax verwenden, wie in Benutzerdefinierte Ereignisse beschrieben.

Bindbare Ereignisse

Das BindableEvent Objekt ermöglicht benutzerdefinierte Ereignisse durch asynchrone, einseitige Kommunikation zwischen Skripten.

Wenn du eine BindableEvent durch die Fire()-Methode abfeuerst, erzeugt das Feuerskript keine **** und die Zielfunktion erhält die übergebenen Argumente mit bestimmten Einschränkungen.Wie alle Ereignisse erstellt BindableEvents Threads jeder verbundenen Funktion, so dass auch wenn ein Fehler auftreibt, andere fortfahren.

Um eine neue BindableEvent mit dem Explorer-Fenster in Studio zu erstellen:

  1. Bewegen Sie den Mauszeiger über den Container, in den Sie die BindableEvent einfügen möchten.Wir empfehlen, ServerScriptService für die Kommunikation zwischen Server-Skripten und ReplicatedStorage für die Kommunikation zwischen Client-Skripten zu verwenden.
  2. Klicken Sie auf die Schaltfläche , die rechts vom Namen des Containers erscheint, und fügen Sie eine BindableEvent Instanz ein.
  3. Benenne die Instanz auf TestBindableEvent um.

Nachdem du ein BindableEvent erstellt hast, verbinde eine Funktion mit ihrem Event Ereignis in einem Skript, das. PL: die Skriptsund dann Fire() das Ereignis aus einem anderen Skript, das. PL: die Skripts.

Veranstaltungsverbindung

local ServerScriptService = game:GetService("ServerScriptService")
-- Holen Sie sich eine Referenz zu einer bindbaren Instanz
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Verbinde anonyme Funktion mit Ereignis
bindableEvent.Event:Connect(function(data)
print(data) --> Runde gestartet!
end)
Ereignisfeuerung

local ServerScriptService = game:GetService("ServerScriptService")
-- Holen Sie sich eine Referenz zu einer bindbaren Instanz
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Feuer bindbares Ereignis
bindableEvent:Fire("Round started!")

Eigene Rückrufe

Das BindableFunction Objekt ermöglicht eine synchronisierte, zweispurige Kommunikation zwischen Skripten.Sie können es verwenden, um eine benutzerdefinierte Rückruffunktion zu definieren und sie manuell aufzurufen, indem Sie BindableFunction:Invoke() anrufen.Der Code, der die Funktion aufruft , gibt bis zum Auffinden des entsprechenden Rückrufs aus, und der Rückruf erhält die Argumente, die du an Invoke() übergeben hast.Wenn der Rückruf nie festlegenwurde, ruft das Skript, das ihn aufruft, die Ausführung nicht wieder auf.

Um eine neue BindableFunction mit dem Explorer-Fenster in Studio zu erstellen:

  1. Bewegen Sie den Mauszeiger über den Container, in den Sie die BindableFunction einfügen möchten.Wir empfehlen, ServerScriptService für die Kommunikation zwischen Server-Skripten und ReplicatedStorage für die Kommunikation zwischen Client-Skripten zu verwenden.
  2. Klicken Sie auf die Schaltfläche , die rechts vom Namen des Containers erscheint, und fügen Sie eine BindableFunction Instanz ein.
  3. Benenne die Instanz auf TestBindableFunction um.

Sobald du ein BindableFunction erstellt hast, kannst du dich mit seiner OnInvoke Rückruffunktion in einem Skript, das. PL: die Skriptsverbinden, dann Invoke() die Rückruffunktion aus einem anderen Skript, das. PL: die Skripts.

Rückrufverbindung

local ServerScriptService = game:GetService("ServerScriptService")
-- Holen Sie sich die Referenz für bindbare Funktion
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Rückruffunktion
local function addTwoNumbers(a, b)
return a + b
end
-- Funktion als Callbackder bindbaren Funktion festlegen
bindableFunction.OnInvoke = addTwoNumbers
Ereignis-Aufruf

local ServerScriptService = game:GetService("ServerScriptService")
-- Holen Sie sich die Referenz für bindbare Funktion
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Rufen Sie die Rückruffunktion auf und geben Sie den zurückgegebenen Wert aus
local sum = bindableFunction:Invoke(2, 4)
print(sum) --> 6

Argumentbeschränkungen

Wenn du ein BindableEvent abfeuerst oder eine BindableFunction aufrufst, leitet es alle Argumente weiter, die du mit dem Ereignis oder der Rückruffunktion übermittelst.Du kannst jede Art von Roblox-Objekt ( Enum , Instance , etc.) sowie Luau-Typen wie Zahlen, Zeichen und Boolesche übergeben, obwohl du die folgenden Einschränkungen sorgfältig berücksichtigen solltest.

Nicht-Zeichen-Indizes

Wenn irgendeine Indizes eines übergebenen Tabellen nicht string sind, wie z. B. ein Instance, Benutzerdaten oder Funktion, konvertiert Roblox diese Indizes automatisch in Zeichenketten.

Veranstaltungsverbindung

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
-- Funktion zum Verbinden mit Ereignis
bindableEvent.Event:Connect(onEventFire)
Ereignisfeuerung

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Feuerereignis mit Tabelle, die eine Arbeitsplatzinstanz als Schlüssel enthält
bindableEvent:Fire({
[workspace.Baseplate] = true
})

Tabelleindeksierung

Wenn du eine Tabelle mit Daten durchläufst, sende keine gemischte Tabelle mit numerischen und Zeichenketten-Schlüsseln.Stattdessen geben Sie eine Tabelle ein, die ausschließlich aus Schlüssel-Wert-Paaren besteht (ein Wörterbuch) oder ganz aus numerischen Indizes (eine Array).

Veranstaltungsverbindung

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-Drachenschlächter
--> CharClass = Übeltäter
end
end
-- Funktion zum Verbinden mit Ereignis
bindableEvent.Event:Connect(onEventFire)
Ereignisfeuerung

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Zahlweise indexierte Tabelle
local inventoryData = {
"Sword", "Bow"
}
-- Wörterbuch-Tabelle
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Feuerereignis mit konsistent indexierten Tabellen
bindableEvent:Fire(inventoryData)
bindableEvent:Fire(characterData)

Tisch-Identitäten

Tabellen, die als Argumente an verbindbare Ereignisse und Rückrufe übergeben werden, werden kopiert, was bedeutet, dass sie nicht genau gleich sind zu denen, die bereitgestellt werden, wenn das Ereignis abgefeuert oder der Callbackausgelöst wird.Tabellen, die an den Invoker zurückgegeben werden, entsprechen auch nicht genau denen, die bereitgestellt wurden.Du kannst dies durch Ausführen des folgenden Skripts auf einem BindableFunction und Beobachten, wie sich die Tabellenidentitäten unterscheiden, demonstrieren.

Rückrufverbindung

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Rückruffunktion
local function returnTable(passedTable)
-- Ausgabetabellen-Identität bei Aufruf
print(tostring(passedTable)) --> tabelle: 0x48eb7aead27563d9
return passedTable
end
-- Funktion als Callbackder bindbaren Funktion festlegen
bindableFunction.OnInvoke = returnTable
Ereignis-Aufruf

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
local inventoryData = {
"Sword", "Bow"
}
-- Ausgabe der ursprünglichen Tabellen-ID
print(tostring(inventoryData)) --> tabelle: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Ausgabetabellen-Identität bei zurückgeben
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9

Metatabellen

Wenn ein Tisch ein Metatable hat, geht bei der Übertragung alle Metatable-Informationen verloren.Im folgenden Codebeispiel ist das Eigenschaft NumWheels Teil des Car messbaren.Wenn der Server die folgende Tabelle erhält, hat die Tabelle die Eigenschaft aber nicht die Eigenschaften.

Veranstaltungsverbindung

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Name"] = "MyTruck"]}
end
-- Funktion zum Verbinden mit Ereignis
bindableEvent.Event:Connect(onEvent)
Ereignisfeuerung

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)
-- Feuerevent mit Tabelle einschließlich eines Metatables
bindableEvent:Fire(truck)