Hergebruik code

*Deze inhoud is vertaald met behulp van AI (bèta) en kan fouten bevatten. Klik hier om deze pagina in het Engels te bekijken.

Na het maken van een paar scripts duurt het nooit lang voordat je wat code tussen hen wilt hergebruiken. Afhankelijk van locatie stellen ModuleScripts je in staat om code tussen scripts aan verschillende zijden van de client-servergrens of aan dezelfde kant van de grens te hergebruiken.

Je kunt modulescripts overal plaatsen waar je scripts plaatst, maar ReplicatedStorage is een populaire locatie; het opslaan van modulescripts hier stelt je in staat om code tussen de server en clients te hergebruiken.

Anatomie van een modulescript

Voeg in Roblox Studio een modulescript toe aan ReplicatedStorage en hernoem het naar PickupManager. Elk ModuleScript begint met de volgende code:

local module = {}
return module

Deze code creëert een lege Luau tabel en retourneert deze aan elk script dat het modulescript vereist.

De retourwaarde kan elk gegevenstype zijn, behalve nil, maar de meeste modulescripts retourneren een functie, een tabel of een tabel van functies. Om zijn retourwaarde te genereren, kunnen modulescripts natuurlijk willekeurige code uitvoeren, wat het vereisen van andere modulescripts omvat.

Het volgende voorbeeld retourneert een tabel met een enkele functie genaamd getPickupBonus. Plak het in het nieuwe modulescript:

-- ModuleScript in ReplicatedStorage
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- Voeg de getPickupBonus functie toe aan de PickupManager tabel
PickupManager.getPickupBonus = function(rarity)
local bonus = rarityMultipliers[rarity] * defaultMultiplier
return bonus
end
return PickupManager

Het toevoegen van de functie aan een tabel is niet strikt noodzakelijk; je zou gewoon de functie zelf kunnen retourneren, maar het is een goed patroon om te volgen; het geeft je een gemakkelijk te begrijpen syntaxis wanneer je de functie vanuit een ander script aanroept en stelt je in staat om in de loop van de tijd eenvoudig meer functies aan het modulescript toe te voegen.

Vereis modulescripts

Om een modulescript te laden, roep je de require() functie aan. Voeg in ReplicatedStorage een nieuw script toe en wijzig de RunContext naar Client. Voeg vervolgens de volgende code toe om de PickupManager.getPickupBonus functie aan te roepen:

Client script in ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Verkrijg de waarde die door het ModuleScript is geretourneerd
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
-- Roep een ModuleScript functie aan
local bonus = PickupManager.getPickupBonus("legendary")
print(bonus) --> 125

Het opslaan van modulescripts in ReplicatedStorage stelt je in staat om code tussen de server en client te delen, zodat je dezelfde code kunt gebruiken om het script vanuit ServerScriptService te vereisen:

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

Wanneer je require() aanroept op een ModuleScript, wordt deze eenmaal uitgevoerd en retourneert deze een enkel item als referentie. Het opnieuw aanroepen van require() retourneert exact dezelfde referentie, wat betekent dat als je een geretourneerde tabel of Instance wijzigt, de daaropvolgende require() aanroepen die gewijzigde referentie retourneren. Het module zelf wordt niet meerdere keren uitgevoerd.

Als je een ModuleScript van beide zijden van de client-servergrens vereist, zoals in het bovenstaande voorbeeld, retourneert het ModuleScript een unieke referentie voor elke kant.

Patronen

Modulescripts hebben enkele veelvoorkomende patronen die je kunt gebruiken om je code te vereenvoudigen en valkuilen te vermijden naarmate je spel groter en complexer wordt.

Gegevens delen

Om gegevens aan individuele objecten te koppelen, kun je attributen aan hen toewijzen of Configuration mappen maken met waarde-objecten zoals StringValue of IntValue. Beide benaderingen zijn echter problematisch als je tientallen objecten of datavariabelen wilt toevoegen of wijzigen. Ze slaan ook geen tabellen of functies op.

Als je dezelfde gegevens voor meerdere kopieën van hetzelfde object wilt wijzigen of dezelfde gegevens voor verschillende objecten wilt hergebruiken, sla de gegevens dan op in ModuleScripts. Het is een gemakkelijkere manier voor jou om de gegevens in andere scripts te hergebruiken, en je kunt tabellen en functies opslaan.

