Code wiederverwenden

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

Nachdem Sie einige Skripte erstellt haben, dauert es nicht lange, bis Sie einige Code-Teile zwischen ihnen wiederverwenden möchten. Je nach Standort ermöglichen ModuleScripts die Wiederverwendung von Code zwischen Skripten auf unterschiedlichen Seiten der Client-Server-Grenze oder auf derselben Seite der Grenze.

Sie können Modulskripte überall dort platzieren, wo Sie Skripte platzieren, aber ReplicatedStorage ist ein beliebter Standort; das Speichern von Modulskripten hier ermöglicht es Ihnen, Code zwischen dem Server und den Clients wiederzuverwenden.

Anatomie eines Modulskripts

Fügen Sie im Roblox Studio ein Modulskript zu ReplicatedStorage hinzu und benennen Sie es in PickupManager um. Jedes ModuleScript beginnt mit dem folgenden Code:


local module = {}
return module

Dieser Code erstellt eine leere Luau Tabelle und gibt sie an jedes Skript zurück, das das Modulskript anfordert.

Der Rückgabewert kann jeden Datentyp außer nil sein, aber die meisten Modulskripte geben eine Funktion, eine Tabelle oder eine Funktionstabelle zurück. Um seinen Rückgabewert zu generieren, können Modulskripte selbstverständlich beliebigen Code ausführen, einschließlich des Anforderns anderer Modulskripte.

Das folgende Beispiel gibt eine Tabelle mit einer einzigen Funktion namens getPickupBonus zurück. Fügen Sie es in das neue Modulskript ein:


-- Modulskript in ReplicatedStorage
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- Fügen Sie die Funktion getPickupBonus zur PickupManager-Tabelle hinzu
PickupManager.getPickupBonus = function(rarity)
local bonus = rarityMultipliers[rarity] * defaultMultiplier
return bonus
end
return PickupManager

Das Hinzufügen der Funktion zu einer Tabelle ist nicht unbedingt erforderlich—Sie könnten einfach die Funktion selbst zurückgeben—aber es ist ein gutes Muster, dem Sie folgen sollten; es gibt Ihnen eine leicht verständliche Syntax, wenn Sie die Funktion von einem anderen Skript aus aufrufen und ermöglicht es Ihnen, im Laufe der Zeit weitere Funktionen zum Modulskript hinzuzufügen.

Modulskripte anfordern

Um ein Modulskript zu laden, rufen Sie die Funktion require() auf. Fügen Sie in ReplicatedStorage ein neues Skript hinzu und ändern Sie dessen RunContext auf Client. Fügen Sie dann den folgenden Code hinzu, um die Funktion PickupManager.getPickupBonus aufzurufen:

Client-Skript in ReplicatedStorage

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Holen Sie sich den Wert, der vom Modulskript zurückgegeben wird
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
-- Rufen Sie eine Modulskriptfunktion auf
local bonus = PickupManager.getPickupBonus("legendary")
print(bonus) --> 125

Das Speichern von Modulskripten in ReplicatedStorage ermöglicht es Ihnen, Code zwischen dem Server und dem Client zu teilen, sodass Sie denselben Code verwenden können, um das Skript aus ServerScriptService anzufordern:

Skript in ServerScriptService

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))

Wenn Sie require() auf einem ModuleScript aufrufen, wird dieser einmal ausgeführt und gibt einen einzelnen Artikel als Referenz zurück. Ein erneuter Aufruf von require() gibt dieselbe Referenz zurück, was bedeutet, dass, wenn Sie eine zurückgegebene Tabelle oder Instance ändern, nachfolgende Aufrufe von require() diese geänderte Referenz zurückgeben. Das Modul selbst wird nicht mehrfach ausgeführt.

Wenn Sie ein ModuleScript von beiden Seiten der Client-Server-Grenze anfordern, wie im obigen Beispiel, gibt das ModuleScript eine eindeutige Referenz für jede Seite zurück.

Muster

Modulskripte haben einige gängige Muster, die Sie verwenden können, um Ihren Code zu vereinfachen und Stolpersteine zu vermeiden, während Ihr Spiel in Größe und Komplexität wächst.

Datenaustausch

Um Daten mit einzelnen Objekten zu verknüpfen, können Sie ihnen Attribute zuweisen oder Configuration-Ordner mit Wertobjekten wie StringValue oder IntValue erstellen. Beide Ansätze sind jedoch problematisch, wenn Sie Dutzende von Objekten oder Datenwerten hinzufügen oder ändern möchten. Sie speichern auch keine Tabellen oder Funktionen.

Wenn Sie dieselben Daten für mehrere Kopien des gleichen Objekts ändern oder dieselben Daten für verschiedene Objekte wiederverwenden möchten, speichern Sie die Daten in ModuleScripts. Dies ist eine einfachere Möglichkeit, die Daten in anderen Skripten wiederzuverwenden, und Sie können Tabellen und Funktionen speichern.

Das folgende Beispiel ModuleScript in ReplicatedStorage speichert die Konfigurationswerte für eine generische Waffe:

