Tutoriel · Bases du scripting

Comment scripter sur Roblox Studio : le guide du débutant

Scripter, ou coder, sur Roblox Studio, c'est écrire du Luau, la version de Roblox du langage Lua, dans des scripts que tu ajoutes à ton jeu. Ce guide part d'une Baseplate vide : tu ouvres la fenêtre Output, tu écris un premier script, tu modifies une part depuis le code, tu réagis quand un joueur marche sur un pad et tu essaies un LocalScript, en apprenant au passage les variables, les fonctions, les conditions if, les boucles et les événements.

Mis à jour le 26 octobre 202624 min de lecture

En bref

Pour scripter sur Roblox Studio, survole ServerScriptService dans l'Explorer, clique sur + et insère un Script. Studio l'ouvre dans le Script Editor. Tape du Luau, comme print("Hello"), appuie sur Play (F5) et lis le résultat dans la fenêtre Output (menu Window ou onglet Script). Un Script tourne sur le serveur et change les choses pour tout le monde ; un LocalScript dans StarterPlayerScripts tourne sur l'appareil d'un seul joueur.

  • Apprends d'abord quatre idées : les variables (local coins = 3), les fonctions (local function name() ... end), les conditions if et les événements (part.Touched:Connect(...)). Les quatre scripts de ce guide sont faits de ces éléments, plus des boucles et des tables.
  • Utilise task.wait(), pas wait(). La référence de Roblox marque le wait() global comme déprécié et remplacé par task.wait().
  • Dans les options d'affichage de la fenêtre Output, active Show Context pour que chaque ligne indique si elle vient du Server ou d'un Client.
Sur cette page
  1. Avant de commencer
  2. 1. Premier script
  3. 2. Changer une part
  4. 3. Événements
  5. 4. Premier LocalScript
  6. 5. Tester
  7. Où vont les scripts
  8. Lire les erreurs
  9. Anciens tutoriels
  10. Entraînement
  11. La suite
  12. Problèmes courants
  13. Avec RoCode
  14. Questions fréquentes
  15. Sources et lectures

Avant de commencer : Studio, une Baseplate et la fenêtre Output

Illustration animéeLes quatre scripts dans un seul test : la part ColourChanger change de couleur chaque seconde, marcher sur le Pad le rend jaune pendant 2 secondes pour tous les joueurs et met ton nom dans l'Output, et E fait pâlir le Pad sur cet écran seulement.

Il te faut Roblox Studio et un compte Roblox, rien d'autre : ni éditeur de code ni plugin. Chaque script de ce guide se tape dans le Script Editor de Studio.

  1. Installe Roblox Studio, l'application gratuite de Roblox pour Windows et Mac, et connecte-toi avec ton compte Roblox.
  2. Ouvre Studio. Sa page d'accueil liste des modèles : choisis Baseplate. Tu obtiens un sol avec une texture en grille 4x4 et une SpawnLocation, l'endroit où ton avatar apparaît quand tu joues.
  3. Si les fenêtres Explorer (explorateur) et Properties (propriétés) ne sont pas affichées, ouvre-les depuis le menu Window ou l'onglet Home. L'Explorer liste chaque objet de ton jeu ; Properties montre les réglages de ce que tu sélectionnes.
  4. Ouvre Output (sortie) depuis le menu Window ou l'onglet Script. C'est là qu'apparaissent les messages et les erreurs de tes scripts.
  5. Dans les options d'affichage de la fenêtre Output, active Show Context, qui marque chaque message Client ou Server, et Show Source, qui montre le script et le numéro de ligne qui l'ont produit.
Les quatre scripts que tu vas écrire
ScriptTypeOù il vaCe qu'il apprend
FirstScriptScriptServerScriptServiceVariables, une fonction, une condition if, des boucles et une table
ColourChangerScriptDans une Part de WorkspaceChanger des propriétés, script.Parent et une boucle qui attend
TouchPadScriptDans une Part nommée PadLes événements, trouver le joueur qui a touché une part, et un debounce
MyFirstLocalScriptLocalScriptStarterPlayerScripts, dans StarterPlayerDu code qui tourne sur l'appareil d'un joueur, les touches, et ce qui reste sur cet appareil
L'Explorer à la fin (seulement les objets que ce guide utilise)
Workspace
  Baseplate Part
  SpawnLocation SpawnLocation
  Part Part new
    ColourChanger Script new
  Pad Part new
    TouchPad Script new
ServerScriptService
  FirstScript Script new
StarterPlayer
  StarterPlayerScripts
    MyFirstLocalScript LocalScript new

