Riutilizzo del codice

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

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.

  1. In Roblox Studio, passa il mouse su ReplicatedStorage nella finestra Explorer e fai clic su + .
  2. Seleziona ModuleScript per aggiungere uno script del modulo nuovo.
  3. Fai clic con il pulsante destro del mouse sullo script e rinominalo in PickupManager .
  4. 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 daModuleScript
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
-- Chiama una funzione ModuleScript
local 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 = 20
GunConfig.AmmoCount = 100
GunConfig.Firerate = 600
GunConfig.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 ReplicatedFirst
local 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)