Interfaces (GUI)

Objectif : Créer des interfaces utilisateur magnifiques et fonctionnelles ! Menus, barres de vie, inventaires... Donne à ton jeu un look professionnel.

L'Interface, c'est l'Expérience

Ce que le joueur voit et utilise

Une bonne interface (GUI = Graphical User Interface) fait la différence entre un jeu amateur et un jeu pro. Barres de vie, menus, notifications... C'est le visage de ton jeu !

1. Structure des GUI

Les interfaces Roblox suivent une hiérarchie précise. Tout commence par un ScreenGui qui contient tes éléments.

1.1 La Hiérarchie

📂 StarterGui
📱 ScreenGui
🖼️ Frame (conteneur)
🏷️ TextLabel (texte)
🔘 TextButton (bouton)
🖼️ ImageLabel (image)
ScreenGui

Le conteneur principal. Tout ce qui est dedans s'affiche à l'écran.

IgnoreGuiInset = true pour utiliser tout l'écran.

Frame

Rectangle conteneur. Idéal pour grouper des éléments.

Peut avoir une couleur de fond, bordure, etc.

TextLabel

Affiche du texte non-cliquable.

Pour les scores, titres, descriptions.

TextButton

Bouton cliquable avec du texte.

Événement .MouseButton1Click

2. Positionnement avec UDim2

En Roblox, on positionne les éléments avec UDim2, qui combine des valeurs en Scale (%) et Offset (pixels).

Syntaxe UDim2

-- UDim2.new(ScaleX, OffsetX, ScaleY, OffsetY)

-- Position au centre de l'écran
frame.Position = UDim2.new(0.5, 0, 0.5, 0)

-- Taille : 50% largeur, 100 pixels de haut
frame.Size = UDim2.new(0.5, 0, 0, 100)

-- Combo : 30% + 20 pixels
frame.Size = UDim2.new(0.3, 20, 0.2, 10)
Scale (0-1)

Pourcentage de l'écran
0.5 = 50%
S'adapte à la taille d'écran

Offset (pixels)

Valeur fixe en pixels
100 = 100px
Toujours la même taille

2.2 AnchorPoint

Par défaut, la position est calculée depuis le coin supérieur gauche. AnchorPoint change le point de référence.

-- Pour centrer parfaitement un élément :
frame.AnchorPoint = Vector2.new(0.5, 0.5)  -- Centre
frame.Position = UDim2.new(0.5, 0, 0.5, 0) -- 50%, 50%

-- Résultat : L'élément est parfaitement centré !

Astuce Pro

AnchorPoint (0, 0) = Coin supérieur gauche (défaut)
AnchorPoint (0.5, 0.5) = Centre
AnchorPoint (1, 1) = Coin inférieur droit

3. Scripter les Interfaces

Les scripts GUI vont dans un LocalScript à l'intérieur du ScreenGui ou de l'élément. Rappelle-toi : les GUI sont côté Client !

3.1 Réagir aux Clics

Bouton simple

local bouton = script.Parent

bouton.MouseButton1Click:Connect(function()
    print("Bouton cliqué !")
    bouton.Text = "Cliqué ?"
end)

-- Effet au survol
bouton.MouseEnter:Connect(function()
    bouton.BackgroundColor3 = Color3.fromRGB(100, 100, 255)
end)

bouton.MouseLeave:Connect(function()
    bouton.BackgroundColor3 = Color3.fromRGB(80, 80, 200)
end)

3.2 Modifier du Texte

local scoreLabel = script.Parent.ScoreLabel
local score = 0

-- Met à jour l'affichage
local function updateScore()
    scoreLabel.Text = "Score: " .. score
end

-- Quand le joueur gagne des points
local function addPoints(points)
    score = score + points
    updateScore()
end

addPoints(100)  -- Score: 100

3.3 Afficher/Masquer

local menu = script.Parent.Menu
local openButton = script.Parent.OpenButton
local closeButton = menu.CloseButton

openButton.MouseButton1Click:Connect(function()
    menu.Visible = true
end)

closeButton.MouseButton1Click:Connect(function()
    menu.Visible = false
end)

4. Layouts Automatiques

Plutôt que de positionner chaque élément manuellement, utilise des Layouts pour organiser automatiquement tes éléments.

UIListLayout

Empile les éléments verticalement ou horizontalement.

Parfait pour les menus et listes.

UIGridLayout

Grille automatique avec cellules de taille fixe.

Parfait pour les inventaires.

UIPadding

Ajoute des marges intérieures.

Évite que le contenu touche les bords.

UIAspectRatioConstraint

Garde un ratio largeur/hauteur fixe.

Parfait pour les images carrées.

Exemple : Menu avec UIListLayout

-- Structure :
-- Frame "Menu"
--   UIListLayout (FillDirection = Vertical, Padding = 10)
--   TextButton "Jouer"
--   TextButton "Options"
--   TextButton "Quitter"

-- Les boutons s'empilent automatiquement !
💻 Sandbox Luau
Simulateur v2.0
1 2 3 4 5 6 7 8 9 10
👉 Expérimente avec UDim2...