Étape 1 : écrire ton premier script

  1. Dans l'Explorer, survole ServerScriptService, clique sur le bouton + et choisis Script (le raccourci est Ctrl+I, ou ⌘I sur Mac). Studio crée le script et l'ouvre dans le Script Editor.
  2. Fais un clic droit sur le nouveau script, choisis Rename et nomme-le FirstScript. Le nom ne change pas ce que fait le script, mais il te dit quel script a affiché quoi.
  3. Les nouveaux scripts commencent par une ligne, print("Hello world!"). Supprime-la et colle le code ci-dessous.
  4. Appuie sur Play (F5), avec Test choisi dans le menu à sa gauche. Studio lance un test et place ton avatar sur la SpawnLocation.
  5. Lis les lignes dans l'Output, puis appuie sur Stop (Maj+F5). Stop remet aussi chaque objet comme il était avant que tu appuies sur Play, donc tout ce que tu as déplacé ou recoloré en jouant revient en place.
Script dans ServerScriptService nommé FirstScript
-- Script dans ServerScriptService, nommé FirstScript.
-- Ton premier Luau : des variables, une fonction, une condition if, une boucle et une table.
-- Appuie sur Play (F5) et lis les résultats dans la fenêtre Output.

-- Une variable est un nom qui contient une valeur
local gameName = "Coin Run"
local coinsToWin = 3

-- Une fonction est un bloc de code nommé que tu peux exécuter autant de fois que tu veux.
-- name et goal sont ses paramètres ; return renvoie une valeur à celui qui l'appelle.
local function describe(name: string, goal: number): string
	return `{name}: collect {goal} coins to win`
end

print(describe(gameName, coinsToWin)) --> Coin Run: collect 3 coins to win

-- Une condition if n'exécute du code que quand sa condition est vraie
if coinsToWin > 5 then
	print("That is a long game")
elseif coinsToWin > 1 then
	print("That is a short game")
else
	print("One coin and you win")
end

-- Une boucle for répète du code un nombre de fois donné
for count = 1, coinsToWin do
	print("Coin number", count)
end

-- Une table contient une liste de valeurs ; cette boucle les parcourt une par une, dans l'ordre
local colours = { "Red", "Green", "Blue" }
for position, colour in colours do
	print(position, colour) --> 1 Red, puis 2 Green, puis 3 Blue
end

Tout ce qui suit -- sur une ligne est un commentaire : Luau l'ignore, donc tu peux te laisser des notes. Les commentaires --> montrent ce qu'affiche cette ligne.

L'Output doit montrer ces huit lignes, mêlées à d'éventuels messages de Studio lui-même. Quand print reçoit plusieurs valeurs, il met un espace entre elles. Avec Show Context et Show Source activés, chaque ligne est aussi marquée Server et FirstScript avec un numéro de ligne.

Output (attendu)
Coin Run: collect 3 coins to win
That is a short game
Coin number 1
Coin number 2
Coin number 3
1 Red
2 Green
3 Blue

Associe chaque ligne au code qui l'a affichée. Tu feras la même chose avec les messages d'erreur plus tard, donc l'habitude vaut le coup dès maintenant.

FirstScript n'utilise que du Luau simple, sans objets Roblox, donc il tourne aussi dans le terrain de jeu Luau gratuit, dans ton navigateur. Change une valeur et relance pour voir ce qui change.

Ce que fait chaque partie de FirstScript
CodeIdéeCe que ça veut dire
local gameName = "Coin Run"VariableUn nom qui contient une valeur. local veut dire que seul ce script, ou le bloc où il se trouve, peut l'utiliser. Du texte entre guillemets est une chaîne (string) ; 3 est un nombre. Les noms sont sensibles à la casse, donc coinsToWin et CoinsToWin sont deux variables différentes.
local function describe(name: string, goal: number): stringFonctionUn bloc de code nommé que tu peux exécuter autant de fois que tu veux. name et goal sont ses paramètres : des valeurs transmises à chaque appel. : string et : number sont des annotations de type facultatives. Luau s'en sert pour te signaler des erreurs dans le Script Editor ; le code tourne pareil sans elles.
returnValeur de retourRenvoie une valeur au code qui a appelé la fonction. print(describe(gameName, coinsToWin)) affiche ce que renvoie describe.
`{name}: collect {goal} coins to win`Interpolation de chaîneLe texte entre accents graves peut contenir des valeurs : Luau remplace {name} et {goal} par leurs valeurs actuelles.
if, elseif, else, endCondition ifLuau teste les conditions de haut en bas et n'exécute que la première qui est vraie. coinsToWin vaut 3, ce qui n'est pas plus que 5 mais plus que 1, donc seul « That is a short game » s'affiche.
for count = 1, coinsToWin doBoucle for numériqueExécute le code à l'intérieur une fois pour chaque nombre de 1 à coinsToWin, avec count qui vaut 1, puis 2, puis 3.
{ "Red", "Green", "Blue" } et for position, colour in colours doTable et boucleUne table utilisée comme liste, que Luau appelle un tableau (array). Les positions commencent à 1, pas à 0. La boucle parcourt chaque élément et te donne sa position et sa valeur.

Chaque bloc qui s'ouvre par function, if, for ou while se ferme par end. Un seul end manquant empêche tout le script de tourner ; lire les erreurs montre le message que tu obtiens.

Étape 2 : changer une part depuis un script

