Créer un OBBY
Un « obby » (course d’obstacle) est un type de jeu sur Roblox où les joueurs doivent traverser une série d’obstacles pour atteindre la fin. Voici un guide pour créer votre propre obby avec des critères spécifiques et des instructions détaillées pour chaque partie.
Critères :
- Avoir au minimum 10 niveaux différents : Votre obby doit comporter au moins 10 niveaux uniques.
- Respecter toutes les parties : Suivez toutes les instructions pour chaque partie.
- Ne pas utiliser la tool-box pour les scripts ou certains obstacles : Évitez d’utiliser la tool-box pour les scripts et certains obstacles.
- Avoir au minimum un script spécial : Incluez au moins un script spécial dans votre obby.
Partie I : Créer le Lobby
Objectif : Créer un lobby (zone de départ) où le joueur apparaîtra et le décorer.
Instructions :
- Créer le lobby : Utilisez des « parts » (blocs) pour créer un espace où le joueur apparaîtra au début du jeu.
- Décorer le lobby : Ajoutez des éléments décoratifs pour rendre le lobby attrayant.
Suggestion pour la suite
Pour t’aider, oublie pas d’utiliser la fenêtre de sortie et la possibilité de mettre des commentaires dans ton script :

Commentaire d’une ligne :
–print(« instruction en commentaire »)
Commentaire de plusieurs instructions :
–[[
print(« instruction en commentaire »)
print(« instruction en commentaire »)
–]]

Partie II : Niveau 1 du jeu – Système de Déplacement de Part par un menu
Objectif : Créer un système pour déplacer une part à droite et à gauche pour aider le joueur à finir le premier niveau.


Instructions :
- Créer une part : Ajoutez une part et renommez-la.
- Créer un « Screen Gui » : Dans « StarterGui », ajoutez un « Screen Gui » et placez une « Frame » à l’intérieur.
- Système d’ouverture/fermeture : Créez deux boutons pour ouvrir et fermer la « Frame ».
- Boutons de déplacement : Ajoutez deux boutons pour déplacer la part à droite et à gauche.
- Indice : Utilisez
[nom de la variable de la part].Position += Vector3.new(x, y, z)
pour déplacer la part.
- Indice : Utilisez
Comment indiquer une ressource dans un script :
local btOpenMenu = script.Parent.OpenButton

Comment détecter un click de la souris sur un bouton :
btOpenMenu.MouseButton1Click:Connect(function()
end)
Comment déplacer un objet Roblox :
myPart.Position += Vector3.new(10,0,0)
Gérer les niveaux, afficher dans le chat du joueur son niveau :

Rajouter un script ChatScript sous ReplicatedStorage :

Puis coder dans ce script :
local ChatScript = {}
function ChatScript.sendMessage(player, message)
local character = player.Character or player.CharacterAdded:Wait() if character then local head = character:WaitForChild("Head") if head then game:GetService("Chat"):Chat(head, message) end end
end
return ChatScript
Rajouter dans votre script qui gère votre interface les instructions suivantes lorsque le joueur referme la fenêtre :
local chat = require(game.ReplicatedStorage.ChatScript)
chat.sendMessage(player, "niveau : 1")
Partie III : Niveau 2 – Parts Mobiles
Objectif : Faire en sorte qu’une ou plusieurs parts bougent continuellement.
Instructions :
- Ajouter des parts mobiles : Dans un de vos niveaux, ajoutez des parts qui bougent.
- Indice : Utilisez
while true do
etfor i = 1, x do
pour créer un mouvement continu.
- Indice : Utilisez
Déplacer un objet x fois :
for i = 1, 50 do
maPart.Position += Vector3.new(5,0,0)
wait(1)
end
Déplacer un objet Roblox tout le temps :
while true do
maPart.Position += Vector3.new(0.05,0,0)
wait(0.01)
end
Déplacer un objet jusqu’à une position :
while maPart.Position.X<60 do
maPart.Position += Vector3.new(5,0,0)
wait(0.01)
end
Synchroniser le déplacement avec le moteur de Roblox :
game:GetService(« RunService »).Heartbeat:Connect(function()
maPart.Position += Vector3.new(0.05,0,0)
end)
Exercer une force sur le part pour le bouger :
part.Anchored = false
local linearVelocity = Instance.new(« LinearVelocity »)
linearVelocity.Attachment0 = part:FindFirstChildOfClass(« Attachment ») or Instance.new(« Attachment », part)
linearVelocity.MaxForce = 20000 — Définir la force maximale
linearVelocity.VectorVelocity = Vector3.new(0, 0, 50) — Définir la vitesse linéaire
linearVelocity.Parent = part
wait(1) — Attendre 5 secondes
linearVelocity:Destroy()
part.Anchored = true
Partie IV : Niveau 3 – Part Mortel
Objectif : Créer une part qui tue le joueur lorsqu’il la touche.
Instructions :
- Créer un part rouge : Ajoutez un part, colorez-le en rouge et utilisez le matériau « Néon ».

