Remote-Ereignisse und Rückrufe

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

Roblox-Erlebnisse sind standardmäßig multijährig, so dass alle Erlebnisse im Grunde zwischen dem Server und den verbundenen Clients kommunizieren. Im Einfachsten-Fall, wenn Spieler ihre Charaktere bewegen, werden bestimmte Humanoid -Eigenschaften, wie Zustände, an den Server weitergegeben, was diese Information an andere verbundene Clients weitergibt.

Remote-Ereignisse und -Rückrufe ermöglichen es Ihnen, über die Client-Server-Grenze zu kommunizieren:

  • RemoteEvents aktivieren eine einseitige Kommunikation (Senden einer Anfrage und nicht Ausgabe für eine Antwort).
  • UnreliableRemoteEvents aktivieren eine einseitige Kommunikation für Daten, die sich kontinuierlich ändern oder nicht kritisch für den Spielzustand sind. Diese Ereignisse tauschen Ordnung und Zuverlässigkeit für verbesserte Erfüllung.
  • RemoteFunctions aktivieren die zweispurige Kommunikation (Senden einer Anfrage und Ausgabe, bis eine Antwort vom Empfänger erhalten wird).

Anders als Bindbare Ereignisse, die eine umfassendere Nutzung haben, sind die Anwendungsfälle für Remote-Ereignisse und -Funktionen zu zählen:

  • Spielplay - Grundlegendes Gameplay, wie ein Spieler das Ende eines Stufeerreicht, kann ein Remote-Ereignis erfordern. Ein Client-Skript benachrichtigt den Server und Server-Skripte resetten die Position des Spieler:in.
  • Server-Verifizierung - Wenn ein Spieler versucht, einen Trank zu trinken, hat er tatsächlich diesen Trank? Um die Fairness zu gewährleisten, muss der Server die Quelle der Wahrheit für ein Erlebnis sein. Ein Client-Skript kann ein Remote-Ereignis verwenden, um den Server zu benachrichtigen, dass der Spieler einen Trank trinkt, und dann können Server-Skripte entscheiden, ob der Spieler tatsächlich diesen Trank
  • Benutzeroberfläche-Updates - Wenn der Spielzustand sich ändert, können Server-Skripte Remote-Ereignisse verwenden, um Clients über Änderungen an Ergebnissen, Zielen usw. zu informieren.
  • In-experience Marketplace-Käufe - Für eine Beispielanwendung, die Remote-Funktionen verwendet, siehe Prompting Subscription Purchases.

Schnellere Referenz

Die folgenden Tabellen dienen als schnelle Referenz darüber, wie man RemoteEvents und RemoteFunctions verwendet, um zwischen dem Client und dem Server zu kommunizieren.

>
Client → Server
ClientRemoteEvent:FireServer(args)
ServerRemoteEvent.OnServerEvent:Connect(function(player, args))
Server → Client
ServerRemoteEvent:FireClient(player, args)
ClientRemoteEvent.OnClientEvent:Connect(function(args))
Server → Alle Clients
ServerRemoteEvent:FireAllClients(args)
ClientRemoteEvent.OnClientEvent:Connect(function(args))

Remote-Ereignisse

Ein RemoteEvent-Objekt erleichtert die asynchronen, eine-Weg-Kommunikation über die Client-Server-Grenze, ohne für eine Antwort zu liefern.

Um ein neues RemoteEvent über das Explorer-Fenster in Studio zu erstellen:

  1. Bewegen Sie den Mauszeiger über den Container, in den Sie das RemoteEvent einfügen möchten. Um sicherzustellen, dass sowohl der Server als auch der Client auf ihn zugreifen können, muss er in einem Ort sein, an dem beide Seiten ihn sehen können, wie z. B. in ReplicatedStorage oder in einem Workspace .
  2. Klicken Sie auf die Schaltfläche , die rechts vom Namen des Containers erscheint, und fügen Sie eine RemoteEvent Instanz ein.
  3. Benennen Sie die Instanz, um den Zweck zu beschreiben.