Les scripts deviennent utiles quand ils changent des choses dans le monde. Les réglages que tu vois dans la fenêtre Properties, comme Color, Transparency ou Anchored d'une part, sont des propriétés, et un script peut aussi les régler.

  1. Dans l'onglet Home, clique sur Part. Studio ajoute un bloc dans le Workspace. Son nom n'a pas d'importance.
  2. Dans l'Explorer, survole la nouvelle part, clique sur + et insère un Script. Renomme-le ColourChanger et remplace son contenu par le code ci-dessous.
  3. Appuie sur Play. La part devient rouge, puis bleue, puis verte, en changeant une fois par seconde, et recommence.
Script dans une Part de Workspace nommé ColourChanger
-- Script dans une Part de Workspace, nommé ColourChanger.
-- Les scripts changent les mêmes propriétés que celles de la fenêtre Properties.
-- Celui-ci donne une nouvelle couleur à sa part chaque seconde, pour tous les joueurs.

local part = script.Parent :: BasePart -- la part dans laquelle se trouve ce script

local colours = {
	Color3.fromRGB(255, 85, 85), -- rouge
	Color3.fromRGB(85, 170, 255), -- bleu
	Color3.fromRGB(85, 255, 127), -- vert
}

part.Anchored = true -- une part ancrée reste là où tu l'as mise

local index = 1
while true do
	part.Color = colours[index]
	index = index % #colours + 1 -- 1, 2, 3, puis retour à 1
	task.wait(1) -- pause d'une seconde (l'ancien wait() est déprécié)
end
  • script.Parent est l'objet dans lequel se trouve le script, ici la part. Glisse le script dans une autre part et c'est celle-là qu'il change.
  • :: BasePart est une conversion de type. Elle dit au Script Editor que le parent est une part, pour qu'il puisse vérifier les propriétés que tu utilises dessus. Luau n'utilise les types que pour les avertissements et les suggestions, donc la conversion ne change pas ce que fait la ligne.
  • part.Color et part.Anchored sont les mêmes propriétés que dans la fenêtre Properties, avec les mêmes noms. Roblox utilise l'orthographe américaine, donc la propriété s'appelle Color même si ce script s'appelle ColourChanger.
  • Anchored = true garde la part immobile : la référence de Roblox dit qu'une part ancrée ne bouge jamais à cause de la gravité, des collisions ou de toute autre physique.
  • colours[index] lit un élément de la liste. #colours est la longueur de la liste, 3, et % donne le reste d'une division, donc index % #colours + 1 compte 1, 2, 3, 1, 2, 3.
  • while true do répète à l'infini, c'est pourquoi le task.wait(1) à l'intérieur compte. La documentation de Roblox dit de toujours mettre une pause comme task.wait() dans une boucle infinie : sans elle, le jeu se fige et Studio plante.

ColourChanger est un Script, donc il tourne sur le serveur, et tous les joueurs du jeu voient la même couleur au même moment. L'étape 4 montre l'autre type de script.

Étape 3 : réagir à un joueur avec un événement

La plupart du code de jeu attend que quelque chose se passe : un joueur arrive, une part est touchée, un bouton est cliqué. Roblox appelle ça des événements. Pour exécuter du code quand l'un d'eux se déclenche, tu y connectes une fonction.

  1. Insère une autre Part et renomme-la exactement Pad, avec un P majuscule. Laisse-la directement dans le Workspace, pas dans un dossier ni un modèle, parce que le LocalScript de l'étape 4 la cherche là.
  2. Fais-en un pad plat sur lequel tu peux marcher, par exemple en réglant sa Size sur 6, 1, 6 dans la fenêtre Properties. Pose-la sur le sol près de la SpawnLocation et coche Anchored pour qu'elle reste en place.
  3. Survole Pad, clique sur +, insère un Script, renomme-le TouchPad et colle le code ci-dessous.
  4. Appuie sur Play et marche sur le pad. Il devient jaune pendant 2 secondes, et l'Output affiche ton nom.
Script dans Workspace.Pad nommé TouchPad
-- Script dans une Part de Workspace nommée Pad, script nommé TouchPad.
-- Événements : quand un joueur marche sur le pad, il brille en jaune et l'Output dit qui c'était.
-- Un debounce l'empêche de s'exécuter plusieurs fois par seconde tant que le joueur reste dessus.

local Players = game:GetService("Players")

local pad = script.Parent :: BasePart
local COOLDOWN_SECONDS = 2

local normalColour = pad.Color
local busy = false

local function onTouched(otherPart: BasePart)
	if busy then
		return -- encore en attente depuis le dernier contact
	end
	-- Le personnage est le Model qui contient la partie du corps (ou le chapeau) qui a touché le pad
	local character = otherPart:FindFirstAncestorOfClass("Model")
	local player = character and Players:GetPlayerFromCharacter(character)
	if not player then
		return -- une part libre ou un PNJ l'a touché, pas un joueur
	end

	busy = true
	print(`{player.Name} stepped on the pad`)
	pad.Color = Color3.fromRGB(255, 220, 0)
	task.wait(COOLDOWN_SECONDS)
	pad.Color = normalColour
	busy = false