Quiz : Interfaces GUI

5 questions pour valider tes acquis

1. Quel est le conteneur principal d'une interface ?

  • Frame
  • ScreenGui
  • StarterGui
  • Canvas

2. Que signifie UDim2.new(0.5, 0, 0.5, 0) ?

  • 50 pixels x 50 pixels
  • 50% de l'écran en X et Y
  • Position en haut à gauche
  • Rotation de 50 degrés

3. Quel événement détecte un clic sur un TextButton ?

  • .Clicked
  • .OnClick
  • .MouseButton1Click
  • .Touched

4. Quel Layout crée une grille automatique ?

  • UIListLayout
  • UIGridLayout
  • UITableLayout
  • UIFlexLayout

5. Quel type de script utilise-t-on pour les GUI ?

  • Script (serveur)
  • LocalScript (client)
  • ModuleScript
  • Les deux fonctionnent
Challenge Code

Crée un Tableau

Complète ce script pour créer et manipuler un tableau de fruits.

15-50 Points
GUI_Score.lua
-- Récupère l'interface du joueur
local player = game.Players.LocalPlayer
local playerGui = player:("PlayerGui")
-- Accède au TextLabel du score
local scoreLabel = playerGui.HUD.Frame.
-- Met à jour le texte affiché
scoreLabel. = "Score: 100"
-- Positionne au centre-haut de l'écran
scoreLabel.Position = .new(0.5, 0, 0, 20) -- 50% horizontal, 20px du haut
🖥️
Étape 8/10

Interface de Survie (HUD)

Crée l'interface visuelle qui affichera tes niveaux d'Oxygène et d'Énergie. On va la préparer pour qu'elle réagisse automatiquement !

1
2
3
4
5
6
7
8
9
10
Prérequis

Modules 1 à 7 complétés (GUI, ScreenGui)

Construction du HUD

1
Crée le ScreenGui

Dans StarterGui, crée un ScreenGui nommé "HUD".

Dedans, ajoute une Frame nommée "BarresContainer" positionnée en bas à gauche.

2
Crée les Barres

Dans "BarresContainer", crée 2 Frames pour les jauges :

BarreOxygene Couleur Cyan, Size (1, 0, 0.2, 0)
BarreEnergie Couleur Jaune, Size (1, 0, 0.2, 0)
3
Script Local d'Affichage

Ajoute un LocalScript dans le ScreenGui. Il doit écouter les attributs du joueur et mettre à jour les barres.

🔥 Défi niveau Expert - À toi de coder !
1. Récupère les références : player, gui, barreOxy, barreEnerg
2. Crée une fonction updateHUD() qui :
• Récupère les attributs "Oxygene" et "Energie" du joueur
• Met à jour la taille des barres avec UDim2.new(valeur/100, 0, 0.2, 0)
3. Connecte AttributeChanged à ta fonction updateHUD
4. Appelle updateHUD() une fois au démarrage
🔒
Solution Expert
Tu as toutes les connaissances nécessaires depuis les modules précédents. Essaie vraiment !
Bonus : Test Manuel

Lance le jeu. Dans l'Explorer, sélectionne ton Joueur (Players > Toi). Dans les Propriétés, ajoute un Attribut "Oxygene" (Number) et change sa valeur. La barre bouge !

🎉

Interface prête !

Prochaine étape ? Module 9 : Collecte & Sauvegarde

🚀 SURVIE SPATIALE - Étape 8/10

Animations Fluides avec TweenService

Transforme ta station en une expérience professionnelle ! Anime les barres de ressources, les portes, et les alertes avec TweenService pour des transitions ultra-smooth.

1
2
3
4
5
6
7
8
9
10
Contexte : Tu as un HUD fonctionnel, mais les barres changent brutalement. Avec TweenService, elles vont glisser en douceur comme dans les vrais jeux AAA !
1
📚 Comprendre TweenService

TweenService permet d'animer n'importe quelle propriété d'un objet de façon fluide. Voici les concepts clés :

  • TweenInfo → Configuration (durée, style, répétition)
  • Tween → L'animation elle-même
  • EasingStyle → Type de courbe (Quad, Bounce, Elastic...)
  • EasingDirection → In, Out, ou InOut
