Codeswiederverwenden

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

Nach der Erstellung einiger Skripte ist es nie lange, bevor du einige Code zwischen ihnen wiederverwenden möchtest.Abhängig von Ort, lässt dich ModuleScripts Code zwischen Skripten auf verschiedenen Seiten der Client-Server-Grenze oder derselben Seite der Grenze wiederverwenden

Du kannst Modulskripte überall platzieren, wo du Skripte platzierst, aber ReplicatedStorage ist ein beliebter Ort; das Speichern von Modulskripten hier ermöglicht es dir, Code zwischen dem Server und den Clients wiederzuverwenden.

Anatomie eines Skript, das. PL: die Skripts

Füge in Roblox Studio ein Modulskript zu ReplicatedStorage hinzu und benenne es in PickupManager um. Jedes ModuleScript beginnt mit dem folgenden Codes:


local module = {}
return module

Dieser Code erstellt eine leere Luau-Tabelle und gibt sie an jedes Skript zurück, das das Skript, das. PL: die Skriptserfordert.

Der Rückgabewert kann jeder Datentyp sein, außer nil, aber die meisten Modulskripte geben eine Funktion, eine Tabelle oder eine Tabelle von Funktionen zurück.Um seinen Rückgabewert zu generieren, können Modulskripte natürlich willkürlichen Codesausführen, der andere Modulskripte erfordert.

Das folgende Beispiel gibt eine Tabelle mit einer einzigen Funktion namens getPickupBonus zurück. Fügen Sie sie in das neue Skript, das. PL: die Skriptsein:


-- ModuleScript in ReplicatedStorage
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- Füge die Funktion getPickupBonus zum Tab PickupManager 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 streng notwendig - Sie könnten einfach die Funktion selbst zurückgeben -, aber es ist ein gutes Muster zu befolgen; 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 leicht mehr Funktionen zum Modulskript hinzuzufügen.

Module-Skripte erfordern

Um ein Skript, das. PL: die Skriptszu laden, rufen Sie die require()-Funktion auf.In ReplicatedStorage füge ein neues Skript, das. PL: die Skriptshinzu und ändere seine RunContext zu Client.Füge dann den folgenden Code hinzu, um die PickupManager.getPickupBonus Funktion aufzurufen:

Client-Skript im ReplicatedStorage

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

Das Speichern von Modulskripten in ReplicatedStorage lässt dich den Code zwischen dem Server und dem Client teilen, so dass du denselben Code verwenden kannst, um das Skript von ServerScriptService zu erfordern:

Skript in ServerScriptService

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

Wenn du require() auf einem ModuleScript aufrufst, wird es einmal ausgeführt und gibt eine einzige Item als Referenz zurück.Wenn du require() erneut aufrufst, wird die gleiche Referenz zurückgegeben, was bedeutet, dass, wenn du eine zurückgegebene Tabelle oder Instance modifizierst, nachfolgende require() Aufrufe diese modifizierte Referenz zurückgeben.Das Modul selbst läuft nicht mehrere Male.

Wenn du eine ModuleScript von beiden Seiten der Client-Server-Grenze benötigst, wie im obigen Beispiel, gibt die ModuleScript eine eindeutige Referenz für jede Seite zurück.

Patmuster

Module-Skripte haben einige gemeinsame Muster, die Sie verwenden können, um Ihren Code zu vereinfachen und Fallstricke zu vermeiden, wenn Ihre Erfahrung an Größe und Komplexität wächst.

Daten teilen

Um Daten mit einzelnen Objekten zu verknüpfen, kannst du ihnen Attribute zuweisen oder Ordner mit Wertobjekten wie oder erstellen.Beide Ansätze sind jedoch problematisch, wenn du Dutzende von Objekten oder Datenwerten hinzufügen oder modifizieren möchtest.Sie speichern auch keine Tabellen oder Funktionen.

Wenn du die gleichen Daten für mehrere Kopien desselben Objekts modifizieren oder die gleichen Daten für unterschiedliche Objekte wiederverwenden möchtest, speichere die Daten in ModuleScripts.Es ist ein einfacher Weg für dich, die Daten in anderen Skripten wiederzuverwenden, und du kannst Tabellen und Funktionen speichern.

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