end

pad.Touched:Connect(onTouched)
Comment TouchPad passe d'un contact à un joueur
CodeCe qu'il fait
pad.Touched:Connect(onTouched)Connecte la fonction à l'événement Touched du pad, donc Roblox exécute onTouched chaque fois que quelque chose touche le pad, et lui passe la part qui l'a touché.
otherPartLa part qui a touché le pad : un pied, une jambe, la poignée d'un chapeau, ou un outil que tient le joueur. Ce n'est jamais le joueur, donc les deux lignes suivantes trouvent à qui elle appartient.
otherPart:FindFirstAncestorOfClass("Model")Remonte depuis cette part jusqu'au premier ancêtre dont la classe est exactement Model, c'est-à-dire le personnage. Comme le nom de classe doit correspondre exactement, il passe par-dessus un chapeau (classe Accessory) et un outil tenu (classe Tool).
Players:GetPlayerFromCharacter(character)Renvoie le Player dont ce modèle est le personnage, ou nil si ce n'est le personnage de personne, comme un PNJ. Le character and devant saute l'appel quand aucun modèle n'a été trouvé, ce qui laisse player à nil.
if not player then return endS'arrête ici pour tout ce qui n'est pas un joueur. return sort de la fonction plus tôt.

Pourquoi le pad a besoin d'un debounce

La page de Roblox sur le debounce prévient que Touched se déclenche plusieurs fois très rapidement quand des parts entrent en contact, et un personnage qui marche a plusieurs parties du corps. Sans vérification, un seul pas sur le pad pourrait afficher beaucoup de lignes et relancer la lueur jaune encore et encore.

La variable busy est le debounce. Le premier contact la met à true, et chaque contact pendant les 2 secondes suivantes arrive sur if busy then return end et s'arrête. Après task.wait(COOLDOWN_SECONDS), le pad reprend sa couleur et busy repasse à false. COOLDOWN_SECONDS est écrit en majuscules parce que c'est un réglage qui ne change pas pendant le jeu, la convention de nommage que Roblox suggère pour les constantes.

Ce pad a un seul debounce pour tout le monde, donc un deuxième joueur qui marche dessus pendant ces 2 secondes est ignoré. C'est très bien pour un pad qui brille. Un pad qui donne des récompenses doit plutôt garder un temps de recharge par joueur, comme le pad à pièces du guide du classement (en anglais).

Étape 4 : ton premier LocalScript, et pourquoi il est différent

Un jeu en cours, c'est un serveur plus un client par joueur. Tout jusqu'ici était un Script, qui tourne sur le serveur, donc ses modifications atteignent tous les joueurs. Un LocalScript tourne plutôt sur l'appareil d'un seul joueur. Les touches, la caméra et les menus à l'écran sont gérés là, parce que seul cet appareil les connaît.

  1. Dans l'Explorer, déplie StarterPlayer, survole StarterPlayerScripts, clique sur + et insère un LocalScript. Renomme-le MyFirstLocalScript et colle le code ci-dessous.
  2. Appuie sur Play. L'Output montre Hello, et ton nom, marqué Client.
  3. Clique dans la vue du jeu et appuie sur E. Le pad pâlit. Appuie de nouveau sur E pour le faire revenir.
  4. Pendant que le test tourne encore, clique sur le bouton Client/Server des commandes de test de Studio pour passer à la copie du jeu côté serveur. Le pad y est opaque : le serveur n'a jamais entendu parler du changement.
LocalScript dans StarterPlayerScripts nommé MyFirstLocalScript
-- LocalScript dans StarterPlayer > StarterPlayerScripts, nommé MyFirstLocalScript.
-- Un LocalScript tourne sur l'appareil d'un joueur. Appuie sur E : le Pad pâlit sur ton
-- écran seulement, car un changement de part fait ici n'atteint ni le serveur ni les autres.

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")

local player = Players.LocalPlayer
print(`Hello, {player.Name}`) -- apparaît dans l'Output, marqué Client

UserInputService.InputBegan:Connect(function(input: InputObject, gameProcessed: boolean)
	if gameProcessed then
		return -- la touche a servi à autre chose, par exemple écrire dans le chat
	end
	if input.KeyCode == Enum.KeyCode.E then
		local pad = workspace:FindFirstChild("Pad")
		if pad and pad:IsA("BasePart") then
			pad.Transparency = if pad.Transparency == 0 then 0.6 else 0
		end
	end
end)
  • Players.LocalPlayer est le joueur dont l'appareil exécute le script. Roblox ne le définit que pour les LocalScripts et les ModuleScripts qu'ils chargent, donc le code serveur ne peut pas l'utiliser.
  • UserInputService.InputBegan se déclenche quand le joueur commence un appui de touche, un clic ou un toucher. gameProcessed vaut true quand le moteur a déjà utilisé cette entrée, par exemple un clic sur un bouton ou une touche tapée dans la barre de chat, donc le script l'ignore.
  • workspace:FindFirstChild("Pad") renvoie l'enfant nommé Pad, ou nil s'il n'y en a pas. pad:IsA("BasePart") vérifie que c'est vraiment une part avant que le script change sa Transparency.
  • if pad.Transparency == 0 then 0.6 else 0 est une expression if : elle choisit l'une de deux valeurs. Une Transparency de 0 est complètement visible et 1 est invisible.
  • Un script de sprint avec Maj (en anglais) fait un bon deuxième LocalScript : il écoute une touche et change la WalkSpeed de ton personnage.