- Ajouter un script : Créez un script dans le part.
- Script de mort : Lorsque le joueur touche le part, il meurt.
- Indices :
- Utilisez
[Nom du part].Touched:Connect(function(player)
pour détecter le contact. - Utilisez
character = player.Parent
pour obtenir le personnage du joueur. - Utilisez
humanoid = character and character:FindFirstChild("Humanoid")
pour obtenir l’objet Humanoid du joueur. - Tuer le joueur : humanoid.Health = 0
- Utilisez
- Indices :
Santé du joueur à 100 au départ du jeu :
print(humanoid.Health)
Réduire la santé du joueur :
humanoid.Health = humanoid.Health – 5
ou
humanoid:TakeDamage((5))
Le joueur meurt quand sa santé est à zéro :
humanoid.Health = 0
Partie V : Niveau 4 – Part Invisible
Objectif : Créer un part invisible qui apparaît lorsque le joueur clique sur un autre part.
Instructions :
- Créer un part avec ClickDetector : Ajoutez un part, renommez-la, et ajoutez un « ClickDetector ».
- Créer un part invisible : Ajoutez un autre part et définissez
Transparency = 1
etCanCollide = false
. - Script d’apparition : Lorsque le joueur clique sur le part avec le « ClickDetector », le deuxième part apparaît.
- Indices :
- Utilisez
[Premièr Part].ClickDetector.MouseClick:Connect(function()
pour détecter le clic. - Utilisez
[Créez ta variable] = [Nom de la part où on click]:WaitForChild("ClickDetector")
pour obtenir le ClickDetector.
- Utilisez
- Indices :

Comment coder un ClickDetector sur le part :

local clickDetector = script.Parent.ClickDetector
clickDetector.MouseClick:Connect(function()
print(« touché »)
end)
Comment coder un Prompt :


maPart.ProximityPrompt.Triggered:Connect(function(otherPart)
print(‘activé’)
end)
Script pour rendre visible/invisible un part :
local clickDetector = script.Parent.ClickDetector
local level1 = workspace.Pathfinding.Level01
level1.Part01.Transparency = 1
level1.Part01.CanCollide = false
clickDetector.MouseClick:Connect(function()
if level1.Part01.Transparency == 1 then
level1.Part01.Transparency = 0
else
level1.Part01.Transparency = 01
end
level1.Part01.CanCollide = not level1.Part01.CanCollide
end)
Script pour faire apparaître/disparaître un niveau de jeu :
local clickDetector = script.Parent.ClickDetector
local level1 = workspace.Pathfinding.Level01
for , level in level1:GetChildren() do
level.Transparency = 1
level.CanCollide = false
end
clickDetector.MouseClick:Connect(function()
for _, level in level1:GetChildren() do
level.Transparency = level.Transparency == 1 and 0 or 1
level.CanCollide = not level.CanCollide
end
end)
Partie VI : Pathfinding (recherche de chemin) avec des Parts
Objectif : Créer un chemin de parts où le joueur doit sauter au bon moment pour passer à la prochaine part.
Instructions :
- Créer 3 parts : Ajoutez des parts et renommez-les.
- Créer un patherme : Disposez les parts de manière à ce que le joueur doive sauter au bon moment pour passer à la suivante.
- Indice : Utilisez la
Transparency
pour rendre certaines parts invisibles. - Indice : supprimer l’objet baseplate
- Indice : Utilisez la

Exemple de Pathfinding avec deux niveaux :

Exemple pour passer à un niveau 2 :


Exemple de script pour faire apparaître le niveau 2 lors du clic sur le ClickDetector:
local clickDetector = script.Parent.Level01.ArrowToLevel02.ClickDetector
— récupération de tous les parts du niveau 2
local levels = script.Parent.Level02:GetChildren()— récupération du système de chat
local chat = require(game.ReplicatedStorage.ChatScript)clickDetector.MouseClick:Connect(function(otherPart)
-- envoie du message au chat du joueur chat.sendMessage(otherPart, "niveau : 2") -- rendre visible tous les objets du niveau 2 for _, level in levels do level.Transparency = 0 end
end)
Partie VII : Labyrinthe avec Portes Temporisées
Objectif : Créer un labyrinthe avec des portes qui s’ouvrent temporairement.
Instructions :
- Créer un labyrinthe : Utilisez des parts pour créer un labyrinthe.
- Ajouter une porte : Ajoutez une part et renommez-la.
- Créer un bouton : Ajoutez une autre part qui servira de bouton.
- Script de porte temporisée : Lorsque le joueur appuie sur le bouton, il a un nombre de secondes « x » pour passer la porte, sinon elle se referme.
- Condition : La porte doit s’ouvrir soit vers les côtés, soit vers le haut en animation.
- Ajouter 3 portes : Créez au moins 3 portes comme cela dans le même script.
Créez une porte à partir d’un part :

Rangez le part et renommez le dans l’explorateur :

Puis créez avec un part une poignée :

Créez une contrainte rigide entre la porte et la poignée :
Sélectionnez la poignée puis la porte puis demande une « soudure » entre les deux éléments :

Demandez un clickDetector sur la poignée :



Modifiez le pivot de la porte :


Créez un script pour ouvrir la porte :

local clickDetector = script.Parent.Handle.ClickDetector
local door = script.Parent.Doorlocal function doorRotation(door, push, rotation)
if push ~= 0 then
for i = 1, (rotation//math.abs(push)) do
door:PivotTo(door:GetPivot() * CFrame.Angles(math.rad(push), 0, 0))
wait(0.01)
end
endend
clickDetector.MouseClick:Connect(function()
doorRotation(door, 1, 90)
end)
Refermez la porte au bout de x secondes, rajouter ces deux instructions :
task.wait(5)
doorRotation(door, -1, 90)
Modifier le script pour déplacer la porte vers le haut :
local clickDetector = script.Parent.Handle.ClickDetector
local door = script.Parent.Doorlocal distance = clickDetector.MaxActivationDistance
local function doorPushUp(door, push)
door.CFrame += Vector3.new(0,push,0)
while door.CFrame.Position.Y>5 and door.CFrame.Position.Y<15 do
wait(0.01)
door.CFrame += Vector3.new(0,push,0)
end
endclickDetector.MouseClick:Connect(function()
clickDetector.MaxActivationDistance = 0
doorPushUp(door, 1)
task.wait(5)
doorPushUp(door, -1)
clickDetector.MaxActivationDistance = distanceend)
Partie VIII : Menu de départ du jeu
Objectif : Créez un menu pour le lancement du jeu
Instructions :
- Créer un menu de lancement du jeu : Afficher le titre du jeu et un bouton PLAY.
- Créer un script de démarrage : Lancer le jeu par le bouton play.
Créez un menu de démarrage du jeu :


Crée un script pour afficher le menu et lance le jeu :



Partie IX : Animation glissade du joueur
Objectif : Crée une animation de glissade
Instructions :
Créer une animation : Lancer le jeu par le bouton play.
Créer un script pour lancer l’animation sur l’appuie d’une touche du clavier
Choisis AVATAR puis constructeur de RIG

Choisis ton RIG :

R6 : Moins de parties mobiles, mouvements moins fluides, apparence plus simple.
R15 : Plus de parties mobiles, mouvements plus fluides et réalistes, apparence plus détaillée.
Déplace ton RIG pour créer l’animation

Ouvre l’éditeur d’animation :

L’éditeur d’animation ouvre une Timelapse :
Une timelapse dans un éditeur d’animation est une technique qui permet de capturer et de montrer le processus de création d’une animation. Cela signifie que vous enregistrez votre travail à intervalles réguliers et ensuite vous compilez ces enregistrements en une vidéo qui montre l’ensemble du processus de l’animation.
Demande à créer l’animation sur l’ensemble du corps en appuyant sur le + :

Décoche Rotation et Déplacer

Modifie les positions du corps étape par étape pour animer une glissade :

Définis la priorité de l’animation :

Action2 : Utilisé pour les animations qui doivent avoir la priorité sur les animations d’inactivité et de mouvement, mais pas nécessairement sur les animations de haute priorité.

Sauvegarde l’animation et garde bien sa référence car tu vas en avoir besoin :

Copie la référence de l’animation :

Garde bien l’identifiant puis ferme la fenêtre:

Script de l’animation
Crée un localscript sous StarterPlayer dans StarterCharacterScripts :

Puis une animation :

Modifie les noms du script et de l’animation :


Tu peux maintenant coller la référence de l’animation dans AnimationId de ton animation :

Code du script pour lancer l’animation
Code ton script pour que l’animation se lance sur une touche du clavier, dans l’exemple la touche CTRL :
local UIS = game:GetService(« UserInputService »)
UIS.InputBegan:Connect(function(input, gpe)
if gpe then return end
if input.KeyCode == Enum.KeyCode.LeftControl then
print(« animation glissade »)
end
end)
Vérifie que tu as le message dans la sortie lorsque tu appuies sur CTRL
Code pour lancer l’animation dans une fonction et que tu ne puisses pas la lancer plusieurs fois :
local in_progress = false
local function ActivationGlissade()
if not in_progress then
in_progress = true
print(« animation glissade »)
task.wait(1)
in_progress = false
end
end
UIS.InputBegan:Connect(function(input, gpe)
if gpe then return end
if input.KeyCode == Enum.KeyCode.LeftControl then
ActivationGlissade()
end
end)
Code pour lancer l’animation :
local UIS = game:GetService(« UserInputService »)
local Character = script.Parent
local Humanoid = Character:WaitForChild(« Humanoid »)
local GlissadeAnimation = Humanoid:LoadAnimation(script:WaitForChild(« GlissadeAnimation »))
local in_progress = false
local function ActivationGlissade()
if not in_progress then
in_progress = true
GlissadeAnimation:Play()
task.wait(1)
in_progress = false
end
end
Ton animation se lance mais ne s’arrête plus :
local function ActivationGlissade()
if not in_progress then
in_progress = true
GlissadeAnimation:Play()
local humanoidRootPart = Character:WaitForChild(« HumanoidRootPart »)
local linearVelocity = Instance.new(« LinearVelocity »)
linearVelocity.Attachment0 = Instance.new(« Attachment », humanoidRootPart)
linearVelocity.MaxForce = 10000 — Définir la force maximale
linearVelocity.VectorVelocity = Character.HumanoidRootPart.CFrame.LookVector * 30
linearVelocity.Parent = Character.HumanoidRootParttask.wait(1)
GlissadeAnimation:Stop()
linearVelocity:Destroy()
in_progress = false
end
end
Modifie ton code pour paramétrer le temps de l’animation et sa vitesse :
–Modifications de la fonction avec deux paramètres
local function ActivationGlissade(sliding_time, speed)
Humanoid.WalkSpeed = speedlinearVelocity.VectorVelocity = Character.HumanoidRootPart.CFrame.LookVector * speed
task.wait(sliding_time)
–Modifications de l’appel de la fonction temps de l’animation et vitesse
ActivationGlissade(0.5,10)

Partie X : Tableau de scores
Objectif : Créé un tableau de scores
Créer un script pour afficher un tableau de score au joueur sous ServerScriptService :


Renommer le script leaderstats :

Saisir le code suivant pour un affichage d’une barre de scores :
local players = game:GetService(« Players »)
players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new(« Folder »)
leaderstats.Name = « leaderstats »
leaderstats.Parent = player
end)
Si tu lances ton jeu une barre s’affiche :

Rajoute à ton script un score à afficher :
local players = game:GetService(« Players »)
players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new(« Folder »)
leaderstats.Name = « leaderstats »
leaderstats.Parent = player
local score = Instance.new(« IntValue »)
score.Parent = leaderstats
score.Name = « Score »
score.Value = 0
end)
Le score s’affiche si tu lances ton jeu :

Exemple d’un script pour augmenter le score si le joueur click sur un ClickDetector :
local clickDetector = script.Parent.ClickDetector
clickDetector.MouseClick:Connect(function(player)
player:WaitForChild(« leaderstats »).Score.Value += 10
end)
Partie XI : Crée une boutique
Objectif : Créé une boutique avec des objets à acheter
Crée un bouton et une fenêtre pour ta boutique sous StarterGUI :

Pout ta boutique crée :
- un bouton pour ouvrir et fermer la fenêtre de ta boutique
- une fenêtre avec un titre
- un localscript pour gérer l’ouverture de ta boutique

Ton script :

Modifie sous ServerScriptService le script leaderstats pour gérer un portemonnaie numérique :

Modifie ta boutique pour proposer l’achat d’une torche par l’ajout d’un TextButton:

L’objectif est de placer la torche achetée dans la boutique dans le BackPack du joueur. Le Backpack
est principalement utilisé pour contenir des outils que les joueurs peuvent s’équiper et utiliser. Ces outils peuvent être des objets interactifs, des armes, ou tout autre objet qui peut être utilisé pour interagir avec le monde du jeu.
- Le
Backpack
est principalement géré côté client. Chaque joueur a son propreBackpack
, et les outils qu’il contient sont spécifiques à ce joueur. - Bien que le
Backpack
soit géré côté client, les outils peuvent être ajoutés ou retirés par des scripts côté serveur en utilisant desRemoteEvents
pour communiquer avec le client. ReplicatedStorage
est souvent utilisé pour stocker des objets et des ressources qui doivent être partagés entre le serveur et les clients, ce qui en fait un endroit logique pour organiser lesRemoteEvents
.
Crée un RemoteEvent sur ReplicatedStorage :

Puis renomme le RemoteEvent :

Puis stocke une torche dans le ServerStorage.
ServerStorage
offre un endroit organisé pour stocker les objets côté serveur, ce qui peut faciliter la gestion et la maintenance du code et des ressources du jeu.

Modifie le script du caddy pour prendre la torche :

Puis crée un script BuyShopService dans ServerScriptService pour ajouter la torche au BackPack :


Lance le jeu pour tester le résultat :

Achète la torche, on ne contrôle pas pour l’instant si tu disposes de suffisamment d’argent :

Maintenant contrôle si le joueur peut acheter la torche, modifie le script de ta boutique :

Puis pour tester, modifie la valeur de coins lorsque tu lances le jeu :

Au lieu de mettre l’objet dans BackPack, tu peux le mettre à disposition dans le Workspace :

Donne une position correcte à l’objet dans ServerStorage :

Ainsi que :

Partie XII : Modifie l’éclairage du jeu
Objectif : Modifier l’éclairage global du jeu
Propose à ton joueur de vivre une ambiance différente en :
- Modifiant le niveau de l’éclairage global.
- Modifiant l’heure de la journée.
Change l’éclairage global
L’éclairage global correspond à la luminescence du soleil ou de la lune.
- Dans la fenêtre de l’Explorateur , sélectionnez Lighting .
- Dans la fenêtre Propriétés , modifie le paramètre Brightness :

Changer l’heure de la journée
Change l’heure de la journée pour modifier l’éclairage global de ton jeu.
- Dans la fenêtre de l’Explorateur , sélectionnez Lighting .
- Dans la fenêtre Propriétés , modifie le paramètre ClockTime :

Jouer avec un script sur la luminosité :
Crée un nouveau RemoteEvent BrightnessEvent:

Crée un script BrightnessService sous ServerScriptService :

Puis dans le script saisie le programme suivant :

Puis diminue la lumière dès que le joueur achète la torche :

Partie XIII : Téléportation
Objectif :
Tu vas utiliser la téléportation pour ton jeu mais également pour tester plus rapidement des phases de ton jeu. Tu pourras mettre ainsi une téléportation pour déplacer ton joueur dans une zone à tester sans avoir à parcourir tout le jeu.
Mise en place des points de téléportation
Dans Workspace crée un nouveau model :

Que tu renommes Teleports :

Puis crée deux bocs :

Que tu glisses sous Teleports et renommes en TeleportA et Teleport B :

Modifie la couleur :

Modifie la taille :

Puis modifie ce paramètre :

Puis place dans ton jeu les deux points de téléportation, le point A près de ton joueur au lancement du jeu, puis le point B à l’endroit d’arrivée de ton joueur.
Programme ta première téléportation
Puis viens créer un nouveau script sous Teleleports :

Renomme le nouveau script en TeleportService :

Puis écris le programme suivant dans le script TeleportService :


Sur le model Teleports crée la propriété deadlineOutside temps en seconde, cette propriété est utilisée pour indiquer le temps pour que le joueur puisse sortir du point de téléportation avant une nouvelle téléportation :

Puis pour chaque point de téléportation, crée une nouvelle propriété target pour indiquer le point de téléportation de destination :

Lance ton jeu et essaye la téléportation
Conclusion
En suivant ces instructions, vous serez en mesure de créer un obby complet et fonctionnel sur Roblox. Assurez-vous de respecter tous les critères et d’utiliser les indices pour vous aider à compléter chaque partie. Bonne chance et amusez-vous bien !