Roblox-Spiele sind standardmäßig Mehrspieler, sodass alle Spiele von Natur aus zwischen dem Server und den verbundenen Clients der Spieler kommunizieren. Im einfachsten Fall, wenn sich die Spielercharaktere bewegen, werden bestimmte Humanoid-Eigenschaften, wie Zustände, an den Server übermittelt, der diese Informationen an andere verbundene Clients weitergibt.
Remote-Events und Rückrufe ermöglichen es Ihnen, über die Client-Server-Grenze zu kommunizieren:
- RemoteEvents ermöglichen eine einseitige Kommunikation (eine Anfrage senden und nicht auf eine Antwort warten).
- UnreliableRemoteEvents ermöglichen eine einseitige Kommunikation für Daten, die sich kontinuierlich ändern oder nicht kritisch für den Zustand des Spiels sind. Diese Ereignisse tauschen Reihenfolge und Zuverlässigkeit gegen verbesserte Netzwerkleistung.
- RemoteFunctions ermöglichen eine zweiseitige Kommunikation (eine Anfrage senden und warten, bis eine Antwort vom Empfänger empfangen wird).
Im Gegensatz zu bindbaren Ereignissen, die eine eingeschränktere Nützlichkeit haben, sind die Anwendungsfälle für Remote-Events und -Funktionen zu zahlreich, um sie aufzulisten:
- Gameplay - Grundlegendes Gameplay, wie ein Spieler, der das Ende eines Levels erreicht, kann ein Remote-Event erfordern. Ein Client-Skript benachrichtigt den Server, und Server-Skripte setzen die Position des Spielers zurück.
- Serververifizierung - Wenn ein Spieler versucht, einen Trank zu trinken, hat er diesen Trank tatsächlich? Um Fairness zu gewährleisten, muss der Server die Quelle der Wahrheit für ein Spiel sein. Ein Client-Skript kann ein Remote-Event 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 hat und ob ihm irgendwelche Vorteile gewährt werden.
- Benutzeroberflächenaktualisierungen - Wenn sich der Zustand des Spiels ändert, können Server-Skripte Remote-Events verwenden, um Clients über Änderungen an Punktzahlen, Zielen usw. zu benachrichtigen.
- In-Game-Marktplatzkäufe - Für ein Beispielimplementierung, die Remote-Funktionen verwendet, siehe Aufforderung zu Abonnements.
Schnellreferenz
Die folgenden Tabellen dienen als Schnellreferenz dafür, wie RemoteEvents und RemoteFunctions verwendet werden, um zwischen Client und 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-Events
Ein RemoteEvent-Objekt ermöglicht asynchrone, einseitige Kommunikation über die Client-Server-Grenze, ohne auf eine Antwort zu warten.
Um ein neues RemoteEvent über das Explorer-Fenster in Studio zu erstellen:
- Fahren Sie mit der Maus über den Container, in den Sie das RemoteEvent einfügen möchten. Um sicherzustellen, dass sowohl Server als auch Client darauf zugreifen können, muss es an einem Ort sein, den beide Seiten sehen können, wie ReplicatedStorage, obwohl es in einigen Fällen angemessen ist, es in Workspace oder innerhalb eines Tool zu speichern.
- Klicken Sie auf die Schaltfläche ⊕, die rechts neben dem Namen des Containers erscheint, und fügen Sie eine RemoteEvent-Instanz ein.
- Benennen Sie die Instanz um, um ihren Zweck zu beschreiben.
Sobald Sie ein RemoteEvent erstellt haben, kann es eine einseitige Kommunikation von Client zu Server, von Server zu Client oder von Server zu allen Clients ermöglichen.