Script, LocalScript et ModuleScript
TypeTourne surSes changements atteignentSert àVa en général dans
ScriptLe serveurTous les joueursLes règles du jeu : pièces, dégâts, portes, manches, sauvegardeServerScriptService, ou dans une part pendant que tu apprends
LocalScriptL'appareil d'un joueurCet appareil seulement, sauf le mouvement de son propre personnageLes entrées, la caméra, les menus à l'écran, les effets pour un joueurStarterPlayerScripts ou StarterGui
ModuleScriptLe côté qui appelle require() dessusLes mêmes que le script qui l'a chargéDu code partagé par plusieurs scriptsReplicatedStorage pour les deux côtés, ServerScriptService pour le serveur seulement

Ce qu'un tricheur peut changer

Pars du principe qu'un tricheur contrôle tout sur son propre appareil. Il peut exécuter ses propres LocalScripts et modifier les tiens, donc il peut faire pâlir le pad, ou n'importe quoi d'autre, sur son propre écran. Ici, c'est sans danger : l'effet est purement visuel et reste sur son appareil. C'est aussi la raison pour laquelle tout ce qui compte est décidé par un Script sur le serveur.

Un Script serveur n'est pas non plus automatiquement sûr. TouchPad tourne sur le serveur, mais l'appareil de chaque joueur contrôle la physique de son propre personnage, et la documentation de sécurité de Roblox liste la manipulation du moment où Touched se déclenche, ou l'empêcher de se déclencher, parmi ce qu'un client peut faire avec les parts qu'il contrôle. Pour un pad qui brille, ça n'a pas d'importance. Pour un pad qui paie, vérifie aussi quelque chose que le serveur suit lui-même, comme la règle du guide de l'obby (en anglais) selon laquelle les points de passage ne comptent que dans l'ordre.

Étape 5 : tester les quatre scripts ensemble

  1. Vide l'Output avec Ctrl+K (⌘K sur Mac) et appuie sur Play (F5). L'Output montre les huit lignes de FirstScript marquées Server, et ta ligne Hello marquée Client. La part ColourChanger change de couleur chaque seconde.
  2. Marche sur le pad. Il devient jaune pendant 2 secondes et l'Output montre une fois ton nom et « stepped on the pad ». Continue à marcher dessus : une nouvelle ligne apparaît au plus une fois toutes les 2 secondes, pas à chaque déclenchement de Touched.
  3. Appuie sur E. Le pad passe à une Transparency de 0.6. Appuie de nouveau sur E et il redevient opaque.
  4. Appuie sur Stop. Dans le menu de test, choisis Server & Clients, règle 2 clients et appuie sur Play (ou F7). Studio ouvre une fenêtre serveur et deux fenêtres client. Dans un client, appuie sur E : le pad pâlit là, alors que l'autre client et le serveur le montrent toujours opaque. Appuie sur End Session quand tu as fini.
  5. Casse quelque chose exprès. Renomme Pad en Pad2 et joue. Marcher dessus le rend toujours jaune, parce que TouchPad trouve sa part avec script.Parent, pas par son nom. Appuyer sur E ne fait plus rien, et il n'y a pas d'erreur : FindFirstChild("Pad") a renvoyé nil, et la vérification if pad and ... a sauté le reste sans bruit. Ajoute print(pad) sur la ligne après FindFirstChild, joue et appuie sur E : l'Output montre nil. Un print comme celui-ci est le moyen le plus rapide de savoir pourquoi un script ne fait rien. Arrête, supprime la ligne du print et renomme la part en Pad.

Où vont les scripts

L'endroit où se trouve un script décide s'il tourne ou non, et Studio ne te prévient pas quand il ne tournera jamais. Pour les scripts que tu vas écrire ensuite :

Où mettre chaque type de script
ConteneurÀ mettre iciPourquoi
ServerScriptServiceLes Scripts avec la plupart des règles de ton jeu : récompenses, manches, sauvegardeIls tournent sur le serveur, et rien dans ServerScriptService n'est envoyé aux joueurs.
Dans une part de WorkspaceUn Script qui appartient à cette seule part, comme ColourChanger et TouchPadTrès bien pendant que tu apprends : la part est script.Parent. Pour de vrais projets, Roblox conseille plutôt de taguer les parts (voir plus bas).
StarterPlayerScripts, dans StarterPlayerLa plupart des LocalScripts : entrées, caméra, effets pour un joueurChaque joueur en reçoit sa propre copie en arrivant.
StarterGuiLes LocalScripts dans une ScreenGui qui font marcher un menu à l'écranChaque joueur reçoit sa propre copie de l'interface.
ReplicatedStorageLes ModuleScripts que chargent à la fois le code serveur et le code clientLes deux côtés peuvent le voir. Un LocalScript, ou un Script avec les réglages par défaut, placé ici ne tourne jamais.

