← Retour LearnBloxLearnBlox

Détecter le contact avec un objet

Guide débutant

Un checkpoint qui s'active, une pièce à ramasser, un piège qui inflige des dégâts : toutes ces mécaniques reposent sur une seule question — comment savoir qu'un joueur touche un objet ? La réponse s'appelle l'événement Touched.

C'est simple à utiliser, mais plein de pièges classiques : il se déclenche pour tout ce qui touche l'objet (pas seulement les joueurs), et parfois plusieurs fois de suite en une fraction de seconde. Ce guide montre le code correct dès le départ.

👆 L'événement Touched, version simple
local piece = workspace.Piece -- une Part dans le jeu

piece.Touched:Connect(function(hit)
    print(hit.Name .. " a touché la pièce")
end)
⚠️ hit est n'importe quelle Part qui touche l'objet — un bras, une jambe, une balle, un NPC. Ce n'est jamais directement le joueur.
✅ Vérifier que c'est bien un joueur
local Players = game:GetService("Players")
local piece = workspace.Piece

piece.Touched:Connect(function(hit)
    local personnage = hit.Parent
    local joueur = Players:GetPlayerFromCharacter(personnage)

    if not joueur then return end -- pas un joueur, on ignore

    print(joueur.Name .. " a ramassé la pièce !")
    piece:Destroy()
end)
🔁 Empêcher le déclenchement multiple
local dejaDeclenche = false

piece.Touched:Connect(function(hit)
    local joueur = Players:GetPlayerFromCharacter(hit.Parent)
    if not joueur or dejaDeclenche then return end

    dejaDeclenche = true
    -- Ta logique ici (donner des points, téléporter…)

    task.wait(1) -- petite pause avant de réactiver
    dejaDeclenche = false
end)
💡 Touched peut se déclencher plusieurs fois par seconde tant que le joueur reste en contact — un verrou (comme dejaDeclenche) évite de donner 10 points au lieu d'1.
💥 Exemple complet : une zone de dégâts
local zoneDanger = workspace.ZoneDanger
local enCooldown = {} -- une table par joueur touché

zoneDanger.Touched:Connect(function(hit)
    local joueur = Players:GetPlayerFromCharacter(hit.Parent)
    if not joueur or enCooldown[joueur] then return end

    local humanoid = hit.Parent:FindFirstChild("Humanoid")
    if humanoid then
        humanoid:TakeDamage(10)
        enCooldown[joueur] = true
        task.wait(1)
        enCooldown[joueur] = nil
    end
end)
✅ Bonnes pratiques & erreurs fréquentes
  • Toujours passer par GetPlayerFromCharacter : un Touched non filtré réagit à des NPC, des projectiles, du décor qui bouge.
  • Ajoute un verrou anti-répétition pour toute action qui ne doit se produire qu'une fois par passage (dégâts, points, téléportation).
  • Détruis ou désactive l'objet après un ramassage à usage unique (piece:Destroy()), sinon il reste ramassable par le joueur suivant.
  • Ce code s'écrit côté serveur (Script), jamais côté client : sinon un joueur peut désactiver la détection en trichant sur son propre appareil.

Va plus loin : maîtrise les événements

Touched n'est qu'un événement parmi beaucoup d'autres. Le module Événements et Listeners couvre Connect, PlayerAdded, les BindableEvents et comment structurer ton code autour des événements.

Voir le module gratuitement →