Client → Server
Sie können ein LocalScript verwenden, um ein Ereignis auf dem Server auszulösen, indem Sie die Methode FireServer() auf einem RemoteEvent aufrufen. Wenn Sie Argumente an FireServer() übergeben, werden diese mit bestimmten Einschränkungen an den Ereignishandler auf dem Server übergeben. Beachten Sie, dass der erste Parameter des Ereignishandlers auf dem Server immer das Player-Objekt des Clients ist, der ihn aufruft, und zusätzliche Parameter folgen.
| Client | RemoteEvent:FireServer(args) |
| Server | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Das folgende Script verbindet einen Ereignishandler mit OnServerEvent, der ein neues Part auf dem Server erstellt. Das begleitende LocalScript ruft dann FireServer() auf der RemoteEvent-Instanz mit der gewünschten Color und Position für das Teil auf.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
-- Referenz auf die Remote-Event-Instanz erhalten
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onCreatePart(player, partColor, partPosition)
print(player.Name .. " hat das RemoteEvent ausgelöst")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
end
-- Funktion mit Ereignis verbinden
remoteEvent.OnServerEvent:Connect(onCreatePart)local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Referenz auf die Remote-Event-Instanz erhalten
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Remote-Event auslösen und zusätzliche Argumente übergeben
remoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))Server → Client
Sie können ein Script verwenden, um ein Ereignis auf einem Client auszulösen, indem Sie die Methode FireClient() auf einem RemoteEvent aufrufen. Das erste Argument für FireClient() ist das Player-Objekt des Clients, der auf das Ereignis reagieren soll, und zusätzliche Argumente werden mit bestimmten Einschränkungen an den Client übergeben. Beachten Sie, dass der Ereignishandler das Player-Objekt nicht als erstes Argument einbeziehen muss, da Sie den Spieler auf dem Client mit Players.LocalPlayer bestimmen können.
| Server | RemoteEvent:FireClient(player, args) |
| Client | RemoteEvent.OnClientEvent:Connect(function(args)) |
Das folgende LocalScript verbindet einen Ereignishandler mit dem OnClientEvent-Ereignis. Das begleitende Script hört dann auf eingehende Spieler auf dem Server und ruft FireClient() für jeden mit beliebigen Daten auf.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Referenz auf die Remote-Event-Instanz erhalten
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local player = Players.LocalPlayer
local function onNotifyPlayer(maxPlayers, respawnTime)
print("[Client] Ereignis wurde von Spieler", player.Name, "empfangen")
print(maxPlayers, respawnTime)
end
-- Funktion mit Ereignis verbinden
remoteEvent.OnClientEvent:Connect(onNotifyPlayer)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Referenz auf die Remote-Event-Instanz erhalten
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Auf eingehende Spieler hören und Remote-Event an jeden dispatchen
local function onPlayerAdded(player)
print("[Server] Ereignis an Spieler", player.Name, "ausgelöst")
remoteEvent:FireClient(player, Players.MaxPlayers, Players.RespawnTime)
end
Players.PlayerAdded:Connect(onPlayerAdded)Server → Alle Clients
Sie können ein Script verwenden, um ein Ereignis an alle Clients auszulösen, indem Sie die Methode FireAllClients() auf einem RemoteEvent aufrufen. Im Gegensatz zu FireClient() erfordert die Methode FireAllClients() kein Player-Objekt, da sie das RemoteEvent an alle Clients auslöst.
| Server | RemoteEvent:FireAllClients(args) |
| Client | RemoteEvent.OnClientEvent:Connect(function(args)) |
Das folgende LocalScript verbindet einen Ereignishandler mit dem OnClientEvent-Ereignis, das eine verbleibende Countdown-Zeit ausgibt. Das begleitende Script ruft dann FireAllClients() in einer Schleife jede Sekunde auf, um das RemoteEvent für alle Clients auszulösen.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Referenz auf die Remote-Event-Instanz erhalten
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onTimerUpdate(seconds)
print(seconds)
end
-- Funktion mit Ereignis verbinden
remoteEvent.OnClientEvent:Connect(onTimerUpdate)local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Referenz auf die Remote-Event-Instanz erhalten
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local countdown = 5
-- Das RemoteEvent jede Sekunde auslösen, bis die Zeit abläuft
for timeRemaining = -1, countdown do
remoteEvent:FireAllClients(countdown - timeRemaining)
task.wait(1)
endRemote-Rückrufe
Ein RemoteFunction-Objekt ermöglicht synchrone, zweiseitige Kommunikation über die Client-Server-Grenze. Der Absender einer Remote-Funktion wartet, bis er eine Antwort vom Empfänger erhält.
Um ein neues RemoteFunction über das Explorer-Fenster in Studio zu erstellen:
- Fahren Sie mit der Maus über den Container, in den Sie das RemoteFunction einfügen möchten. Um sicherzustellen, dass sowohl Server als auch Client darauf zugreifen können, muss es an einem Ort sein, den beide Seiten sehen können, wie ReplicatedStorage, obwohl es in einigen Fällen angemessen ist, es in Workspace oder innerhalb eines Tool zu speichern.
- Klicken Sie auf die Schaltfläche ⊕, die rechts neben dem Namen des Containers erscheint, und fügen Sie eine RemoteFunction-Instanz ein.
- Benennen Sie die Instanz um, um ihren Zweck zu beschreiben.
Sobald Sie ein RemoteFunction erstellt haben, kann es eine zweiseitige Kommunikation zwischen Client und Server oder zwischen Server und Client ermöglichen.