La page de Roblox sur l'emplacement des scripts recommande de ne pas mettre de scripts directement dans les parts de Workspace : tague plutôt les parts et gère-les depuis un seul ModuleScript avec CollectionService. Un script dans une part reste le moyen le plus simple de commencer, et c'est très bien pour un ou deux objets pendant que tu apprends. Le guide des portes montre la méthode avec des tags, avec un seul script pour toutes les portes, et le guide client et serveur a le tableau complet des conteneurs et des scripts qui y tournent (guides en anglais).

Quand ça ne marche pas : lis l'Output

Les erreurs apparaissent en rouge dans l'Output. Chacune commence par l'endroit où elle s'est produite, le nom complet du script et le numéro de ligne, puis dit ce qui n'a pas marché. Clique sur l'erreur et Studio ouvre ce script à cette ligne. Par exemple, si tu avais supprimé la vérification if not player de TouchPad et qu'une part libre tombait sur le pad, l'Output afficherait :

Output (exemple)
Workspace.Pad.TouchPad:22: attempt to index nil with 'Name'

Les fautes dans l'écriture du code, comme un end manquant, apparaissent avant même que tu appuies sur Play : le Script Editor les souligne en rouge, et la fenêtre Script Analysis (le bouton Analysis de l'onglet Script) les liste. Un script avec l'une de ces fautes ne tourne pas du tout, pas même les lignes au-dessus.

Trois erreurs à reconnaître
MessageCe que ça veut direSolution
Colour is not a valid member of Part "Workspace.Part"Rien avec ce nom exact n'existe sur cet objet. Ici, la propriété s'écrit Color.Reprends l'orthographe et les majuscules de la fenêtre Properties ou de l'Explorer. Plus sur cette erreur (en anglais).
attempt to index nil with 'Name'Le code a lu quelque chose, ici .Name, sur une valeur qui valait nil. Dans l'exemple ci-dessus, player valait nil parce qu'une part libre a touché le pad.Trouve pourquoi la valeur est nil, et vérifie-la avec if avant de l'utiliser. Plus sur cette erreur (en anglais).
Expected 'end' (to close 'then' at line 2), got <eof>Le if de la ligne 2 n'a pas de end correspondant. Pour une fonction, le message dit to close 'function', et <eof> veut dire la fin du fichier.Ajoute le end manquant, en regardant la ligne indiquée entre parenthèses plutôt que la dernière ligne. Parfois le message se termine par « did you forget to close ... at line N? ». Cette partie est une supposition de Luau à partir de ton indentation et peut viser le mauvais bloc, donc vérifie d'abord la ligne entre parenthèses. Plus sur les erreurs de syntaxe (en anglais).

Quand un script ne fait rien et que l'Output n'affiche rien non plus, il est en général à un endroit où il ne tourne jamais, ou il attend un événement qui ne se déclenche jamais. Le guide des erreurs de script a une liste de vérification pour les scripts silencieux, et va plus loin sur la lecture de l'Output (en anglais).

Ce que les anciens tutoriels font autrement

Si tu apprends aussi avec des vidéos et des posts de forum, tu croiseras des méthodes plus anciennes. Voici celles qui comptent, avec la raison pour laquelle chacune pose problème.

Les méthodes des anciens tutoriels, et ce que fait ce guide à la place
Le tutorielLe problèmeCe guide
Fait des pauses avec wait(1)La référence de Roblox marque le wait() global comme déprécié et dit que task.wait() l'a remplacé.task.wait(1)
Trouve le personnage avec otherPart.Parent, comme la leçon sur la lave de RobloxQuand un chapeau ou un outil tenu touche la part, otherPart.Parent est l'Accessory ou le Tool, pas le personnage, donc aucun Humanoid n'est trouvé et ce contact est raté.FindFirstAncestorOfClass("Model"), puis GetPlayerFromCharacter
Utilise Touched sans debounceTouched se déclenche plusieurs fois très vite pour un seul pas, donc le code s'exécute encore et encore.Un drapeau busy et un temps de recharge
Met un LocalScript dans une part de WorkspaceUn LocalScript n'y tourne jamais. Il ne tourne que depuis des endroits qui appartiennent à un joueur.Les LocalScripts dans StarterPlayerScripts (pourquoi, en anglais)
Écrit part.Touched:connect(...) ou table.getn(list)Le guide de nommage de Roblox dit que les API en camelCase sont pour la plupart dépréciées, et la référence ne liste que Connect. table.getn est déprécié au profit de #list.:Connect(...) et #list
Change les pièces ou inflige des dégâts dans un LocalScriptLe changement reste sur l'appareil de ce joueur, donc personne d'autre ne le voit et le serveur ne le compte jamais.Les règles du jeu dans des Scripts sur le serveur

