Objectif : Maîtriser le moteur physique de Roblox, créer des ambiances immersives et apprendre à cloner des objets dynamiquement. Ton monde va prendre vie !
Physique, sons et effets visuels
Un bon jeu, c'est plus que du code. C'est une ambiance ! Des objets qui tombent, des sons qui immergent, de la lumière qui met en valeur. Dans ce module, tu vas transformer ton monde statique en univers vivant.
Roblox possède un moteur physique intégré. Les objets peuvent tomber, rebondir, glisser... si tu le configures correctement.
true = L'objet est "cloué" dans le vide. Aucune force ne peut le bouger.
false = L'objet subit la gravité et les collisions.
part.Anchored = false -- Tombe !true = Les objets se cognent contre lui (solide).
false = Les objets passent à travers (fantôme).
part.CanCollide = false -- Traversabletrue = L'objet n'a pas de masse (utile pour les accessoires).
N'affecte pas le poids d'un personnage qui le porte.
accessoire.Massless = truePermet de définir la densité, friction, élasticité personnalisées.
part.CustomPhysicalProperties = PhysicalProperties.new(0.5, 0.3, 0.8)Tu peux créer des groupes pour contrôler quels objets se cognent entre eux. Par exemple : les balles des joueurs ne se touchent pas entre elles.
Configurer les groupes de collision
local PhysicsService = game:GetService("PhysicsService")
-- Créer les groupes
PhysicsService:RegisterCollisionGroup("Joueurs")
PhysicsService:RegisterCollisionGroup("Balles")
-- Définir les règles : Balles ne collisionnent pas entre elles
PhysicsService:CollisionGroupSetCollidable("Balles", "Balles", false)
-- Assigner un objet à un groupe
maBalle.CollisionGroup = "Balles"Joueur vs Joueur : Désactive les collisions pour éviter que les joueurs se poussent.
Projectiles : Les balles traversent leur tireur mais touchent les ennemis.
L'ambiance d'un jeu passe par la lumière et le son. Roblox te donne tous les outils pour créer des atmosphères uniques.
Le service Lighting contrôle l'éclairage global de ton jeu.
Modifier l'éclairage
local Lighting = game:GetService("Lighting")
-- Changer l'heure (0-24)
Lighting.ClockTime = 20 -- 20h = Nuit
-- Ambiance colorée
Lighting.Ambient = Color3.fromRGB(50, 50, 100) -- Teinte bleutée
-- Brouillard mystérieux
Lighting.FogStart = 0
Lighting.FogEnd = 200
Lighting.FogColor = Color3.fromRGB(150, 150, 150)Tu peux ajouter des effets post-processing dans Lighting :
Effet de brillance autour des lumières
Flou pour les menus ou cinématiques
Modifier les couleurs globales
Profondeur de champ cinématique
Les sons ajoutent une dimension immersive. Tu peux jouer des sons depuis n'importe où :
Jouer un son
-- Créer un son
local son = Instance.new("Sound")
son.SoundId = "rbxassetid://123456789" -- ID du son
son.Volume = 0.5
son.Parent = workspace
-- Jouer le son
son:Play()
-- Son en boucle (musique d'ambiance)
son.Looped = true
son:Play()Va dans la Toolbox de Roblox Studio, onglet "Audio". Tu peux chercher des sons gratuits ou uploader les tiens. Copie l'ID du son pour l'utiliser dans ton code.
Plutôt que de créer des objets à partir de rien, tu peux dupliquer un modèle existant. C'est LA technique pour spawner des ennemis, objets, projectiles...
Cloner un objet
-- L'original est stocké dans ServerStorage (invisible aux joueurs)
local template = game.ServerStorage:WaitForChild("Zombie")
-- Créer une copie
local nouveauZombie = template:Clone()
-- Positionner la copie
nouveauZombie:SetPrimaryPartCFrame(CFrame.new(0, 10, 0))
-- L'ajouter au monde (sinon il n'existe pas vraiment)
nouveauZombie.Parent = workspaceServerStorage ? Pour les objets serveur (ennemis, drops)
ReplicatedStorage ? Pour les objets partagés client/serveur
Combine le clonage avec une boucle pour créer un spawner :
Spawner de pièces
local pieceTemplate = game.ServerStorage:WaitForChild("Piece")
local function spawnerPiece(position)
local nouvellePiece = pieceTemplate:Clone()
nouvellePiece.Position = position
nouvellePiece.Parent = workspace
-- Optionnel : Faire tourner la pièce
nouvellePiece.Orientation = Vector3.new(0, math.random(0, 360), 0)
return nouvellePiece
end
-- Spawner 10 pièces à des positions aléatoires
for i = 1, 10 do
local posAleatoire = Vector3.new(
math.random(-50, 50),
5,
math.random(-50, 50)
)
spawnerPiece(posAleatoire)
end
print("10 pièces ont été spawnées !")N'oublie pas de nettoyer les objets dont tu n'as plus besoin avec :Destroy() :
local piece = pieceTemplate:Clone()
piece.Parent = workspace
-- Après 10 secondes, la pièce disparaît
task.wait(10)
piece:Destroy()
print("La pièce a disparu !")5 questions pour valider tes acquis
Quand l'énergie devient critique (<20%), l'alarme clignote pour t'avertir. Tu as 30 secondes pour agir sinon... Game Over !
Modules 1 à 4 complétés (variables, conditions, boucles)
Crée 3 ou 4 Parts rouges pour les gyrophares.
Ajoute ce script à une des alarmes :
local alarme = script.Parent
local estAllumee = true
-- Boucle infinie pour le clignotement
while true do
if estAllumee then
-- Allumer
alarme.Material = Enum.Material.Neon
alarme.Transparency = 0
else
-- Éteindre
alarme.Material = Enum.Material.SmoothPlastic
alarme.Transparency = 0.5
end
estAllumee = not estAllumee -- Inverse l'état
task.wait(0.5) -- Clignote toutes les 0.5 secondes
endModifie pour que l'alarme clignote 10 fois puis s'arrête :
local alarme = script.Parent
print("🚨 ALERTE DÉCLENCHÉE !")
-- Boucle for : clignote exactement 10 fois
for i = 1, 10 do
-- Allumer
alarme.Material = Enum.Material.Neon
alarme.Transparency = 0
task.wait(0.3)
-- Éteindre
alarme.Material = Enum.Material.SmoothPlastic
alarme.Transparency = 0.5
task.wait(0.3)
print("Clignotement " .. i .. "/10")
end
print("? Alerte terminée")
alarme.Transparency = 1 -- Cache l'alarmeAjoute un Sound dans l'alarme et joue-le dans la boucle avec sound:Play() pour un effet encore plus immersif !
Prochaine étape ? Module 6 : Portes Automatiques
Les astéroïdes proches contiennent des 💎 Cristaux d'énergie. Crée un système de collecte avec physique, clones et destruction !
Crée une nouvelle zone à l'extérieur de la station, accessible par le Sas. Voici la structure dans Workspace :
Crée une plateforme métallique où les cristaux apparaîtront. Place-la à côté du Sas (dans l'espace !) :
Crée un cristal d'énergie qui sera cloné par le script. Place-le dans ReplicatedStorage :
Ajoute une PointLight dans le cristal pour l'effet brillant :
Crée un Script dans la ZoneCollecte qui fait apparaître des cristaux aléatoirement sur la plateforme :
-- SpawnerCristaux.lua -- Fait apparaître des cristaux d'énergie local ReplicatedStorage = game:GetService("ReplicatedStorage") local template = ReplicatedStorage:WaitForChild("CristalTemplate") local plateforme = script.Parent:WaitForChild("Plateforme") -- Configuration local SPAWN_INTERVAL = 5 -- Secondes entre chaque spawn local MAX_CRISTAUX = 10 -- Maximum de cristaux simultanés -- FONCTION : Générer une position aléatoire sur la plateforme local function getPositionAleatoire() local pos = plateforme.Position local size = plateforme.Size local x = pos.X + math.random(-size.X/2 + 2, size.X/2 - 2) local z = pos.Z + math.random(-size.Z/2 + 2, size.Z/2 - 2) local y = pos.Y + size.Y/2 + 10 -- Spawn au-dessus return Vector3.new(x, y, z) end -- FONCTION : Compter les cristaux existants local function compterCristaux() local count = 0 for _, obj in pairs(workspace:GetDescendants()) do if obj.Name == "Cristal" then count = count + 1 end end return count end -- FONCTION : Faire apparaître un cristal local function spawnCristal() if compterCristaux() >= MAX_CRISTAUX then print("⚠️ Maximum de cristaux atteint!") return end -- Clone le template local cristal = template:Clone() cristal.Name = "Cristal" cristal.Position = getPositionAleatoire() cristal.Parent = workspace print("💎 Cristal apparu!") end -- BOUCLE PRINCIPALE : Spawn régulier while true do spawnCristal() task.wait(SPAWN_INTERVAL) endClone() → Duplique un objetmath.random() → Génère des positions aléatoiresAnchored = false → Les cristaux tombent avec la gravité !GetDescendants() → Parcourt tous les objetsAjoute ce script dans le CristalTemplate (avant de le mettre dans ReplicatedStorage) pour qu'il soit collecté au toucher :
-- CollecteCristal.lua (dans le CristalTemplate) local cristal = script.Parent local dejaCollecte = false -- Quand un joueur touche le cristal cristal.Touched:Connect(function(touche) -- Vérifie si c'est un joueur local joueur = game.Players:GetPlayerFromCharacter(touche.Parent) if joueur and not dejaCollecte then dejaCollecte = true -- Empêche double collecte print("💎", joueur.Name, "a collecté un cristal!") -- Effet visuel : rétrécit avant destruction for i = 1, 5 do cristal.Size = cristal.Size * 0.7 cristal.Transparency = cristal.Transparency + 0.15 task.wait(0.05) end -- Détruit le cristal cristal:Destroy() end end)Lance le jeu avec F5 et observe :
Modifie le script de collecte pour ajouter de l'énergie au réacteur quand un cristal est collecté :
BindableEvent pour communiquer entre scriptsIntValue nommée "Energie" dans le Réacteur, puis la modifier depuis n'importe quel script !Tu maîtrises maintenant le clonage, la physique et la destruction ! → Module 6 : Sauvegarde des ressources avec DataStore