As-tu déjà rêvé de faire bondir les joueurs à plusieurs mètres de hauteur dans ton jeu Roblox ? Elles peuvent servir à franchir un obstacle, atteindre une plateforme cachée ou simplement ajouter une touche amusante à un niveau. Dans ce tutoriel, tu vas découvrir comment transformer un simple part en véritable trampoline interactif. Tu verras également comment régler la puissance du rebond pour obtenir différents effets de jeu.
Rebond du joueur sur la plaque
Crée un part et dessous un script :

Saisie ce code dans le script :
local TweenService = game:GetService("TweenService")
local BOUNCE_SPEED = 120 -- vitesse verticale imposée (studs/s)
local COOLDOWN = 0.3 -- évite les rebonds multiples par contact
local trampoline = script.Parent
local lastBounce = {} -- cooldown par joueur
local function squish(trampoline, bounceSpeed, squishTime)
if bounceSpeed==nil then bounceSpeed = BOUNCE_SPEED end
-- Remplace directement la vélocité verticale
local vel = trampoline.AssemblyLinearVelocity
trampoline.AssemblyLinearVelocity = Vector3.new(vel.X, bounceSpeed, vel.Z)
end
-- Appliquer des propriétés physiques pour que la part soit glissante
trampoline.CustomPhysicalProperties = PhysicalProperties.new(
0.7, -- Density
1, -- Friction
1, -- Elasticity
1, -- FrictionWeight
1 -- ElasticityWeight
)
-- Appliquer un matériau glissant comme de la glace
trampoline.Material = Enum.Material.Carpet
trampoline.Touched:Connect(function(hit)
local character = hit.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if not humanoid or humanoid.Health <= 0 then return end
local rootPart = character:FindFirstChild("HumanoidRootPart")
if not rootPart then return end
-- Cooldown par personnage
local now = tick()
if lastBounce[character] and (now - lastBounce[character]) < COOLDOWN then return end
lastBounce[character] = now
squish(trampoline)
end)
Ce script transforme une simple pièce Roblox en trampoline capable de faire rebondir les joueurs lorsqu’ils la touchent. Les variables BOUNCE_SPEED et COOLDOWN définissent respectivement la puissance du rebond et le temps d’attente avant qu’un même joueur puisse rebondir à nouveau. Les propriétés physiques et le matériau de la pièce sont modifiés pour lui donner l’apparence et le comportement d’une surface adaptée au rebond.
La fonction squish() applique une nouvelle vitesse verticale à la pièce afin de créer l’effet de propulsion vers le haut.
L’événement Touched détecte lorsqu’un objet entre en contact avec le trampoline et vérifie qu’il s’agit bien d’un personnage vivant possédant un Humanoid. Un système de cooldown mémorise l’instant du dernier rebond de chaque joueur afin d’éviter plusieurs déclenchements successifs lorsque le personnage reste en contact avec le trampoline.
Animation de la plaque comme un trampoline