Modulskript in ReplicatedStorage

local GunConfig = {}
GunConfig.MagazineSize = 20
GunConfig.AmmoCount = 100
GunConfig.Firerate = 600
GunConfig.Damage = {
["Kopf"] = 50;
["Torso"] = 40;
["Körper"] = 25;
}
return GunConfig

Benutzerdefinierte Ereignisse

Benutzerdefinierte Ereignisse ermöglichen es Skripten, miteinander zu kommunizieren. Das Verfolgen von Referenzen zu einzelnen BindableEvent-Objekten kann jedoch Ihren Code überladen.

Sie können ModuleScripts verwenden, um BindableEvents zu speichern und benutzerdefinierte Ereignishandler bereitzustellen, die direkt an die Methoden von ModuleScript gebunden sind.

Das folgende ModuleScript in ReplicatedStorage hat ein benutzerdefiniertes Ereignis, das ausgelöst wird, wenn sich der Zustand des Schalters ändert:

Modulskript in ReplicatedStorage

local Switch = {}
-- Erstellung eines bindbaren Ereignisses, sodass jedes Skript hören kann, wenn der Schalter geändert wurde
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch

Das folgende Client-Skript in ReplicatedStorage verbindet eine Funktion, die aufgerufen wird, wenn das Ereignis Switch.Changed ausgelöst wird.

Skript in ReplicatedStorage

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(newState)
print("Der Schalterzustand ist jetzt", newState)
end)
-- Testen Sie das Umdrehen ein paar Mal
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()

Kapselung

Kapselung ist die Praxis, eine Abstraktionsschicht um Objekte oder Skripting-Logik zu schaffen, um Komplexität zu verbergen. Sie können ModuleScripts verwenden, um Roblox-Objekte mit benutzerdefinierten Luau-Funktionen zu kapseln, um den Code zu vereinfachen.

Zum Beispiel können Sie Kapselung verwenden, um:

  • Die Kommunikation über Netzwerke mit einem einzigen RemoteEvent-Objekt zu vereinfachen.
  • Code für die Fehlerbehandlung um sensible Dienste wie DataStoreService zu wickeln.
  • Benutzerdefinierte Methoden zu definieren, um die Funktionen von Roblox-Objekten zu steuern oder zu erweitern.

Es ist schwierig, Dutzende von einzelnen RemoteEvent-Objekten zu verfolgen, um Networking in einem Spiel zu implementieren. Sie können ein ModuleScript verwenden, um ein einzelnes RemoteEvent zu kapseln, um dieses Problem zu vereinfachen. Indem Sie ein einzigartiges id-Argument hinzufügen, können Sie weiterhin unterschiedliche Netzwerknachrichten senden, während Sie nur ein einziges RemoteEvent verwenden.

Im folgenden Beispiel kapselt das ModuleScript mit dem Namen NetworkManagerClient die Methode RemoteEvent:FireServer(), um dieses zusätzliche id-Argument einzuschließen. Darüber hinaus verweist dieses ModuleScript auf das RemoteEvent-Objekt selbst, sodass Sie nicht in anderen Teilen Ihres Codes darauf verweisen müssen. Sie müssen nur dieses ModuleScript anfordern, um Netzwerknachrichten zu senden und müssen nicht mit RemoteEvent-Objekten im Rest Ihres Codebasis umgehen.

Das folgende ModuleScript in ReplicatedFirst bietet eine verkapselte Funktion, die Sie in Ihren Client-Skripten aufrufen können, um eine Netzwerknachricht zu senden:

Netzwerkmodul

-- Modulskript in ReplicatedFirst mit dem Namen NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Verpacken der FireServer-Funktion des Remote-Objekts
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient

Das folgende ModuleScript in ServerScriptService verwendet BindableEvents für jedes Skript, um sich mit einer bestimmten ID zu verbinden. Wenn ein Client eine Netzwerknachricht sendet, wird jedes BindableEvent, das mit der angegebenen ID verknüpft ist, ausgelöst.


-- Modulskript in ServerScriptService mit dem Namen NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Verknüpfung des neuen BindableEvent mit der ID
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Verbindung zu
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Finden jedes bindbaren Ereignisses, das mit der ID des empfangenen Remote-Ereignisses übereinstimmt
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer

Das folgende LocalScript sendet eine Nachricht mit der ID RequestA und einem optionalen Argument Hello.


-- LocalScript in ReplicatedFirst
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))
NetworkManagerClient.FireServer("RequestA", "Hello")

Das folgende Script verbindet sich mit der Netzwerknachricht ID RequestA und gibt eine Mitteilung mit allen zusätzlichen Parametern aus, wenn die Anfrage empfangen wird.


-- Skript in ServerScriptService
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Erhaltene RequestA von", player, ...)
end)
©2026 Roblox Corporation. Roblox, das Roblox-Logo und "Powering Imagination" gehören zu unseren eingetragenen und nicht eingetragenen Markenzeichen in den USA und anderen Ländern.