Module 03 · Leçon 1 sur 6
Ton premier script
Découvre les trois types de scripts de Roblox (Script, LocalScript, ModuleScript), où les placer dans Studio et dans ton projet Rojo, et apprends à lire ton premier code Luau.
- ⏱️ 25 min
- 📝 Quiz de 7 questions
- 🔄 Vérifié le 24 octobre 2026
Sur cette page
- Luau, le langage de Roblox
- Les trois types de scripts
- Où placer chaque type de script
- Dans Studio ou dans ton projet Rojo ?
- Ton premier script, pas à pas
- print et les commentaires
- Afficher des messages avec print
- Les commentaires
- script.Parent : agir sur l’objet qui contient le script
- game:GetService : accéder aux services
- Lire une erreur dans l’Output
- Lire ce code comme un relecteur
- Quiz de fin de leçon
🎯 Dans cette leçon, tu vas apprendre à…
- Distinguer Script, LocalScript et ModuleScript
- Savoir où placer chaque type de script, dans Studio comme dans un projet Rojo
- Lire un script simple et prévoir ce qu’il affichera dans l’Output
- Lancer un premier script et comprendre un message d’erreur
Au module 1, tu as construit le premier niveau de l’Obby des Nuages à la main. Il est joli… mais rien ne bouge, rien ne réagit. C’est le rôle des scripts : des fichiers de code qui donnent vie à ton jeu. Au module 2, tu as appris à piloter Claude Code pour qu’il les écrive avec toi ; ce module te donne les clés pour relire ce qu’il produit. On n’y apprend pas du code par cœur : on apprend à comprendre chaque ligne. Dans cette leçon, tu découvres les trois types de scripts, où les ranger, et tes premières lignes de Luau, le langage de Roblox. Ces premiers scripts sont si courts que le plus formateur est de les taper toi-même.
Luau, le langage de Roblox
Luau est un langage de script dérivé de Lua 5.1. Roblox l’a enrichi pour le rendre plus rapide et y a ajouté un typage optionnel (on en reparlera à la fin du module). Si tu trouves un jour un tutoriel « Lua » sur Internet, la plupart des bases seront les mêmes, mais Luau a des fonctionnalités en plus.
Un script, c’est simplement une liste d’instructions que l’ordinateur exécute de haut en bas, une ligne après l’autre. Par exemple : « affiche ce message », « change la couleur de cette Part », « attends une seconde »…
Les trois types de scripts
Dans Studio, quand tu cliques sur le bouton ⊕ à côté d’un objet de l’Explorer (la fenêtre qui montre l’arborescence de ton jeu), tu peux insérer trois sortes de scripts. Ils se ressemblent, mais ils ne s’exécutent pas au même endroit.
| Type | Où s’exécute le code | À quoi il sert |
|---|---|---|
| Script | Sur le serveur (par défaut) | Les règles du jeu : dégâts, checkpoints, sauvegardes, pièces… |
| LocalScript | Sur le client, c’est-à-dire l’appareil du joueur | Ce qui concerne un seul joueur : interface, caméra, touches du clavier… |
| ModuleScript | Nulle part tout seul | Du code réutilisable, chargé par d’autres scripts avec require |
Le serveur, c’est l’ordinateur de Roblox qui fait tourner la partie et que tous les joueurs partagent. Le client, c’est le jeu qui tourne sur l’ordinateur, la tablette ou le téléphone de chaque joueur. Le module 4 est entièrement consacré à cette différence ; pour l’instant, retiens juste : les règles importantes vont dans des Scripts, côté serveur.
Où placer chaque type de script
Un script ne s’exécute que s’il est rangé au bon endroit. C’est la source d’erreur numéro un des débutants.
- Script : il s’exécute s’il se trouve dans un conteneur serveur, comme ServerScriptService (le service prévu pour les scripts serveur) ou Workspace (par exemple à l’intérieur d’une Part).
- LocalScript : il s’exécute dans les conteneurs « Starter » du joueur, comme StarterPlayerScripts, StarterCharacterScripts ou StarterGui. Un LocalScript ne s’exécute pas dans ServerScriptService ni dans ReplicatedStorage.
- ModuleScript : il peut être rangé presque partout (souvent dans ReplicatedStorage ou ServerScriptService), puisqu’il ne fait rien tant qu’un autre script ne le charge pas.
Dans Studio ou dans ton projet Rojo ?
Depuis le module 2, le code de l’Obby des Nuages vit aussi dans des fichiers, que Rojo synchronise avec Studio. Le suffixe du fichier décide du type de script, et le dossier de son emplacement :
| Fichier dans ton projet | Ce que tu obtiens dans Studio |
|---|---|
src/ServerScriptService/Nom.server.luau |
un Script Nom dans ServerScriptService |
src/StarterPlayer/StarterPlayerScripts/Nom.client.luau |
un LocalScript Nom dans StarterPlayerScripts |
src/ReplicatedStorage/Modules/Nom.luau |
un ModuleScript Nom dans ReplicatedStorage.Modules |
C’est la première chose à relire quand Claude Code crée un fichier : un .client.luau dans src/ServerScriptService donnerait un LocalScript qui ne s’exécuterait jamais.
Ton premier script, pas à pas
On va créer un Script côté serveur qui affiche un message. Tape-le toi-même : c’est une seule ligne (et dans Studio, elle est même déjà écrite pour toi).
Dans ton projet Rojo : lance rojo serve et connecte le plugin Rojo dans Studio, comme au module 2. Dans VS Code, crée le fichier src/ServerScriptService/Bienvenue.server.luau, écris dedans print("Hello world!") et enregistre : un Script Bienvenue apparaît dans ServerScriptService. Passe ensuite directement à l’étape 5 ci-dessous.
Directement dans Studio (dans un lieu de test, sans Rojo connecté) :
- Ouvre ton lieu de test dans Studio.
- Dans l’Explorer, survole ServerScriptService et clique sur le bouton ⊕.
- Choisis Script. Un nouvel onglet de code s’ouvre.
- Studio a déjà écrit une ligne pour toi :
print("Hello world!"). - Clique sur Play (ou appuie sur
F5) pour lancer un test. - Regarde la fenêtre Output (la « sortie ») : le texte
Hello world!y apparaît. Si elle n’est pas affichée, ouvre-la depuis le menu Window de Studio (tu as découvert l’interface au module 1).
Bravo, tu viens d’exécuter ton premier programme ! Le message s’affiche dans l’Output, pas à l’écran du joueur : l’Output est la console des développeurs.
print et les commentaires
Afficher des messages avec print
print affiche dans l’Output tout ce que tu lui donnes, séparé par des espaces. C’est ton meilleur outil pour comprendre ce que fait ton code.
-- Script dans ServerScriptService
print("Bienvenue dans l'Obby des Nuages !") -- un texte, entre guillemets
print(42) -- un nombre
print("Étape", 3, "sur", 10) -- plusieurs valeurs d'un coup
warn("Attention : ceci est un avertissement")
warn fonctionne comme print, mais le message est marqué comme un avertissement dans l’Output : pratique pour signaler un problème sans arrêter le script.
Les commentaires
Un commentaire est un texte que Luau ignore complètement. Il sert à expliquer ton code… à toi-même dans trois semaines, ou à un coéquipier.
-- Ceci est un commentaire sur une seule ligne
--[[
Ceci est un commentaire
sur plusieurs lignes.
Pratique pour décrire le rôle d'un script.
]]
print("Ce code s'exécute") -- un commentaire peut aussi suivre du code
script.Parent : agir sur l’objet qui contient le script
Dans un script, le mot script désigne le script lui-même. Comme tout objet de l’Explorer, il a une propriété Parent : l’objet qui le contient. On utilise le point pour accéder à une propriété ou à un enfant : script.Parent, plateforme.Color, plateforme.Transparency…
Essaie ceci : dans le Workspace, sélectionne une plateforme de ton obby, clique sur le bouton ⊕ qui apparaît au survol et insère un Script directement dedans.
-- Script placé DANS une Part du Workspace (une plateforme de l'obby)
local plateforme = script.Parent -- la Part qui contient ce script
print("Je suis le script de :", plateforme.Name)
-- On modifie quelques propriétés de la Part
plateforme.Color = Color3.fromRGB(255, 170, 0) -- orange (rouge, vert, bleu de 0 à 255)
plateforme.Transparency = 0.3 -- un peu transparente (0 = opaque, 1 = invisible)
plateforme.Material = Enum.Material.Neon -- matériau lumineux
Lance le jeu : la plateforme devient orange, lumineuse et légèrement transparente. Le mot local crée une variable, une sorte d’étiquette qui retient une valeur ; on l’étudie en détail dans la leçon suivante.
game:GetService : accéder aux services
Tout ton jeu est rangé dans un objet racine nommé game. Ses enfants principaux sont des services : Workspace, Players, ReplicatedStorage, ServerScriptService… Pour en récupérer un, la méthode recommandée est game:GetService("NomDuService").
-- Script dans ServerScriptService
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
print("Nombre de joueurs connectés :", #Players:GetPlayers())
print("Le Workspace contient", #Workspace:GetChildren(), "objets")
print("Service récupéré :", ReplicatedStorage.Name)
Pourquoi GetService plutôt que game.Players ? Parce que GetService trouve le service par son nom de classe, même quand le nom de l’objet est inhabituel (c’est le cas de RunService, par exemple), et le crée s’il n’existe pas encore. C’est la convention utilisée dans toute la documentation Roblox et dans toute cette formation.
Remarque les deux notations :
- le point
.accède à une propriété ou à un enfant :script.Parent,ReplicatedStorage.Name; - les deux-points
:appellent une méthode, une fonction qui appartient à l’objet :game:GetService(...),Players:GetPlayers(). On comprendra pourquoi à la leçon 6.
Lire une erreur dans l’Output
Tout le monde fait des erreurs, même les développeurs expérimentés. Ce qui compte, c’est de savoir lire le message. Voici un script volontairement faux :
-- Script dans ServerScriptService (volontairement faux, pour voir l'erreur)
local Workspace = game:GetService("Workspace")
local plateforme = Workspace:FindFirstChild("PlateformeQuiNExistePas")
plateforme.Color = Color3.fromRGB(255, 0, 0) -- plateforme vaut nil ici !
FindFirstChild cherche un enfant par son nom et renvoie nil (« rien ») s’il ne le trouve pas. À la ligne 5, on essaie donc de changer la couleur de… rien. L’Output affiche alors un message qui ressemble à ceci :
ServerScriptService.Script:5: attempt to index nil with 'Color'
Décortiquons-le :
ServerScriptService.Script: le chemin du script fautif dans l’Explorer ;:5:: le numéro de la ligne où l’erreur s’est produite ;attempt to index nil with 'Color': « tentative d’accéder àColorsurnil». Autrement dit, la variable devant.Colorne contient rien.
Quand une erreur se produit, le script s’arrête à cette ligne : tout ce qui suit n’est pas exécuté. C’est pour ça qu’une seule erreur peut « casser » tout un système.
Quelques messages que tu verras souvent :
| Message (en anglais dans l’Output) | Ce que ça veut dire |
|---|---|
attempt to index nil with '...' |
Tu utilises une variable qui vaut nil (objet introuvable, faute de frappe dans un nom…) |
attempt to call a nil value |
Tu appelles une fonction qui n’existe pas (souvent une faute de frappe : Print au lieu de print) |
... is not a valid member of ... |
Le nom de l’enfant ou de la propriété est faux ou mal orthographié |
Infinite yield possible on ... |
Un WaitForChild attend un objet qui n’arrive pas (avertissement, leçon 5) |
Lire ce code comme un relecteur
Quand Claude Code te propose un script, lis-le avant de le lancer : prévois ce qu’il va faire, puis vérifie en Play. Entraîne-toi sur cet extrait. Les réponses de ces exercices citent des numéros de ligne : ce sont ceux affichés à gauche de chaque extrait (la première ligne, ici le commentaire du haut, est la ligne 1 ; les lignes vides comptent aussi). Dans l’éditeur de Studio et dans VS Code, ces numéros s’affichent à gauche du code.
-- Script placé DANS une Part nommée « Nuage » du Workspace
local plateforme = script.Parent
print("Début")
-- print("Étape 1")
print("Je suis :", plateforme.Name)
plateforme.Transparency = 1
--[[
print("Fin")
]]
warn("Plateforme cachée")
- Qu’affiche l’Output, et dans quel ordre ?
- Que devient la Part à l’écran ? Peut-on encore marcher dessus ?
- Que se passe-t-il si quelqu’un déplace ce Script dans ServerScriptService ?
Ce qu’il faut retenir
- Un Script s’exécute sur le serveur (ServerScriptService, Workspace), un LocalScript sur le client (StarterPlayerScripts, StarterGui…), un ModuleScript seulement quand on le charge avec
require. Avec Rojo, le suffixe (.server.luau,.client.luau,.luau) décide du type : relis-le dans chaque fichier créé par l’IA. print(etwarn) affiche des messages dans l’Output ; les commentaires s’écrivent--ou--[[ ... ]].script.Parentdésigne l’objet qui contient le script ; le point.accède aux propriétés et aux enfants.- On récupère les services avec
game:GetService("NomDuService"). - Un message d’erreur indique le script, la ligne et la cause ; le script s’arrête à cette ligne.
- Avant de lancer un script (le tien ou celui de l’IA), prévois ce que l’Output affichera, puis vérifie.
Sources et pour aller plus loin
- Script types and locations — documentation Roblox
- Create a script — tutoriel officiel Roblox
- Comments — documentation Luau de Roblox
- Output window — documentation Roblox
- Roblox globals (script, game, workspace…) — référence API
- ServiceProvider:GetService — référence API
- Scripting — vue d’ensemble Roblox
- Rojo — Sync Details (suffixes
.server,.clientet modules) - Rojo — Project Format (
$ignoreUnknownInstances,emitLegacyScripts)