Entraînement : trois modifications à essayer

Modifier du code apprend plus que le lire. Essaie ces modifications dans ton propre jeu, une à la fois, et appuie sur Play après chacune.

  • Fais donner un point au pad. Ajoute le script Leaderstats de l'étape 1 du guide du classement (en anglais). Puis, dans TouchPad, après busy = true, trouve le dossier leaderstats du joueur et ajoute 1 à sa valeur Coins. Indice : player:FindFirstChild("leaderstats"), puis leaderstats:FindFirstChild("Coins"), puis coins.Value += 1. Le pad à pièces du guide du classement en est une version finie, avec un temps de recharge par joueur.
  • Fais aussi pâlir le changeur de couleur. Fais en sorte que ColourChanger change aussi la Transparency de la part chaque seconde. Indice : ajoute une deuxième table de nombres entre 0 et 1, comme { 0, 0.3, 0.6 }, et règle part.Transparency à partir d'elle sur la ligne après part.Color, avec le même index.
  • Affiche la couleur du pad. Fais en sorte que MyFirstLocalScript affiche la Color du pad quand tu appuies sur E. Indice : print(pad.Color) dans le bloc if pad and pad:IsA("BasePart"). Appuie sur E pendant que le pad est jaune : le client voit la couleur réglée par le serveur, parce que les changements faits sur le serveur atteignent tous les clients.

Quoi apprendre ensuite

Tu as maintenant utilisé les pièces dont la plupart des scripts de jeu sont faits. Un bon ordre pour la suite (guides en anglais, sauf le premier jeu) :

  1. LocalScript vs Script vs ModuleScript : où tourne chaque type de script et ce qu'il peut changer, plus en détail que l'étape 4.
  2. RemoteEvents : comment un LocalScript demande au serveur de faire quelque chose, et comment le serveur vérifie la demande.
  3. Un classement : tes premières statistiques, créées et modifiées sur le serveur.
  4. Ton premier jeu : un court parcours de pièces avec de la lave, des pièces et un pad d'arrivée, géré par deux scripts serveur, puis publié.
  5. Ensuite, choisis un système à ajouter : une boutique, un système de manches, des points de passage d'obby, un écran de chargement ou une animation sur une touche. Quand quelque chose casse, le guide des erreurs de script t'aide à lire le message.

Les tutoriels Coding fundamentals de Roblox (en anglais) sont un bon complément : six séries qui vont des variables et des fonctions aux conditions, aux boucles, aux tableaux et dictionnaires, jusqu'à l'organisation du code avec des ModuleScripts, avec de petits projets à construire dans Studio.

Problèmes courants

La plupart des problèmes de premier script sont un nom qui ne correspond pas, un script au mauvais endroit, ou une boucle sans attente. Garde l'Output ouvert pendant tes tests.

Studio se fige ou ne répond plus quand j'appuie sur Play

Une boucle while true do n'a pas d'attente à l'intérieur, donc rien d'autre ne peut jamais s'exécuter. La documentation de Roblox dit qu'une boucle infinie sans pause comme task.wait() fige le jeu et fait planter Studio. Mets un task.wait() dans chaque boucle qui tourne à l'infini, comme le fait ColourChanger.

Rien ne se passe quand je marche sur le pad

Vérifie que TouchPad est un Script, pas un LocalScript, directement dans la part Pad, qu'il n'est pas désactivé, et que la propriété CanTouch du pad est cochée. Puis mets print("touched", otherPart.Name) en première ligne dans onTouched. Si ça n'affiche jamais rien, l'événement ne se déclenche pas ; si ça affiche, le problème est plus bas.

Appuyer sur E ne fait rien

MyFirstLocalScript doit être un LocalScript dans StarterPlayerScripts : un LocalScript dans Workspace ou ServerScriptService ne tourne jamais. La part doit s'appeler exactement Pad et être directement dans le Workspace. Clique d'abord dans la vue du jeu, et vérifie que tu n'es pas en train d'écrire dans le chat, parce que le script ignore les touches que le jeu a déjà utilisées.

La part change sur mon écran mais pas pour les autres joueurs

Le changement a été fait dans un LocalScript, donc il est resté sur ton appareil. Fais-le plutôt dans un Script serveur, ou fais demander le LocalScript au serveur avec un RemoteEvent.

ColourChanger marche dans une part mais plante dans ServerScriptService

Il utilise script.Parent comme part. Dans ServerScriptService, le parent est ServerScriptService, qui n'a ni Anchored ni Color, donc l'Output affiche une erreur « not a valid member ». Garde-le dans la part, ou donne un nom à la part et trouve-la par ce nom, par exemple local part = workspace:WaitForChild("ColourPart") :: BasePart.

L'Output n'affiche rien du tout

Vérifie que la fenêtre Output est ouverte (menu Window ou onglet Script) et qu'aucun filtre n'est actif : l'Output peut être filtré par type de message, par Client ou Server, et par texte. Si elle est ouverte et toujours vide, le script n'a sans doute jamais tourné. Vois la liste de vérification pour les scripts qui ne font rien (en anglais).

