Introduction aux scripts de module

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

À mesure que les projets deviennent complexes, il devient important de penser comment les scripts sont organisés. Les bonnes pratiques d'organisation peuvent garantir que le code n'est pas dupliqué entre les scripts, ou devient difficile à gérer.

Une meilleure façon d'organiser et de réutiliser le code est avec scripts de module , un type unique de script qui stocke un ensemble de fonctions et de variables conçues pour remplir un but partagé, comme gérer l'argent des joueurs ou les ennemis. Le code dans les scripts de module peut être utilisé par d'autres scripts. De cette façon, vous pouvez appeler la même fonction qui donne des pièces à partir de plusieurs scripts chaque fois qu'un joueur termine une quête ou trouve un pickup.

En stockant le code couramment utilisé dans les scripts de module, il rend plus facile de maintenir et d'organiser le code puisque les modifications ne nécessitent qu'un seul script de module, plutôt que de mettre à jour plusieurs scripts.

Scripts de module de base

Les scripts de module sont en fait leur propre objet séparé par rapport aux objets de script. Dans Roblox, les scripts de module peuvent être désignés par un icône de violet .

Créer un script de module

ModuleScripts sont généralement placés dans ServerScriptService lorsque les scripts côté serveur sont utilisés et ReplicatedStorage lorsque les scripts côté client sont utilisés (tels que les interactions de l'utilisateur).

  1. Créer un ModuleScript dans ServerStorage .

Structure des scripts de module

Lors de sa création, chaque script de module commence avec le code ci-dessous :


local Module = {}
return Module

La ligne local Module = {} crée une table, ou un conteneur de code, où les fonctions et les variables partagées du module peuvent être stockées. Cette table doit être renomnée dans le but du module, comme RewardManager ou ParticleController. Au lieu d'autres variables qui sont des majuscules ( 1> my


local RewardManager = {}
return RewardManager

Ainsi, d'autres scripts peuvent utiliser les fonctions ou les variables non locales d'un module, chaque module se termine par le retour MyModule. Lorsque tout autre script essaie d'obtenir du code dans le module, le retour permet à ce script d'accéder au code stocké dans la table du module.

Ajouter à Scripts de module

Pour ajouter une fonction ou une variable au module qui peut être utilisée dans un autre script, typez le nom de la table du module, suivi d'un point, et le nom de la fonction ou de la variable, comme dans TestModule.myVariable . En utilisant l'opérateur de point, c'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 est renvoyée.


local TestModule = {}
-- Ajoute une variable à la table « TestModule »
TestModule.myVariable = 100
-- Ajoute une fonction à la table 'TestModule'
function TestModule.doTask(player)
-- codede placeholder
end
return TestModule

Scope dans les scripts de module

Pour une fonction de module ou une variable à utiliser dans un script externe, ne pas taper local.

Taper local devant les variables et les fonctions signifie qu'elles ne sont utilisables que par ce script. Bien que ceci soit une bonne pratique pour la plupart des scripts pour réduire les erreurs et les déboguer, vous ne pouvez pas rendre les fonctions et les variables locales.

Tout le code utilisé seulement par ce script de module doit toujours inclure local . Par instance, le code ci-dessous inclut la variable locale difficultyModifier, qui ne peut être utilisée que dans ce script de module, et la fonction 1> GCoinReward()1>, qui peut être utilisée dans les scripts en dehors du 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

Par lui-même, un script de module ne peut pas exécuter de code — il doit être chargé dans un autre script en utilisant le mot-clé require(). La fonction require() accepte un argument, le lieu du script du 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 de module créée dans ce script de module. Pour utiliser les fonctions et les variables de cette table, saisissez le nom de la variable, suivi d'un point, et le nom exact de ce que vous utilisez dans ce script de module, comme MyModule.myFunction(). Lorsque le script s'exécute et atteint cette ligne, il accède à la fonction ou à la variable spécifique stockée dans la table de module.


local MyModule = require(ServerStorage.ModuleScript)
MyModule.myFunction()

Exemple de RewardManager

ModuleScript - Gestionnaire de récompenses

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 - TreasureChestScript

local ServerStorage = game:GetService("ServerStorage")
-- Charger le script du module
local RewardManager = require(ServerStorage.RewardManager)
--Appel de la fonction du script du module
local coins = RewardManager.getCoinReward("easy")
print("Should award " .. coins .. " coins")

Troubleshooting généraux

Certains des conseils ici traitent de problèmes communs lorsque vous travaillez avec des scripts de module. Gardez à l'esprit que les scripts de module peuvent être un sujet complexe avec plus de nuance. Pour plus de détails, voir ce plus guide plus technique sur Module Scripts . 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 peuvent être nommés différemment de la table de module. Problème : Obtenez un message d'erreur comprenant : "attempt to index global" .

  • Dans tout script utilisant un script de module, assurez-vous qu'il est chargé à l'aide de la fonction require(). Si ce n'est pas le cas, cet script ne peut pas utiliser les fonctions et les variables du script de module.

Résumé

Les scripts de module dans Roblox sont un moyen pour les développeurs de gérer et de réutiliser le code. Un script de module est souvent stocké dans ServerStorage (ou ReplicatedStorage pour les interactions client-basées). De là, d'autres scripts peuvent appeler des fonctions et des variables stockées dans ce script de module.

Par instance, un jeu 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, les scripts pour différents types d'objets peuvent simplement appeler la fonction de script du module. Cela réduit le besoin de réutiliser le code entre les scripts, ce qui rend le code plus facile à comprendre et à maintenir.