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(), paswait(). La référence de Roblox marque lewait()global comme déprécié et remplacé partask.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
Avant de commencer : Studio, une Baseplate et la fenêtre Output
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.
- Installe Roblox Studio, l'application gratuite de Roblox pour Windows et Mac, et connecte-toi avec ton compte Roblox.
- 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.
- 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.
- Ouvre Output (sortie) depuis le menu Window ou l'onglet Script. C'est là qu'apparaissent les messages et les erreurs de tes scripts.
- 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.
| Script | Type | Où il va | Ce qu'il apprend |
|---|---|---|---|
FirstScript | Script | ServerScriptService | Variables, une fonction, une condition if, des boucles et une table |
ColourChanger | Script | Dans une Part de Workspace | Changer des propriétés, script.Parent et une boucle qui attend |
TouchPad | Script | Dans une Part nommée Pad | Les événements, trouver le joueur qui a touché une part, et un debounce |
MyFirstLocalScript | LocalScript | StarterPlayerScripts, dans StarterPlayer | Du code qui tourne sur l'appareil d'un joueur, les touches, et ce qui reste sur cet appareil |
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
- 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.
- 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. - Les nouveaux scripts commencent par une ligne,
print("Hello world!"). Supprime-la et colle le code ci-dessous. - Appuie sur Play (F5), avec Test choisi dans le menu à sa gauche. Studio lance un test et place ton avatar sur la SpawnLocation.
- 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.
-- 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.
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.
| Code | Idée | Ce que ça veut dire |
|---|---|---|
local gameName = "Coin Run" | Variable | Un 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): string | Fonction | Un 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. |
return | Valeur de retour | Renvoie 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îne | Le texte entre accents graves peut contenir des valeurs : Luau remplace {name} et {goal} par leurs valeurs actuelles. |
if, elseif, else, end | Condition if | Luau 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 do | Boucle for numérique | Exé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 do | Table et boucle | Une 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.
- Dans l'onglet Home, clique sur Part. Studio ajoute un bloc dans le Workspace. Son nom n'a pas d'importance.
- Dans l'Explorer, survole la nouvelle part, clique sur + et insère un Script. Renomme-le
ColourChangeret remplace son contenu par le code ci-dessous. - 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.
-- 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.Parentest 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.:: BasePartest 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.Coloretpart.Anchoredsont 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'appelleColormême si ce script s'appelle ColourChanger.Anchored = truegarde 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.#coloursest la longueur de la liste, 3, et%donne le reste d'une division, doncindex % #colours + 1compte 1, 2, 3, 1, 2, 3.while true dorépète à l'infini, c'est pourquoi letask.wait(1)à l'intérieur compte. La documentation de Roblox dit de toujours mettre une pause commetask.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.
- 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à. - Fais-en un pad plat sur lequel tu peux marcher, par exemple en réglant sa
Sizesur6, 1, 6dans la fenêtre Properties. Pose-la sur le sol près de la SpawnLocation et coche Anchored pour qu'elle reste en place. - Survole Pad, clique sur +, insère un Script, renomme-le
TouchPadet colle le code ci-dessous. - Appuie sur Play et marche sur le pad. Il devient jaune pendant 2 secondes, et l'Output affiche ton nom.
-- 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)
| Code | Ce 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é. |
otherPart | La 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 end | S'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.
- Dans l'Explorer, déplie StarterPlayer, survole StarterPlayerScripts, clique sur + et insère un LocalScript. Renomme-le
MyFirstLocalScriptet colle le code ci-dessous. - Appuie sur Play. L'Output montre
Hello,et ton nom, marqué Client. - Clique dans la vue du jeu et appuie sur E. Le pad pâlit. Appuie de nouveau sur E pour le faire revenir.
- 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 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.LocalPlayerest 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.InputBeganse déclenche quand le joueur commence un appui de touche, un clic ou un toucher.gameProcessedvauttruequand 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, ounils'il n'y en a pas.pad:IsA("BasePart")vérifie que c'est vraiment une part avant que le script change saTransparency.if pad.Transparency == 0 then 0.6 else 0est 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.
| Type | Tourne sur | Ses changements atteignent | Sert à | Va en général dans |
|---|---|---|---|---|
| Script | Le serveur | Tous les joueurs | Les règles du jeu : pièces, dégâts, portes, manches, sauvegarde | ServerScriptService, ou dans une part pendant que tu apprends |
| LocalScript | L'appareil d'un joueur | Cet appareil seulement, sauf le mouvement de son propre personnage | Les entrées, la caméra, les menus à l'écran, les effets pour un joueur | StarterPlayerScripts ou StarterGui |
| ModuleScript | Le côté qui appelle require() dessus | Les mêmes que le script qui l'a chargé | Du code partagé par plusieurs scripts | ReplicatedStorage 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
- 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.
- 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.
- Appuie sur E. Le pad passe à une Transparency de 0.6. Appuie de nouveau sur E et il redevient opaque.
- 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.
- Casse quelque chose exprès. Renomme Pad en
Pad2et joue. Marcher dessus le rend toujours jaune, parce que TouchPad trouve sa part avecscript.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érificationif pad and ...a sauté le reste sans bruit. Ajouteprint(pad)sur la ligne aprèsFindFirstChild, joue et appuie sur E : l'Output montrenil. 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 :
| Conteneur | À mettre ici | Pourquoi |
|---|---|---|
| ServerScriptService | Les Scripts avec la plupart des règles de ton jeu : récompenses, manches, sauvegarde | Ils tournent sur le serveur, et rien dans ServerScriptService n'est envoyé aux joueurs. |
| Dans une part de Workspace | Un Script qui appartient à cette seule part, comme ColourChanger et TouchPad | Trè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 StarterPlayer | La plupart des LocalScripts : entrées, caméra, effets pour un joueur | Chaque joueur en reçoit sa propre copie en arrivant. |
| StarterGui | Les LocalScripts dans une ScreenGui qui font marcher un menu à l'écran | Chaque joueur reçoit sa propre copie de l'interface. |
| ReplicatedStorage | Les ModuleScripts que chargent à la fois le code serveur et le code client | Les 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 :
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.
| Message | Ce que ça veut dire | Solution |
|---|---|---|
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.
| Le tutoriel | Le problème | Ce 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 Roblox | Quand 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 debounce | Touched 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 Workspace | Un 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 LocalScript | Le 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 dossierleaderstatsdu joueur et ajoute 1 à sa valeurCoins. Indice :player:FindFirstChild("leaderstats"), puisleaderstats:FindFirstChild("Coins"), puiscoins.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
Transparencyde la part chaque seconde. Indice : ajoute une deuxième table de nombres entre 0 et 1, comme{ 0, 0.3, 0.6 }, et règlepart.Transparencyà partir d'elle sur la ligne aprèspart.Color, avec le mêmeindex. - Affiche la couleur du pad. Fais en sorte que MyFirstLocalScript affiche la
Colordu pad quand tu appuies sur E. Indice :print(pad.Color)dans le blocif 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) :
- 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.
- RemoteEvents : comment un LocalScript demande au serveur de faire quelque chose, et comment le serveur vérifie la demande.
- Un classement : tes premières statistiques, créées et modifiées sur le serveur.
- 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é.
- 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.
Explique ligne par ligne ce que fait le script TouchPad dans la part Pad, et dis-moi pourquoi il utilise un debounce.
- 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
- Roblox Creator Docs : Luau (en anglais). ce qu'est le Luau et d'où il vient
- Roblox Creator Docs : Roblox Studio setup (en anglais). Windows et Mac, et la configuration requise
- Roblox Creator Docs : Output (en anglais). ouvrir l'Output, les filtres, Show Context et Show Source
- Roblox Creator Docs : Studio testing modes (en anglais). Play, Run, Stop, le bouton Client/Server et Server & Clients
- Roblox Creator Docs : Script Editor (en anglais). où s'ouvrent les nouveaux scripts, et Script Analysis
- Roblox Creator Docs : Script types and locations (en anglais). où tourne chaque type de script, et taguer les parts au lieu d'y mettre des scripts
- Roblox Creator Docs : Script (en anglais). quand un Script commence à tourner
- Roblox Creator Docs : Control structures (en anglais). les conditions if, les boucles, et pourquoi une boucle infinie a besoin d'une attente
- Roblox Creator Docs : Events (en anglais). Connect, et ce que Touched passe à ta fonction
- Roblox Creator Docs : Debounce patterns (en anglais). pourquoi Touched se déclenche plusieurs fois pour un seul contact
- Roblox Creator Docs : wait (en anglais). le wait() global et task.wait()
- Roblox Creator Docs : Network ownership, movement validation and physics exploits (en anglais). ce qu'un client peut faire avec son propre personnage
- Roblox Creator Docs : Coding fundamentals (en anglais). la série pour débutants de Roblox
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.