Sobald du ein RemoteEvent erstellt hast, kann es eine einseitige Kommunikation von Client zu Server , von Server zu Client oder von dem 1>Server zu allen Clients1> ermöglichen.

Client → Server
Server → Client
Server → Alle Clients

Client → Server

Du kannst ein LocalScript verwenden, um ein Ereignis auf dem Server durch Aufrufen der Methode Class.RemoteEvent:FireServer()|FireServer() 2>

ClientRemoteEvent:FireServer(args)
ServerRemoteEvent.OnServerEvent:Connect(function(player, args))

Der folgende Script verbindet einen Ereignishändler mit OnServerEvent, der einen neuen Class.Part</

Ereignisverbindung - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Erhalte die Referenz auf die Remote-Ereignis-Instanz
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onCreatePart(player, partColor, partPosition)
print(player.Name .. " fired the RemoteEvent")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = workspace
end
-- Verbindungsfunktion mit Ereignis
remoteEvent.OnServerEvent:Connect(onCreatePart)
Ereignisbehandlung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Erhalte die Referenz auf die Remote-Ereignis-Instanz
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Feuere das Remote-Ereignis und übermittle weitere Argumente
remoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))

Server → Client

Du kannst ein Script verwenden,

ServerRemoteEvent:FireClient(player, args)
ClientRemoteEvent.OnClientEvent:Connect(function(args))

Der folgende LocalScript verbindet einen Ereignishändler mit dem OnClientEvent -Ereignis. Der darauf folgende Script hört dann auf eindringende Spieler auf dem Server und ruft dann 1> Class.RemoteEvent:FireClient()|FireClient()1> für jeden mit zufälligen Daten an.

Ereignisverbindung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Erhalte die Referenz auf die Remote-Ereignis-Instanz
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local player = Players.LocalPlayer
local function onNotifyPlayer(maxPlayers, respawnTime)
print("[Client] Event received by player", player.Name)
print(maxPlayers, respawnTime)
end
-- Verbindungsfunktion mit Ereignis
remoteEvent.OnClientEvent:Connect(onNotifyPlayer)
Ereignis-Auslösen - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Erhalte die Referenz auf die Remote-Ereignis-Instanz
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Hören Sie auf eindrückende Spieler und senden Sie ein Remote-Ereignis an jeden
local function onPlayerAdded(player)
print("[Server] Firing event to player", player.Name)
remoteEvent:FireClient(player, Players.MaxPlayers, Players.RespawnTime)
end
Players.PlayerAdded:Connect(onPlayerAdded)

Server → Alle Clients

Sie können ein Script verwenden, um ein Ereignis auf allen Clients auszulösen, indem Sie die Methode Class.RemoteEvent:FireAllClients()|FireAllClients() auf einem

ServerRemoteEvent:FireAllClients(args)
ClientRemoteEvent.OnClientEvent:Connect(function(args))

Das folgende LocalScript verbindet einen Ereignishändler mit dem OnClientEvent -Ereignis, das eine verbleibende Countdown-Zeit ausgibt. Das zugehörige Script ruft dann jede Sekunde 1> Class.RemoteEvent:Fire

Ereignisverbindung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Erhalte die Referenz auf die Remote-Ereignis-Instanz
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onTimerUpdate(seconds)
print(seconds)
end
-- Verbindungsfunktion mit Ereignis
remoteEvent.OnClientEvent:Connect(onTimerUpdate)
Ereignis-Auslösen - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Erhalte die Referenz auf die Remote-Ereignis-Instanz
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local countdown = 5
-- Feuere das RemoteEvent jede Sekunde ab, bis die Zeit abgelaufen ist
for timeRemaining = -1, countdown do
remoteEvent:FireAllClients(countdown - timeRemaining)
task.wait(1)
end

Fern-Rückrufe

Ein RemoteFunction-Objekt erleichtert die synchronische Zwei-Weg-Kommunikation über die Client-Server-Grenze. Der Sender einer Remote-Funktion wird bis zum Erhalt einer Antwort vom Empfänger produzieren.