Te débloquer avec RoCode

Si tu bloques sur un script dans ton propre jeu, RoCode peut le lire avec toi. RoCode est un agent IA indépendant pour Roblox Studio, qui n'est pas fait par Roblox : tu écris dans un chat web, et son plugin pour Studio crée et modifie les scripts dans ton Explorer.

Pendant que tu apprends, le mode Ask est le plus utile : c'est toujours toi qui écris les scripts, et RoCode lit ce qui est déjà là et répond à tes questions.

Tu écris

Explique ligne par ligne ce que fait le script TouchPad dans la part Pad, et dis-moi pourquoi il utilise un debounce.

RoCode fait
  • En mode Ask, n'utilise que des outils de lecture comme Search Scripts et Read Script, et ne change rien dans le jeu
  • Si quelque chose doit être corrigé, dit ce qu'il changerait et où, et propose de passer en Build
  • Passe en Build et il modifie les scripts sur place, puis vérifie que chacun compile avec Check Script. C'est une vérification de compilation, pas une vérification de types ni un test en jeu
  • Lit l'Output de Studio avec son outil Check Output, y compris les lignes Server et Client de ton dernier test, même après que tu as appuyé sur Stop

En mode Build avec le plugin 3.9 ou plus récent, RoCode peut lancer un court test et lire les erreurs, et avec le plugin 3.9.11 ou plus récent contrôler un personnage de test pour vérifier que le jeu marche, mais il ne prend pas de captures pendant que le jeu tourne, donc marche toi-même sur le pad. Comment RoCode se connecte à Studio.

Questions fréquentes

Où écrire des scripts dans Roblox Studio ?

Dans l'Explorer, survole un conteneur comme ServerScriptService, clique sur le bouton + et choisis Script. Studio l'ouvre dans le Script Editor, où tu tapes du Luau. Les scripts serveur vont en général dans ServerScriptService ; les LocalScripts vont dans StarterPlayerScripts ou StarterGui.

Comment exécuter un script dans Roblox Studio ?

Appuie sur Play (F5). Studio lance un test, et chaque Script activé dans ServerScriptService ou Workspace tourne dès que le jeu démarre ; les LocalScripts de StarterPlayerScripts tournent quand tu rejoins le test. Run (choisis-le dans le menu à côté de Play, ou appuie sur F8) lance le jeu sans ton avatar, donc utilise Play pour ce guide. Appuie sur Stop (Maj+F5) pour terminer le test. Pour ouvrir un script que tu as déjà, double-clique dessus dans l'Explorer.

Quel langage de programmation utilise Roblox ?

Le Luau. Roblox le décrit comme un langage de script rapide, petit, sûr et à typage graduel, dérivé de Lua 5.1, donc la plupart des tutoriels Lua restent utiles. Luau ajoute des fonctions comme l'interpolation de chaînes avec des accents graves et des annotations de type facultatives, et Roblox ajoute ses propres bibliothèques et objets, comme task.wait.

Quelle est la différence entre un Script et un LocalScript ?

Un Script tourne sur le serveur, et ses changements atteignent tous les joueurs. Un LocalScript tourne sur l'appareil d'un joueur, pour des choses comme les entrées, la caméra et les menus à l'écran, et ses changements sur les parts, les valeurs et l'interface restent sur cet appareil. Le guide client et serveur (en anglais) couvre les deux, plus les ModuleScripts.

Peut-on scripter sur Roblox Studio sur téléphone ou iPad ?

La page de configuration de Roblox décrit Studio comme une application gratuite pour Windows et Mac et ne liste aucune version pour téléphone ou tablette, donc il te faut un ordinateur pour écrire des scripts.

Pourquoi mon script ne fait rien et n'affiche aucune erreur ?

Il est en général à un endroit où ce type de script ne tourne pas (un LocalScript dans Workspace, ou un Script dans StarterPlayerScripts), il est désactivé, ou l'événement qu'il attend ne se déclenche jamais. Le guide des erreurs de script a une liste de vérification (en anglais).

Combien de temps faut-il pour apprendre à scripter sur Roblox ?

Personne ne peut te donner un chiffre honnête : ça dépend de combien tu construis. Ce qui aide le plus, c'est d'écrire souvent de petits scripts dans ton propre jeu. Modifie les quatre scripts d'ici, essaie les exercices, puis suis le guide faire un jeu Roblox étape par étape et ajoute un système à la fois.

Sources et lectures

Comment le code a été vérifié : chaque script de cette page passe le vérificateur de types strict de Luau avec les définitions de l'API Roblox (luau-lsp, 26 octobre 2026). Une vérification de types repère les API mal écrites et les mauvais types, pas la logique du jeu : teste dans Studio avant de publier.

Essaie RoCode sur ton propre jeu.

Des crédits gratuits chaque jour, sans carte. Installe le plugin, décris la fonctionnalité et vérifie ce qui arrive dans Studio.