Par rapport à la version précédente, le script suivant ajoute un effet visuel d’écrasement et de retour à la forme initiale, ce qui donne davantage l’impression qu’il s’agit d’un véritable trampoline.
Une nouvelle variable originalSize mémorise la taille initiale de la plaque afin de pouvoir la restaurer après l’animation. La constante SQUISH_TIME définit la durée de l’animation de compression et de retour à la normale. La table isSquishing empêche que plusieurs animations soient lancées en même temps sur la même plaque, ce qui éviterait des déformations incohérentes. Le service TweenService est utilisé pour créer une animation fluide plutôt qu’un changement instantané de taille.
Lorsqu’un joueur rebondit, la plaque s’aplatit : sa hauteur diminue tandis que sa largeur et sa longueur augmentent légèrement. Cela reproduit visuellement le comportement d’un trampoline qui se comprime sous le poids du joueur. Après un court délai, une seconde animation redonne progressivement à la plaque sa taille d’origine, donnant l’impression qu’elle reprend sa forme après avoir propulsé le joueur.
L’effet visuel est synchronisé avec le rebond du joueur, ce qui rend l’interaction plus réaliste et plus agréable à observer.
local TweenService = game:GetService("TweenService")
local BOUNCE_SPEED = 120 -- vitesse verticale imposée (studs/s)
local COOLDOWN = 0.3 -- évite les rebonds multiples par contact
local SQUISH_TIME = 0.08 -- durée de l'étirement en secondes
local trampoline = script.Parent
local lastBounce = {} -- cooldown par joueur
local isSquishing = {} -- marquage de la part en état d'étirement
local function squish(trampoline, bounceSpeed, squishTime)
if bounceSpeed==nil then bounceSpeed = BOUNCE_SPEED end
if squishTime==nil then squishTime = SQUISH_TIME end
local originalSize = trampoline.Size
-- Remplace directement la vélocité verticale
local vel = trampoline.AssemblyLinearVelocity
trampoline.AssemblyLinearVelocity = Vector3.new(vel.X, bounceSpeed, vel.Z)
if isSquishing[trampoline] then return end
isSquishing[trampoline] = true
local tweenInfo = TweenInfo.new(squishTime, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
TweenService:Create(trampoline, tweenInfo, {
Size = Vector3.new(originalSize.X * 1.05, originalSize.Y * 0.4, originalSize.Z * 1.05)
}):Play()
task.delay(SQUISH_TIME, function()
TweenService:Create(trampoline, tweenInfo, { Size = originalSize }):Play()
task.delay(SQUISH_TIME, function() isSquishing[trampoline] = false end)
end)
end
-- Appliquer des propriétés physiques pour que la part soit glissante
trampoline.CustomPhysicalProperties = PhysicalProperties.new(
0.7, -- Density
1, -- Friction
1, -- Elasticity
1, -- FrictionWeight
1 -- ElasticityWeight
)
-- Appliquer un matériau glissant comme de la glace
trampoline.Material = Enum.Material.Carpet
trampoline.Touched:Connect(function(hit)
local character = hit.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if not humanoid or humanoid.Health <= 0 then return end
local rootPart = character:FindFirstChild("HumanoidRootPart")
if not rootPart then return end
-- Cooldown par personnage
local now = tick()
if lastBounce[character] and (now - lastBounce[character]) < COOLDOWN then return end
lastBounce[character] = now
squish(trampoline)
end)
Système de plaques rebondissantes
Modifie la structure en créant un Folder, sous le folder ton script et la part, puis duplique la plaque rebondissante plusieurs fois :

Modifie ton script pour lire tous les parts rebondissants :
local TweenService = game:GetService("TweenService")
local BOUNCE_SPEED = 120 -- vitesse verticale imposée (studs/s)
local COOLDOWN = 0.3 -- évite les rebonds multiples par contact
local SQUISH_TIME = 0.08 -- durée de l'étirement en secondes
local trampolines = script.Parent
local lastBounce = {} -- cooldown par joueur
local isSquishing = {} -- marquage de la part en état d'étirement
local function squish(trampoline, bounceSpeed, squishTime)
if bounceSpeed==nil then bounceSpeed = BOUNCE_SPEED end
if squishTime==nil then squishTime = SQUISH_TIME end
local originalSize = trampoline.Size
-- Remplace directement la vélocité verticale
local vel = trampoline.AssemblyLinearVelocity
trampoline.AssemblyLinearVelocity = Vector3.new(vel.X, bounceSpeed, vel.Z)
if isSquishing[trampoline] then return end
isSquishing[trampoline] = true
local tweenInfo = TweenInfo.new(squishTime, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
TweenService:Create(trampoline, tweenInfo, {
Size = Vector3.new(originalSize.X * 1.05, originalSize.Y * 0.4, originalSize.Z * 1.05)
}):Play()
task.delay(SQUISH_TIME, function()
TweenService:Create(trampoline, tweenInfo, { Size = originalSize }):Play()
task.delay(SQUISH_TIME, function() isSquishing[trampoline] = false end)
end)
end
for _, trampoline in ipairs(trampolines:GetChildren()) do
if not trampoline:IsA("BasePart") then continue end
-- Appliquer des propriétés physiques pour que la part soit glissante
trampoline.CustomPhysicalProperties = PhysicalProperties.new(
0.7, -- Density
1, -- Friction
1, -- Elasticity
1, -- FrictionWeight
1 -- ElasticityWeight
)
-- Appliquer un matériau glissant comme de la glace
trampoline.Material = Enum.Material.Carpet
trampoline.Touched:Connect(function(hit)
local character = hit.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if not humanoid or humanoid.Health <= 0 then return end
local rootPart = character:FindFirstChild("HumanoidRootPart")
if not rootPart then return end
-- Cooldown par personnage
local now = tick()
if lastBounce[character] and (now - lastBounce[character]) < COOLDOWN then return end
lastBounce[character] = now
squish(trampoline)
end)
end
