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

  1. 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.
  2. Klicken Sie auf die Schaltfläche, die rechts vom Namen des Containers erscheint, und fügen Sie eine BindableEvent Instanz ein.
  3. 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-Instanz
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Feuerbare Ereignis
bindableEvent: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:

  1. 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.
  2. Klicken Sie auf die Schaltfläche, die rechts vom Namen des Containers erscheint, und fügen Sie eine BindableFunction Instanz ein.
  3. 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 Funktion
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Rufe die Rückruffunktion auf und geben Sie den zurückgegebenen Wert aus
local 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 ist
bindableEvent: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 Tabelle
local inventoryData = {
"Sword", "Bow"
}
-- Wörterbuch-Tabelle
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Feuer-Ereignis mit konstanten Tabellen
bindableEvent: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 aus
print(tostring(inventoryData)) --> tabelle: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Ausgabe-Tabelle-Identität bei zurückgeben
print(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 = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- Feuer-Ereignis mit Tabelle, einschließlich einer Metatabelle
bindableEvent:Fire(truck)