Um einen neuen RemoteFunction über das Explorer-Fenster in Studio zu erstellen:

  1. Bewegen Sie den Mauszeiger über den Container, in den Sie das RemoteFunction einfügen möchten. Um sicherzustellen, dass sowohl der Server als auch der Client auf ihn zugreifen können, muss er in einem Ort sein, an dem beide Seiten ihn sehen können, wie z. B. in ReplicatedStorage oder in einem Workspace .
  2. Klicken Sie auf die Schaltfläche, die rechts vom Namen des Containers erscheint, und fügen Sie eine RemoteFunction Instanz ein.
  3. Benennen Sie die Instanz, um den Zweck zu beschreiben.

Sobald du einen RemoteFunction erstellt hast, kann er die Zwei-Weg-Kommunikation zwischen Client und Server oder zwischen Server und Client erleichtern.

Client → Server → Client
Server → Client → Server

Client → Server → Client

Sie können ein Class.LocalScript verwenden, um eine Funktion auf dem Server durch Aufrufen der Methode 0> Class.RemoteFunction:Execute

ClientRemoteFunction:InvokeServer(args)
ServerRemoteFunction.OnServerInvoke = function(player, args)

Die folgenden Script definiert die Rückruffunktion über OnServerInvoke und gibt die angeforderten Part durch ihren 1> zurückgeben1> Wert zurück. Der folgende 4> Class.LocalScript4> ruft dann 7> Class.

Rückruf-Verbindung - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Erhalte die Referenz auf die Instanz
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Rückruf-Funktion
local function createPart(player, partColor, partPosition)
print(player.Name .. " requested a new part")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = workspace
return newPart
end
-- Setze die Funktion als Callbackeiner Remote-Funktion
remoteFunction.OnServerInvoke = createPart
Ereigniseinladung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Erhalte die Referenz auf die Instanz
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Übergeben Sie eine Farbe und Position, wenn Sie den Callbackaufrufen
local newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
-- Geben Sie die zurückgegebene Teil-Referenz aus
print("The server created the requested part:", newPart)

Server → Client → Server

Sie können eine Script verwenden, um eine Funktion auf dem Client zu aufzurufen, indem Sie die Methode Class.RemoteFunction:ExecuteClient()|ExecuteClient() auf einem Class.RemoteFunction aufrufen, aber es hat ernste Risiken, wie folgt:

  • Wenn der Client einen Fehler gewährt, dann throwt der Server auch einen Fehler.
  • Wenn der Client abbricht, während er ausgeführt wird, InvokeClient() gibt einen Fehler an.
  • Wenn der Client keine Werte zurückgibt, gibt der Server für immer zurück.

Für Aktionen, die keine zweispurige Kommunikation erfordern, wie das Aktualisieren einer grafische Benutzeroberfläche, verwenden Sie ein RemoteEvent und kommunizieren Sie von Server zu Client.

Argument-Einschränkungen

Wenn Sie ein RemoteEvent feuern oder eine RemoteFunction aufrufen, werden alle Argumente weitergegeben, die Sie mit dem Ereignis oder der Rückruffunktion übergeben. Jeder Arten von Roblox-Objekten, wie z. B. ein Enum, 1> Class.Instance1> oder

Nicht-String-Indizes

Wenn einige Indizes eines bestimmten Tables nicht-string-Typen wie ein Instance , Benutzerdaten oder 1> Funktion1> sind, konvertiert Roblox diese Indizes automatisch in Strings.

Ereignisverbindung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> string
end
end
-- Verbindungsfunktion mit Ereignis
remoteEvent.OnClientEvent:Connect(onEventFire)
Ereignis-Auslösen - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Hören Sie auf eindrückende Spieler und senden Sie ein Remote-Ereignis an jeden
local function onPlayerAdded(player)
remoteEvent:FireClient(player,
{
[workspace.Baseplate] = true
}
)
end
Players.PlayerAdded:Connect(onPlayerAdded)

