Aller au contenu
Forma Roblox

Rechercher dans la formation

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

🎯 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é) :

  1. Ouvre ton lieu de test dans Studio.
  2. Dans l’Explorer, survole ServerScriptService et clique sur le bouton ⊕.
  3. Choisis Script. Un nouvel onglet de code s’ouvre.
  4. Studio a déjà écrit une ligne pour toi : print("Hello world!").
  5. Clique sur Play (ou appuie sur F5) pour lancer un test.
  6. 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.

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 à Color sur nil ». Autrement dit, la variable devant .Color ne 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")
  1. Qu’affiche l’Output, et dans quel ordre ?
  2. Que devient la Part à l’écran ? Peut-on encore marcher dessus ?
  3. 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 (et warn) affiche des messages dans l’Output ; les commentaires s’écrivent -- ou --[[ ... ]].
  • script.Parent dé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

Quiz : vérifie tes acquis

7 questions · réussite à partir de 70 % · valide chaque réponse pour voir l’explication

  1. Question 1QCMTu veux qu’un code s’exécute sur le serveur dès le lancement de la partie. Quel type de script choisis-tu, et où le ranges-tu ?
  2. Question 2Vrai ou fauxUn ModuleScript s’exécute automatiquement au lancement du jeu, comme un Script.
  3. Question 3QCMLesquelles de ces lignes sont des commentaires valides en Luau ? (plusieurs réponses possibles)

    Plusieurs réponses possibles : coche toutes les bonnes.

  4. Question 4QCMUn Script est placé directement à l’intérieur d’une Part nommée Lave. Que désigne script.Parent dans ce script ?
  5. Question 5Trouve le bugCe Script, placé dans une plateforme, doit afficher un message puis la rendre orange. L’Output affiche une erreur. Où est le bug ?
    -- Script placé dans une Part du Workspace
    local plateforme = script.Parent
    
    Print("Le script de la plateforme démarre")
    plateforme.Color = Color3.fromRGB(255, 170, 0)
  6. Question 6QCMDans ton projet Rojo, Claude Code a créé le fichier src/ServerScriptService/Bienvenue.client.luau. Le code est juste, mais rien ne s’affiche dans l’Output. Pourquoi ?
  7. Question 7Améliore ce promptTu veux que Claude Code crée ton script de bienvenue. Quelle version du prompt donnera le meilleur résultat ?
    Le prompt de départ
    fais un script qui dit bonjour

    Choisis la meilleure version de ce prompt.