Client → Server → Client
Sie können ein LocalScript verwenden, um eine Funktion auf dem Server aufzurufen, indem Sie die Methode InvokeServer() auf einem RemoteFunction aufrufen. Im Gegensatz zu einem Remote-Event wartet das LocalScript, das die RemoteFunction aufruft, bis der Rückruf zurückkehrt. Argumente, die Sie an InvokeServer() übergeben, werden mit bestimmten Einschränkungen an den Rückruf von OnServerInvoke der RemoteFunction übergeben. Beachten Sie, dass, wenn Sie mehrere Rückrufe für dieselbe RemoteFunction definieren, nur die letzte Definition ausgeführt wird.
| Client | RemoteFunction:InvokeServer(args) |
| Server | RemoteFunction.OnServerInvoke = function(player, args) |
Das folgende Script definiert die Rückruffunktion über OnServerInvoke und gibt das angeforderte Part über seinen Rückgabewert zurück. Das begleitende LocalScript ruft dann InvokeServer() mit zusätzlichen Argumenten auf, die die angeforderte Teilfarbe und -position definieren.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
-- Referenz auf die Remote-Function-Instanz erhalten
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Rückruffunktion
local function createPart(player, partColor, partPosition)
print(player.Name .. " hat ein neues Teil angefordert")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
return newPart
end
-- Funktion als Rückruf der Remote-Funktion festlegen
remoteFunction.OnServerInvoke = createPartlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Referenz auf die Remote-Function-Instanz erhalten
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Eine Farbe und Position beim Aufrufen des Rückrufs übergeben
local newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
-- Den zurückgegebenen Teilverweis ausgeben
print("Der Server hat das angeforderte Teil erstellt:", newPart)Server → Client → Server
Sie können ein Script verwenden, um eine Funktion auf dem Client aufzurufen, indem Sie die Methode InvokeClient() auf einem RemoteFunction aufrufen, aber es gibt ernsthafte Risiken, wie folgt:
- Wenn der Client einen Fehler auslöst, löst der Server ebenfalls den Fehler aus.
- Wenn der Client während des Aufrufs getrennt wird, löst InvokeClient() einen Fehler aus.
- Wenn der Client keinen Wert zurückgibt, wartet der Server für immer.
Für Aktionen, die keine zweiseitige Kommunikation erfordern, wie das Aktualisieren einer GUI, verwenden Sie ein RemoteEvent und kommunizieren von Server zu Client.
Liefergarantien
Jeder Remote-Typ gibt unterschiedliche Versprechen darüber ab, ob eine Nachricht ankommt und in welcher Reihenfolge. Diese Versprechen gelten nur für eine einzelne Verbindung in eine Richtung, d.h. vom Server zu einem bestimmten Client oder von einem bestimmten Client zum Server.
RemoteEvents
RemoteEvents sind zuverlässig und geordnet:
- Wenn eine Nachricht während des Transports verloren geht, überträgt Roblox sie erneut, bis sie ankommt, solange der Empfänger verbunden bleibt.
- Nachrichten kommen in der Reihenfolge an, in der Sie sie auslösen, einschließlich über verschiedene RemoteEvent-Instanzen. Wenn der Server beispielsweise das Ereignis A auslöst, dann B, dann A erneut an denselben Client, erhält dieser Client A, B, A. Dies gilt unabhängig davon, ob Sie FireClient() oder FireAllClients() verwenden.
- Wenn ein Client Ereignisse schneller auslöst als das Drosselungs-Limit, verarbeitet der Server die überschüssigen Ereignisse später, anstatt sie zu verwerfen, und sie behalten ihre Reihenfolge.
Eine zuverlässige, geordnete Nachricht kann dennoch in den folgenden Fällen nicht Ihren Code erreichen:
- Kein Handler ist verbunden. Wenn nichts mit OnServerEvent oder OnClientEvent verbunden ist, wenn eine Nachricht ankommt, stellt Roblox sie in die Warteschlange und liefert sie in der Reihenfolge aus, sobald ein Handler verbunden ist. Die Warteschlange ist sowohl in der Anzahl als auch im Speicher begrenzt. Sobald sie voll ist, verwirft Roblox weitere Nachrichten und protokolliert einen Remote event invocation-Fehler im Output-Fenster.
- Der Empfänger trennt sich. Nachrichten, die nicht geliefert wurden, wenn ein Client das Spiel verlässt, gehen verloren.
Die Reihenfolge bezieht sich darauf, wann jeder Handler beginnt, nicht wann er fertig ist. Wenn ein Handler wartet, z.B. durch Aufruf von task.wait() oder WaitForChild(), kann Roblox mit der Verarbeitung der nächsten Nachricht beginnen, bevor der frühere Handler fortfährt.
RemoteFunctions
RemoteFunctions senden Aufrufe und Antworten zuverlässig, sodass Roblox verlorene Nachrichten erneut überträgt, solange beide Seiten verbunden bleiben. Da InvokeServer() und InvokeClient() warten, bis eine Antwort ankommt, kann ein einzelner Thread nicht mehr als einen Aufruf gleichzeitig haben. Separate Threads können jedoch gleichzeitig aufrufen, und wenn ein Rückruf wartet, können Antworten in einer anderen Reihenfolge zurückkommen, als die Aufrufe gesendet wurden.
Wenn kein Rückruf zu OnServerInvoke oder OnClientInvoke zugewiesen ist, stellt Roblox die Aufrufe in die Warteschlange, bis einer vorhanden ist. Diese Warteschlange hat die gleichen Arten von Einschränkungen wie die RemoteEvent-Warteschlange.
UnreliableRemoteEvents
UnreliableRemoteEvents garantieren weder die Lieferung noch die Reihenfolge. Sie haben auch keine Reihenfolgenbeziehung zu RemoteEvents oder RemoteFunctions. Roblox kann eine Nachricht in einem der folgenden Fälle verwerfen, ohne sie erneut zu senden:
- Die Nachricht geht während des Transports verloren.
- Das Netzwerk ist überlastet und die Nachricht wartet zu lange auf den Versand.
- Die Nutzlast ist größer als 1.000 Bytes.
- Der Client löst schneller aus als das Drosselungs-Limit. Im Gegensatz zu einem RemoteEvent verwirft der Server die überschüssigen Nachrichten, anstatt sie zu verzögern.
- Nichts ist mit OnServerEvent oder OnClientEvent verbunden, wenn die Nachricht ankommt. Im Gegensatz zu einem RemoteEvent verwirft Roblox die Nachricht sofort, anstatt sie in die Warteschlange zu stellen.
Roblox wartet auch nicht darauf, dass eine frühere Nachricht ankommt, bevor es eine spätere verarbeitet, sodass Nachrichten in der falschen Reihenfolge ankommen können. Wenn die Reihenfolge wichtig ist, fügen Sie jedem Nachrichtenelement einen Zeitstempel oder eine Sequenznummer hinzu und ignorieren Sie Nachrichten, die älter sind als die letzte, die Sie verarbeitet haben.
Drosselungs- und Größenbeschränkungen
Client-zu-Server-Nachrichten unterliegen einer Ratenbegrenzung, die jeder Remote-Typ über alle seine Instanzen hinweg teilt. Für aktuelle Limits siehe den Abschnitt Drosselung von RemoteEvent und die Nutzlastgrenzen in UnreliableRemoteEvent.
Argumenteinschränkungen
Wenn Sie ein RemoteEvent auslösen oder eine RemoteFunction aufrufen, leitet es alle Argumente weiter, die Sie mit dem Ereignis oder an die Rückruffunktion übergeben. Jeder Typ von Roblox-Objekt wie ein Enum, Instance oder andere kann übergeben werden, ebenso wie Luau-Typen wie Zahlen, Strings und Booleans, obwohl Sie die folgenden Einschränkungen sorgfältig erkunden sollten.
Nicht-String-Indizes
Wenn irgendwelche Indizes einer übergebenen Tabelle nicht-String-Typen wie ein Instance, userdata oder Funktion sind, konvertiert Roblox diese Indizes automatisch in Strings.
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
-- Funktion mit Ereignis verbinden
remoteEvent.OnClientEvent:Connect(onEventFire)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Auf eingehende Spieler hören und Remote-Event an jeden dispatchen
local function onPlayerAdded(player)
remoteEvent:FireClient(player,
{
[Workspace.Baseplate] = true
}
)
end
Players.PlayerAdded:Connect(onPlayerAdded)Übergebene Funktionen
Funktionen, die als Argumente für ein RemoteEvent oder RemoteFunction enthalten sind, werden nicht über die Client-Server-Grenze repliziert, was es unmöglich macht, Funktionen remote zu übergeben. Stattdessen wird das resultierende Argument auf der Empfangsseite nil sein.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onClientEvent(func)
print(func) --> nil
end
remoteEvent.OnClientEvent:Connect(onClientEvent)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function testFunction()
print("Hallo Welt!")
end
-- Remote-Event mit Funktion als Argument auslösen
remoteEvent:FireAllClients(testFunction)Tabellenindizierung
Wenn Sie eine Datentabelle übergeben, übergeben Sie keine gemischte Tabelle mit numerischen und String-Schlüsseln. Übergeben Sie stattdessen eine Tabelle, die ausschließlich aus Schlüssel-Wert-Paaren (Wörterbuch) oder ausschließlich aus numerischen Indizes besteht.
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 Dragonslayer
--> CharClass = Rogue
end
end
-- Funktion mit Ereignis verbinden
remoteEvent.OnServerEvent:Connect(onEventFire)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Numerisch indizierte Tabelle
local inventoryData = {
"Schwert", "Bogen"
}
-- Wörterbuch-Tabelle
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
remoteEvent:FireServer(inventoryData)
remoteEvent:FireServer(characterData)Tabellenidentitäten
Tabellen, die als Argumente an Remote-Events/Rückrufe übergeben werden, werden kopiert, was bedeutet, dass sie nicht genau mit denen übereinstimmen, die beim Auslösen des Ereignisses oder beim Aufrufen des Rückrufs bereitgestellt wurden. Auch Tabellen, die an den Aufrufer zurückgegeben werden, sind nicht genau gleichwertig mit denen, die bereitgestellt wurden. Sie können dies demonstrieren, indem Sie das folgende Skript auf einem RemoteFunction ausführen und beobachten, wie sich die Tabellenidentitäten unterscheiden.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Rückruffunktion
local function returnTable(player, passedTable)
-- Tabellenidentität bei Aufruf ausgeben
print(tostring(passedTable)) --> table: 0x48eb7aead27563d9
return passedTable
end
-- Funktion als Rückruf der Remote-Funktion festlegen
remoteFunction.OnServerInvoke = returnTablelocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
local inventoryData = {
"Schwert", "Bogen"
}
-- Ursprüngliche Tabellenidentität ausgeben
print(tostring(inventoryData)) --> table: 0x059bcdbb2b576549
local invokeReturn = remoteFunction:InvokeServer(inventoryData)
-- Tabellenidentität bei Rückgabe ausgeben
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9Metatabellen
Wenn eine Tabelle eine Metatabelle hat, gehen alle Informationen zur Metatabelle beim Transfer verloren. Im folgenden Codebeispiel ist die Eigenschaft NumWheels Teil der Metatabelle von Car. Wenn der Server die folgende Tabelle erhält, hat die truck-Tabelle die Eigenschaft Name, aber nicht die Eigenschaft NumWheels.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> {["Name"] = "MeinTruck"}
end
-- Funktion mit Ereignis verbinden
remoteEvent.OnServerEvent:Connect(onEvent)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local Car = {}
Car.NumWheels = 4
Car.__index = Car
local truck = {}
truck.Name = "MeinTruck"
setmetatable(truck, Car)
-- Ereignis mit Tabelle einschließlich einer Metatabelle auslösen
remoteEvent:FireServer(truck)Nicht-replizierte Instanzen
Wenn ein RemoteEvent oder RemoteFunction einen Wert übergibt, der nur für den Sender sichtbar ist, repliziert Roblox ihn nicht über die Client-Server-Grenze und gibt stattdessen nil anstelle des Wertes zurück. Wenn beispielsweise ein Script einen Nachkommen von ServerStorage übergibt, erhält der Client, der auf das Ereignis hört, einen nil-Wert, da dieses Objekt für den Client nicht replizierbar ist.
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 nicht auf ServerStorage zugreifen kann
local storedPart = Instance.new("Part")
storedPart.Parent = ServerStorage
local function onPlayerAdded(player)
remoteEvent:FireClient(player, storedPart)
end
Players.PlayerAdded:Connect(onPlayerAdded)Ähnlich, wenn Sie ein Teil in einem LocalScript erstellen und versuchen, es an ein Script zu übergeben, sieht der Server nil, da das Teil für den Server nicht replizierbar ist.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Wird als "nil" empfangen, da der Server nichts über dieses Teil weiß
local clientPart = Instance.new("Part")
clientPart.Parent = Workspace
remoteEvent:FireServer(clientPart)