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 | >|
---|---|
Client | RemoteEvent:FireServer(args) |
Server | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Server → Client | |
Server | RemoteEvent:FireClient(player, args) |
Client | RemoteEvent.OnClientEvent:Connect(function(args)) |
Server → Alle Clients | |
Server | RemoteEvent:FireAllClients(args) |
Client | RemoteEvent.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:
- 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 .
- Klicken Sie auf die Schaltfläche ⊕ , die rechts vom Namen des Containers erscheint, und fügen Sie eine RemoteEvent Instanz ein.
- 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
Du kannst ein LocalScript verwenden, um ein Ereignis auf dem Server durch Aufrufen der Methode Class.RemoteEvent:FireServer()|FireServer() 2>
Client | RemoteEvent:FireServer(args) |
Server | RemoteEvent.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-Instanzlocal remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Feuere das Remote-Ereignis und übermittle weitere ArgumenteremoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
Server → Client
Du kannst ein Script verwenden,
Server | RemoteEvent:FireClient(player, args) |
Client | RemoteEvent.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
Server | RemoteEvent:FireAllClients(args) |
Client | RemoteEvent.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-Instanzlocal remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")local countdown = 5-- Feuere das RemoteEvent jede Sekunde ab, bis die Zeit abgelaufen istfor timeRemaining = -1, countdown doremoteEvent: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:
- 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 .
- Klicken Sie auf die ⊕ Schaltfläche, die rechts vom Namen des Containers erscheint, und fügen Sie eine RemoteFunction Instanz ein.
- 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
Sie können ein Class.LocalScript verwenden, um eine Funktion auf dem Server durch Aufrufen der Methode 0> Class.RemoteFunction:Execute
Client | RemoteFunction:InvokeServer(args) |
Server | RemoteFunction.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 Instanzlocal remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")-- Übergeben Sie eine Farbe und Position, wenn Sie den Callbackaufrufenlocal newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))-- Geben Sie die zurückgegebene Teil-Referenz ausprint("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 Tabellelocal inventoryData = {"Sword", "Bow"}-- Wörterbuch-Tabellelocal 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 ausprint(tostring(inventoryData)) --> tabelle: 0x059bcdbb2b576549local invokeReturn = remoteFunction:InvokeServer(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
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 = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- Feuer-Ereignis mit Tabelle, einschließlich einer MetatabelleremoteEvent: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 istlocal clientPart = Instance.new("Part")clientPart.Parent = workspaceremoteEvent:FireServer(clientPart)