À mesure que les projets deviennent complexes, il devient important de réfléchir à la manière dont les scripts sont organisés. De bonnes pratiques d'organisation peuvent garantir que le code n'est pas dupliqué entre les scripts, ou qu'il ne devient pas difficile à gérer.
Une meilleure façon d'organiser et de réutiliser le code est d'utiliser des scripts de module, un type unique de script qui stocke un ensemble de fonctions et de variables conçues pour répondre à un objectif commun, comme gérer l'argent des joueurs ou des ennemis. Le code contenu dans les scripts de module peut être utilisé par d'autres scripts. De cette façon, vous pouvez appeler la même fonction qui attribue des pièces depuis plusieurs scripts différents chaque fois qu'un joueur termine une quête ou trouve un objet à ramasser.
En stockant du code couramment utilisé dans des scripts de module, il est plus facile de maintenir et d'organiser le code, car les modifications n'ont besoin d'être effectuées que dans un seul script de module, plutôt que de mettre à jour plusieurs scripts.
Notions de base sur les scripts de module
Les scripts de module sont en réalité leurs propres objets séparés par rapport aux objets de script. Dans Roblox, les scripts de module peuvent être identifiés par une icône violette.
Créer un script de module
Les ModuleScripts sont généralement placés dans ServerScriptService lorsqu'ils sont utilisés par des scripts côté serveur et ReplicatedStorage lorsqu'ils sont utilisés par des scripts locaux côté client (comme les interactions GUI).
- Créez un ModuleScript dans ServerScriptService.

Structure des scripts de module
Lorsqu'ils sont créés, chaque script de module commence avec le code ci-dessous :
local Module = {}return Module
La ligne local Module = {} crée une table, ou conteneur de code, où les fonctions et variables partagées du module peuvent être stockées. Cette table doit être renommée pour refléter l'objectif du module, comme RewardManager ou ParticleController. Contrairement à d'autres variables qui sont en camel case (myVariable), les tables de module sont recommandées pour utiliser le pascal case et commencer par une majuscule (MyModule).
local RewardManager = {}return RewardManager
Pour que d'autres scripts puissent utiliser les fonctions ou variables non locales d'un module, chaque module se termine par return MyModule. Chaque fois qu'un autre script essaie d'accéder au code du module, return permet à ce script d'accéder au code stocké dans la table du module.
Ajouter aux scripts de module
Pour ajouter une fonction ou une variable au module qui peut être utilisée dans un autre script, tapez le nom de la table du module, suivi d'un point, puis le nom de la fonction ou de la variable, comme dans TestModule.myVariable. Utiliser l'opérateur point est une autre façon d'ajouter du code dans une table, permettant à d'autres scripts d'accéder à ce code chaque fois que la table du module est retournée.
local TestModule = {}
-- Ajoute une variable à la table 'TestModule'
TestModule.myVariable = 100
-- Ajoute une fonction à la table 'TestModule'
function TestModule.doTask(player)
-- Code d'espace réservé
end
return TestModule
Portée dans les scripts de module
Pour qu'une fonction ou une variable de module puisse être utilisée dans un script externe, ne tapez pas local.
Taper local devant des variables et des fonctions signifie qu'elles sont uniquement utilisables par ce script. Bien que ce soit une bonne pratique pour la plupart des scripts afin de réduire les erreurs et le dépannage, vous ne pouvez pas rendre les fonctions et variables des scripts de module locales.
Tout code utilisé uniquement par ce script de module doit tout de même inclure local. Par exemple, le code ci-dessous comprend la variable locale difficultyModifier, qui ne peut être utilisée que dans ce script de module, et la fonction getCoinReward(), qui peut être utilisée dans des scripts externes au module.
local RewardManager = {}
-- Utilisable uniquement dans le script de module
local rewardCoins = 50
-- Utilisable uniquement dans le script de module
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Utilisable dans d'autres scripts
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Utiliser des modules dans d'autres scripts
Un script de module ne peut pas exécuter de code par lui-même — il doit être chargé dans un autre script en utilisant le mot-clé require(). La fonction require() prend un argument, qui est l'emplacement du script de module dans l'Explorer.
Pour utiliser un module, dans un script séparé, définissez une variable égale à require(moduleScript).
local MyModule = require(ServerStorage.ModuleScript)
Maintenant, la variable MyModule contient la table du module créée dans ce script de module. Pour utiliser des fonctions et des variables de cette table, tapez le nom de la variable, suivi d'un point, et du nom exact de ce que vous souhaitez utiliser dans ce script de module, comme MyModule.myFunction(). Lorsque le script s'exécute et atteint cette ligne, il accède à cette fonction ou variable spécifique stockée dans la table du module.
local MyModule = require(ServerStorage.ModuleScript)MyModule.myFunction()
Exemple de RewardManager
ModuleScript - RewardManager
local RewardManager = {}
-- Utilisable uniquement dans le script de module
local rewardCoins = 50
-- Utilisable uniquement dans le script de module
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Utilisable dans d'autres scripts
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Script - TreasureChestScriptlocal ServerStorage = game:GetService("ServerStorage")-- Charger le script de modulelocal RewardManager = require(ServerStorage.RewardManager)-- Appelle une fonction du script de modulelocal coins = RewardManager.getCoinReward("easy")print("Devrait récompenser " .. coins .. " pièces")
Dépannage général
Certaines des astuces ici abordent des problèmes courants lors de l'utilisation de scripts de module. Gardez à l'esprit que les scripts de module peuvent être un sujet compliqué avec plus de nuances. Pour plus de détails, consultez ce guide plus technique sur les scripts de module.
Problème : Obtenez un message d'erreur comprenant : "Infinite yield possible" ou "not a valid member".
- Vérifiez l'orthographe du script de module où il est chargé. require() doit inclure le chemin et l'orthographe exacts du script de module, qui peut être nommé différemment de la table du module.
Problème : Obtenez un message d'erreur comprenant : "attempt to index global".
- Dans tous les scripts utilisant un script de module, assurez-vous qu'il est chargé en utilisant la fonction require(). Sinon, ce script ne peut pas utiliser les fonctions et variables du script de module.
Résumé
Les scripts de module dans Roblox sont une méthode utilisée par les codeurs pour organiser et réutiliser du code. Un script de module est souvent stocké dans ServerStorage (ou ReplicatedStorage pour des interactions basées sur le client). De là, d'autres scripts peuvent appeler des fonctions et des variables stockées dans ce script de module.
Par exemple, une expérience peut attribuer des points aux joueurs pour la collecte d'objets. Un script de module peut gérer le code pour donner des points. Ensuite, des scripts pour différents types d'objets peuvent simplement appeler la fonction du script de module. Cela réduit le besoin de réutiliser du code entre les scripts, rendant le code plus facile à comprendre et à maintenir.