Dopo aver creato alcuni script, non è mai lungo prima di voler riutilizzare alcun codice tra di loro. A seconda di luogo , ModuleScripts ti consente di riutilizzare il codice tra gli script su due lati diversi della frontiera client-server o dello stesso lato.
Creazione di Script del Modulo
Puoi mettere gli script del modulo ovunque tu metta gli script, ma ReplicatedStorage è un luogo popolare; memorizzare gli script del modulo qui ti consente di riutilizzare il codice tra il server e i client.
- Seleziona ModuleScript per aggiungere uno script del modulo nuovo.
- Fai clic con il pulsante destro del mouse sullo script e rinominalo in PickupManager .
- Fai doppio clic sul script per aprirlo nel Script Editor.
Anatomia di uno script del modulo
Ogni ModuleScript inizia con il seguente codice:
local module = {}return module
Questo codice crea una tabella Luau vuota e la restituisce a qualsiasi script che richiede lo script del modulo.
Il valore di ritorno può essere qualsiasi tipo di dati ad eccezione di nil , ma la maggior parte degli script del modulo genera una funzione, una tabella o una tabella di funzioni. Per generare il suo valore di ritorno, gli script del modulo possono naturalmente eseguire codice arbitrario, che include l'esecuzione di altri script del modulo.
L'esempio seguente restituisce una tabella con una sola funzione chiamata getPickupBonus . Passa in essa il tuo nuovo script del modulo:
-- ModuleScript nel ReplicatedStorage
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- Aggiungi la funzione getPickupBonus alla tabella PickupManager
PickupManager.getPickupBonus = function(rarity)
local bonus = rarityMultipliers[rarity] * defaultMultiplier
return bonus
end
return PickupManager
L'aggiungimento della funzione a una tabella non è strettamente necessario - potresti semplicemente restituire la funzione stessa - ma è un buon modello da Seguire; ti dà una sintassi facile da capire quando chiami la funzione da un altro script e ti consente di aggiungere facilmente più funzioni al modulo script nel tempo.
Richiesta di script del modulo
Per caricare uno script del modulo, chiami la funzione require(). In ReplicatedStorage, aggiungi uno script nuovo e cambia il suo RunContext in 1> Client1> . Quindi aggiungi il seguente codice per chiamare la funzione 4> PickupManager.getPickupBonus4> :
Script del client in ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Ottieni il valore restituito daModuleScriptlocal PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))-- Chiama una funzione ModuleScriptlocal bonus = PickupManager.getPickupBonus("legendary")print(bonus) --> 125
Puoi usare lo stesso codice per richiedere lo script da ServerScriptService :
Script nel ServerScriptStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Ottieni il valore di ritorno per ilModuleScript chiamato "PickupManager"local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
Quando chiami require() su un ModuleScript , viene eseguito una sola volta e restituisce un singolo elemento come riferimento. Chiamare require() nu
Se richiedi un ModuleScript da entrambi i lati del confine client-server, il ModuleScript restituisce un riferimento unico per ciascun lato.
Pattern
Gli script del modulo hanno alcuni modelli comuni che puoi utilizzare per semplificare il tuo codice e evitare le insidie mentre la tua esperienza cresce in dimensioni e complessità.
Condivisione dei dati
Per associare i dati a singoli oggetti, puoi assegnargli attributi o creare Configuration cartelle con oggetti di valore come StringValue o IntValue . Tuttavia, entrambi gli approcci sono problematici se vuoi aggiungere o modificare dozzine di oggetti o valori di dati. Essi non memorizzano tabelle o funzioni.
If you want to modify the same data for multiple copies of the same object or reuse the same data for different objects, store the data in ModuleScripts . È un modo più semplice per riutilizzare i dati in altri script e puoi archiviare tabelle e funzioni.
Il seguente esempio ModuleScript in ReplicatedStorage memorizza i valori di configurazione per un'arma generica:
ModuleScript nel ReplicatedStorage
local GunConfig = {}GunConfig.MagazineSize = 20GunConfig.AmmoCount = 100GunConfig.Firerate = 600GunConfig.Damage = {["Head"] = 50;["Torso"] = 40;["Body"] = 25;}return GunConfig
Eventi personalizzati
Gli eventi personalizzati consentono agli script di comunicare tra loro, ma dover tenere traccia dei riferimenti a singoli oggetti BindableEvent può ingombrare il tuo codice.
Puoi usare ModuleScripts to store BindableEvents and provide custom event handlers that are directly tied to the methods of ModuleScript .
Il seguente ModuleScript in ReplicatedStorage ha un evento personalizzato che si attiva quando l'interruttore cambia stato:
ModuleScript nel ReplicatedStorage
local Switch = {}
-- Creazione di un pulsante legabile in modo che qualsiasi script possa ascoltare quando l'interruttore è cambiato
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch
Il seguente script del client in ReplicatedStorage connette una funzione da chiamare quando si attiva l'evento Switch.Changed .
Script nello storage replicato
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(newState)
print("Switch state is now", newState)
end
-- Prova a flettere qualche volta
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()
Incapsulamento
L'incapsulamento è la pratica di creare un livello di astrazione attorno agli oggetti o alla logica di scripting per nascondere la complessità. Puoi usare ModuleScripts per incapsulare gli oggetti Roblox con funzioni Lua personalizzate per semplificare il codice.
Ad esempio, puoi usare l'incapsulamento per:
- Semplifica la comunicazione tra reti con un singolo oggetto RemoteEvent .
- Avvolgi il codice di gestione degli errori attorno ai servizi sensibili come DataStoreService .
- Definisci metodi personalizzati per controllare o estendere le funzionalità dell'oggetto Roblox.
È difficile tenere traccia di dozzine di singoli oggetti RemoteEvent per implementare la rete nel tuo Gioco. Puoi usare un ModuleScript per incapsulare un singolo RemoteEvent per aiutare a semplificare questo problema. Includendo un unico argomento
Nell'esempio seguente, il ModuleScript chiamato NetworkManagerClient incapsula il metodo
Il seguente ModuleScript in ReplicatedFirst fornisce una funzione incapsulata che puoi chiamare sui tuoi script del client per inviare un Messaggiodi rete:
Modulo di rete
-- ModuleScript in ReplicatedFirst chiamato NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Incapsulamento della funzione FireServer dell'oggetto remoto
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient
Il seguente ModuleScript in ServerScriptService utilizza BindableEvents per ogni script per connettersi a uno specifico ID. Quando un client invia un Messaggiodi rete, ogni 1> Class.BindableEvent1> associato allo specifico ID viene attivato.
-- ModuleScript in ServerScript Servizio denominato NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Collegamento del nuovo BindableEvent all'ID
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Connessione a
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Trovare ogni evento legabile che corrisponda all'ID dell'evento remoto ricevuto
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer
Il seguente LocalScript invia un messaggio con l'ID RequestA con un argomento opzionale Hello.
-- Script locale in ReplicatedFirstlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))NetworkManagerClient.FireServer("RequestA", "Hello")
Il seguente Script si connette all'ID del messaggio di rete RequestA e stampa un'istruzione con tutti i parametri aggiuntivi quando riceve la Richiesta.
-- Script nel ServerScriptService
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Received RequestA from", player, ...)
end)