Un jeu Roblox réagit en permanence : un joueur touche une zone, clique un bouton, rejoint la partie. Ces réactions reposent sur les événements (.Touched, .MouseClick, PlayerAdded…) que tu connectes à des fonctions. Les instances, elles, sont tous les objets de ton jeu : Parts, Models, Scripts — créables et manipulables par code avec Instance.new().
Le principe est toujours le même : tu écoutes un événement avec :Connect(), et la fonction associée s'exécute à chaque déclenchement. Bien gérer la connexion (et la déconnexion) des événements évite les fuites mémoire et les bugs où une action se déclenche plusieurs fois.
local part = script.Parent
local debounce = false
part.Touched:Connect(function(hit)
if debounce then return end
local perso = hit.Parent
if perso:FindFirstChild("Humanoid") then
debounce = true
print(perso.Name .. " touche !")
task.wait(1)
debounce = false
end
end)-- ClickDetector (clic souris)
local cd = script.Parent:FindFirstChild("ClickDetector")
cd.MouseClick:Connect(function(plr)
print(plr.Name .. " a cliqué !")
end)
-- ProximityPrompt (touche E)
local pp = script.Parent:FindFirstChild("ProximityPrompt")
pp.ActionText = "Ouvrir"
pp.Triggered:Connect(function(plr)
print(plr.Name .. " a interagi !")
end)local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(plr)
print(plr.Name .. " a rejoint !")
plr.CharacterAdded:Connect(function(char)
print(plr.Name .. " spawné !")
end)
end)
Players.PlayerRemoving:Connect(function(plr)
print(plr.Name .. " est parti")
end)-- Créer une Part
local part = Instance.new("Part")
part.Size = Vector3.new(4, 1, 4)
part.Position = Vector3.new(0, 5, 0)
part.Anchored = true
part.BrickColor = BrickColor.new("Bright red")
part.Material = Enum.Material.SmoothPlastic
part.Parent = workspace -- TOUJOURS en dernier
-- Créer un dossier
local dossier = Instance.new("Folder")
dossier.Name = "MonDossier"
dossier.Parent = workspace-- CFrame : position + rotation
part.CFrame = CFrame.new(10, 2, 5)
part.CFrame = CFrame.new(part.Position)
* CFrame.Angles(0, math.rad(45), 0)
-- Color3 (RGB normalisé 0-1)
part.Color = Color3.new(1, 0, 0) -- rouge
part.Color = Color3.fromRGB(255, 165, 0) -- orange
part.Color = Color3.fromHex("#3b82f6") -- hex-- Cloner un objet existant
local modele = workspace.MonModele
local copie = modele:Clone()
copie.Parent = workspace
-- Déplacer le clone
copie:SetPrimaryPartCFrame(
CFrame.new(10, 0, 0)
)
-- Détruire après 5 secondes
game:GetService("Debris"):AddItem(copie, 5)
-- Détruire immédiatement
copie:Destroy()-- FindFirstChild : retourne nil si absent (pas d'erreur)
local brique = workspace:FindFirstChild("MaBrique")
if brique then print("Trouvée !") end
-- WaitForChild : attend que l'objet existe (utile côté client)
local brique = workspace:WaitForChild("MaBrique") -- attend indéfiniment
local brique = workspace:WaitForChild("MaBrique", 5) -- timeout 5s
-- FindFirstChildOfClass : cherche par type
local hum = character:FindFirstChildOfClass("Humanoid")
-- IsA : vérifie le type d'une instance
if hit:IsA("BasePart") then print("C'est une Part !") endlocal c = event:Connect(...)) pour pouvoir les déconnecter avec c:Disconnect() quand elles ne servent plus.Parent : Roblox ne calcule l'affichage qu'une fois parentée, c'est plus performant..Touched avec un debounce : sans ça, l'événement se déclenche des dizaines de fois pendant qu'un objet reste en contact..Touched se déclenche pour n'importe quoi (jambe du joueur, autre Part). Teste hit.Name ou la présence d'un Humanoid.