Het volgende voorbeeld ModuleScript in ReplicatedStorage slaat de configuratiewaarden voor een generiek wapen op:

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

Aangepaste evenementen

Aangepaste evenementen stellen scripts in staat om met elkaar te communiceren, maar het bijhouden van referenties naar individuele BindableEvent objecten kan je code rommelig maken.

Je kunt ModuleScripts gebruiken om BindableEvents op te slaan en aangepaste gebeurtenishandlers te bieden die direct zijn gekoppeld aan de methoden van ModuleScript.

Het volgende ModuleScript in ReplicatedStorage heeft een aangepast evenement dat afgaat wanneer de schakelaar van staat verandert:

ModuleScript in ReplicatedStorage
local Switch = {}
-- Een bindbare maken zodat elk script kan luisteren naar wanneer de schakelaar is veranderd
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch

Het volgende client script in ReplicatedStorage verbindt een functie die moet worden aangeroepen wanneer het Switch.Changed evenement afgaat.

Script in ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(newState)
print("Schakelaar staat is nu", newState)
end)
-- Test het flippen een paar keer
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()

Encapsulatie

Encapsulatie is de praktijk van het creëren van een abstractielaag rond objecten of scriptinglogica om complexiteit te verbergen. Je kunt ModuleScripts gebruiken om Roblox-objecten te encapsuleren met aangepaste Luau-functies om de code te vereenvoudigen.

Bijvoorbeeld, je kunt encapsulatie gebruiken om:

  • Communicatie tussen netwerken te vereenvoudigen met een enkel RemoteEvent object.
  • Foutafhandelingscode rond gevoelige services zoals DataStoreService te wikkelen.
  • Aangepaste methoden te definiëren om de functies van Roblox-objecten te controleren of uit te breiden.

Het is moeilijk om tientallen individuele RemoteEvent objecten bij te houden om netwerken in een spel te implementeren. Je kunt een ModuleScript gebruiken om een enkele RemoteEvent te encapsuleren om dit probleem te vereenvoudigen. Door een unieke id argument op te nemen, kun je nog steeds verschillende netwerkberichten verzenden terwijl je slechts één RemoteEvent gebruikt.

In het onderstaande voorbeeld encapsuleert het ModuleScript genaamd NetworkManagerClient de RemoteEvent:FireServer() methode om dit extra id argument op te nemen. Bovendien verwijst dit ModuleScript naar het RemoteEvent object zelf, zodat je het niet in andere delen van je code hoeft te verwijzen. Je hoeft alleen dit ModuleScript te vereisen om netwerkberichten te verzenden en hoeft niet met RemoteEvent objecten in de rest van je codebase om te gaan.

Het volgende ModuleScript in ReplicatedFirst biedt een ingekapselde functie die je kunt aanroepen in je client scripts om een netwerkbericht te verzenden:

Netwerk Module
-- ModuleScript in ReplicatedFirst genaamd NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- De FireServer functie van het remote object encapsuleren
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient

Het volgende ModuleScript in ServerScriptService gebruikt BindableEvents voor elk script om verbinding te maken met een specifieke ID. Wanneer een client een netwerkbericht verzendt, gaat elke BindableEvent die aan de opgegeven ID is gekoppeld af.

-- ModuleScript in ServerScriptService genaamd NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- De nieuwe BindableEvent koppelen aan de id
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Verbinden met
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Elke bindbare gebeurtenis vinden die overeenkomt met de ID van het ontvangen remote event
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer

Het volgende LocalScript verzendt een bericht met de ID RequestA met een optionele Hello argument.

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

Het volgende Script maakt verbinding met de netwerkbericht ID RequestA en print een verklaring met eventuele extra parameters wanneer het de aanvraag ontvangt.

-- Script in ServerScriptService
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Ontvangen RequestA van", player, ...)
end)
©2026 Roblox Corporation. Roblox, het Roblox-logo en Powering Imagination behoren tot onze geregistreerde en niet-geregistreerde handelsmerken in de VS en andere landen.