ModuleScript in ReplicatedStorage

local GunConfig = {}
GunConfig.MagazineSize = 20
GunConfig.AmmoCount = 100
GunConfig.Firerate = 600
GunConfig.Damage = {
["Head"] = 50;
["Torso"] = 40;
["Body"] = 25;
}
return GunConfig

Benutereigene Ereignisse

Benutzerdefinierte Ereignisse ermöglichen es Skripten, miteinander zu kommunizieren, aber die Nachverfolgung von Verweisen auf einzelne BindableEvent Objekte kann Ihren Codesüberladen.

Du kannst ModuleScripts verwenden, um BindableEvents zu speichern und benutzerdefinierte Ereignishändler 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 Schalter im Zustand ändert:

ModuleScript in ReplicatedStorage

local Switch = {}
-- Erstellen von bindbaren, sodass jedes Skript zuhö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 Switch.Changed Ereignis ausgelöst wird.

Skript im ReplicatedStorage

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(newState)
print("Switch state is now", newState)
end
-- Teste das Umklappen mehrerer Male
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()

Kapselung

Kapselung ist die Praxis, eine Abstraktionsschicht um Objekte oder Skriptlogik herum zu erstellen, um die Komplexität zu verbergen.Du kannst ModuleScripts verwenden, um Roblox-Objekte mit benutzerdefinierten Luau-Funktionen zu kapseln, um den Codeszu vereinfachen.

Zum Beispiel können Sie die Kapselung verwenden, um:

  • Vereinfachen Sie die Netzwerkkommunikation mit einem einzigen RemoteEvent Objekt.
  • Wrap-Fehlerbehandlungscode um sensible Dienste wie DataStoreService.
  • Definieren Sie benutzerdefinierte Methoden, um Roblox-Objektfunktionen zu steuern oder zu erweitern.

Es ist schwierig, Dutzende einzelner RemoteEvent Objekte zu verfolgen, um Netzwerke in deinem Spiel zu implementieren.Du kannst ein ModuleScript verwenden, um eine einzige RemoteEvent zu kapseln, um dieses Problem zu vereinfachen.Durch die Eingabe eines einzigartigen id -Argument kannst du immer noch verschiedene Netzwerk-Nachrichten senden, während du nur einen einzigen RemoteEvent verwendest.

Im folgenden Beispiel kapselt die ModuleScript mit dem Namen NetworkManagerClient die RemoteEvent:FireServer()-Methode, um dieses zusätzliche id-Argument einzuschließen.Zusätzlich verweist dieses ModuleScript auf das RemoteEvent Objekt selbst, sodass du es nicht in anderen Teilen deines Codes referenzieren musst.Du musst nur diese ModuleScript erfordern, um Netzwerknachrichten zu senden, und musst dich nicht mit RemoteEvent Objekten im Rest deiner Codebasis befassen.

Die folgende ModuleScript in ReplicatedFirst bietet eine kapselte Funktion, die Sie auf Ihre Client-Skripte aufrufen können, um eine Netzwerk-Nachricht zu senden:

Netzwerkmodul

-- ModuleScript in ReplicatedFirst mit dem Namen NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Die FireServer-Funktion des entfernten Objekts verpacken
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient

Die folgenden ModuleScript in ServerScriptService verwendet BindableEvents für jedes Skript, um sich mit einer bestimmten ID zu verbinden.Wenn ein Client eine Netzwerk-Nachricht sendet, geht jede BindableEvent mit der angegebenen ID einher.


-- ModuleScript im ServerScriptService namens NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Verknüpfung des neuen BindbarenEvents 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, ...)
-- Alle bindbaren Ereignisse finden, die der ID des empfangenen Remote-Ereignisses entsprechen
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer

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


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

Die folgende Script verbindet sich mit der Netzwerk-Nachricht-ID RequestA und druckt eine Aussage mit allen zusätzlichen Parametern aus, wenn es die Anfrage erhält.


-- Skript in ServerScriptService
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Received RequestA from", player, ...)
end)