Abgelaufene Funktionen

Funktionen, die als Argumente für ein RemoteEvent oder RemoteFunction aufgeführt werden, werden nicht auf der Client-Server -Grenze repliziert, so dass es unmöglich ist, Funktionen Remote zu übermitteln. Stattdessen wird das resultierende Argument auf der Empfängerseite 1> nil1> sein.

Ereignisverbindung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onClientEvent(func)
print(func) --> null
end
remoteEvent.OnClientEvent:Connect(onClientEvent)
Ereignis-Auslösen - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function testFunction()
print("Hello world!")
end
-- Fire-Remote-Ereignis mit Funktion als Argument
remoteEvent:FireAllClients(testFunction)

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 (Dictionnaire) oder vollständig ist vollständig von numerischen Indizes.

Ereignisverbindung - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEventFire(player, passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = Schwert
--> 2 = Bogen
--> CharName = Diva-Drachenspieler
--> CharClass = Streuner
end
end
-- Verbindungsfunktion mit Ereignis
remoteEvent.OnServerEvent:Connect(onEventFire)
Ereignisbehandlung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Zahlen索ierte Tabelle
local inventoryData = {
"Sword", "Bow"
}
-- Wörterbuch-Tabelle
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
remoteEvent:FireServer(inventoryData)
remoteEvent:FireServer(characterData)

Tabelle Identitäten

Tabellen, die als Argumente für entfernte Ereignisse/Callbacks übergeben werden, werden kopiert, was bedeutet, dass sie nicht genau gleich sind, wie sie bei der Ausführung des Ereignisses oder beim Aufrufen des Callbacks bereitgestellt werden. Tabellen, die dem Invoker zurückgegeben werden, sind nicht genau gleich, wie sie bereitgestellt werden. Sie können dies durch Ausführung des folgenden Skripts auf einem RemoteFunction zeigen.

Rückruf-Verbindung - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Rückruf-Funktion
local function returnTable(player, passedTable)
-- Ausgabe-Tabelle-Identität bei der Invocation
print(tostring(passedTable)) --> tabelle: 0x48eb7aead27563d9
return passedTable
end
-- Setze die Funktion als Callbackeiner Remote-Funktion
remoteFunction.OnServerInvoke = returnTable
Ereigniseinladung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
local inventoryData = {
"Sword", "Bow"
}
-- Geben Sie die ursprüngliche TabelleIdentität aus
print(tostring(inventoryData)) --> tabelle: 0x059bcdbb2b576549
local invokeReturn = remoteFunction:InvokeServer(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

Ereignisverbindung - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> { ["Name"] = "MyTruck"
end
-- Verbindungsfunktion mit Ereignis
remoteEvent.OnServerEvent:Connect(onEvent)
Ereignisbehandlung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local Car = {}
Car.NumWheels = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- Feuer-Ereignis mit Tabelle, einschließlich einer Metatabelle
remoteEvent:FireServer(truck)

Nicht replizierte Instanzen

Wenn ein RemoteEvent oder RemoteFunction einen Wert zurückgibt, der nur dem Sender sichtbar ist, repliziert Roblox ihn nicht über die Client-Server-Grenze und übergibt stattdessen nil anstelle

Ereignis-Auslösen - Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Wird als "Nil" empfangen, da der Client auf ServerStorage nicht zugreifen kann
local storedPart = Instance.new("Part")
storedPart.Parent = ServerStorage
local function onPlayerAdded(player)
remoteEvent:FireClient(player, storedPart)
end
Players.PlayerAdded:Connect(onPlayerAdded)

Ebenso, wenn du ein Teil in einem LocalScript erstellst und versuchst, es an einen Script zu übergeben, wird der Server nil sehen, da das Teil nicht für den Server replizierbar ist.

Ereignisbehandlung - LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Wird als "Nil" erhalten, da der Server nicht über diesen Teil informiert ist
local clientPart = Instance.new("Part")
clientPart.Parent = workspace
remoteEvent:FireServer(clientPart)