-- Syntaxe de base local TweenService = game:GetService("TweenService") local info = TweenInfo.new( 0.5, -- Durée en secondes Enum.EasingStyle.Quad, -- Style de courbe Enum.EasingDirection.Out -- Direction ) local tween = TweenService:Create( objet, -- L'objet à animer info, -- Configuration {Size = UDim2.new(0.5, 0, 1, 0)} -- Propriétés cibles ) tween:Play() -- Lance l'animation !
2
📊 Animer les Barres du HUD

Modifie le LocalScript HUD_Client du Module 7 pour utiliser TweenService au lieu de changer la taille directement :

-- HUD_Client.lua - Version Animée ! local TweenService = game:GetService("TweenService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local miseAJourHUD = ReplicatedStorage:WaitForChild("MiseAJourHUD") local hud = script.Parent local barreEnergie = hud:WaitForChild("BarreEnergie") local remplissageEnergie = barreEnergie:WaitForChild("Remplissage") local labelEnergie = barreEnergie:WaitForChild("Label") -- Configuration des animations local tweenInfo = TweenInfo.new( 0.3, -- 0.3 seconde Enum.EasingStyle.Quad, -- Courbe douce Enum.EasingDirection.Out -- Décélère à la fin ) local tweenInfoCouleur = TweenInfo.new( 0.5, -- Plus lent pour la couleur Enum.EasingStyle.Sine, Enum.EasingDirection.InOut ) -- FONCTION : Animer la barre d'énergie local function animerBarreEnergie(pourcent) -- Calculer la nouvelle taille local nouvelleTaille = UDim2.new(pourcent, 0, 1, 0) -- Créer et jouer le tween de taille local tweenTaille = TweenService:Create( remplissageEnergie, tweenInfo, {Size = nouvelleTaille} ) tweenTaille:Play() -- Déterminer la couleur selon le niveau local nouvelleCouleur if pourcent > 0.5 then nouvelleCouleur = Color3.fromRGB(0, 255, 127) -- Vert elseif pourcent > 0.25 then nouvelleCouleur = Color3.fromRGB(255, 165, 0) -- Orange else nouvelleCouleur = Color3.fromRGB(255, 50, 50) -- Rouge end -- Animer la couleur aussi ! local tweenCouleur = TweenService:Create( remplissageEnergie, tweenInfoCouleur, {BackgroundColor3 = nouvelleCouleur} ) tweenCouleur:Play() end -- Recevoir les données du serveur miseAJourHUD.OnClientEvent:Connect(function(ressources) local pct = ressources.energie / ressources.energieMax animerBarreEnergie(pct) labelEnergie.Text = "⚡ " .. math.floor(ressources.energie) end)
Maintenant, au lieu de changer brutalement, la barre glisse en douceur vers sa nouvelle position et change de couleur progressivement !
3
🚪 Améliorer l'Animation des Portes

Remplace les boucles for du script de porte du Module 6 par des Tweens pour une animation pro :

-- Dans ControleurPorte.lua - Remplace les boucles par : local TweenService = game:GetService("TweenService") local tweenInfoPorte = TweenInfo.new( 0.8, -- Durée Enum.EasingStyle.Back, -- Effet "rebond" Enum.EasingDirection.Out ) -- FONCTION : Ouvrir avec Tween local function ouvrirPorteAnimee() local posGaucheOuverte = posGaucheFermee - Vector3.new(DISTANCE_OUVERTURE, 0, 0) local posDroiteOuverte = posDroiteFermee + Vector3.new(DISTANCE_OUVERTURE, 0, 0) local tweenGauche = TweenService:Create(porteGauche, tweenInfoPorte, {Position = posGaucheOuverte}) local tweenDroite = TweenService:Create(porteDroite, tweenInfoPorte, {Position = posDroiteOuverte}) tweenGauche:Play() tweenDroite:Play() -- Attendre la fin de l'animation tweenGauche.Completed:Wait() end
EasingStyle.Back crée un léger effet de "dépassement" avant de revenir, parfait pour des portes sci-fi !
4
🚨 Créer une Alerte Animée

Ajoute une alerte visuelle quand l'énergie est critique. Crée un Frame rouge qui pulse :

-- Dans HUD_Client.lua - Ajoute après les autres variables local alerteFrame = hud:WaitForChild("AlerteEnergie") local alerteActive = false -- Configuration du pulse local tweenPulseIn = TweenInfo.new( 0.3, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut, -1, -- Répète infiniment true -- Reverse (fait l'aller-retour) ) -- FONCTION : Activer l'alerte local function activerAlerte() if alerteActive then return end alerteActive = true alerteFrame.Visible = true local tween = TweenService:Create(alerteFrame, tweenPulseIn, { BackgroundTransparency = 0.3 }) tween:Play() end -- FONCTION : Désactiver l'alerte local function desactiverAlerte() alerteActive = false alerteFrame.Visible = false end -- Dans la fonction de mise à jour, ajoute : if pct < 0.2 then activerAlerte() else desactiverAlerte() end
5
🎮 Tester les Animations

Lance le jeu avec F5 et observe :

  • 📊 Les barres glissent en douceur au lieu de sauter
  • 🎨 Les couleurs transitionnent progressivement
  • 🚪 Les portes s'ouvrent avec style
  • 🚨 L'alerte pulse quand l'énergie est critique
Concepts du cours appliqués :
TweenService:Create() → Créer une animation
TweenInfo → Configurer durée, style, répétition
EasingStyle → Quad, Sine, Back, Bounce, Elastic...
Completed:Wait() → Attendre la fin d'un tween
Bonus : Animations Avancées
  • Anime le réacteur avec un effet de pulsation lumineux
  • Utilise EasingStyle.Elastic pour un effet rebondissant sur les portes
  • Crée une animation d'apparition pour le HUD au spawn
  • Anime les cristaux pour qu'ils flottent légèrement

Station animée comme un pro !

Tes animations donnent à ta station un feeling AAA ! → Module 9 : Ambiance sonore et effets visuels