Catégories
Jeu vidéo ROBLOX

Créer une plaque de faible gravité

Dans ce tutoriel, tu vas créer une plaque spéciale qui modifie la gravité lorsque le joueur marche dessus.

Grâce à cette plaque, les personnages pourront :

  • sauter beaucoup plus haut ;
  • retomber plus lentement ;
  • atteindre des plateformes normalement inaccessibles.

Ce type de mécanisme est souvent utilisé dans les jeux de science-fiction, les parcours d’obstacles (Obby) ou les bases spatiales.

Comprendre la gravité

La gravité est la force qui attire les objets vers le sol.

Sur Terre, lorsque tu sautes :

  1. tu montes ;
  2. tu ralentis ;
  3. tu redescends.

Dans Roblox, la gravité agit exactement de la même manière.

Si on la diminue :

  • les sauts deviennent plus grands ;
  • les chutes sont plus lentes ;
  • les déplacements semblent plus légers.

Solution 1 : Modifier la gravité pour tout le monde

Dans cette version, lorsqu’un joueur active la plaque, la gravité du jeu entier est modifiée.

Conséquences

  • tous les joueurs sont affectés ;
  • tous les sauts deviennent plus grands ;
  • tous les objets physiques réagissent également à la nouvelle gravité.

Cette solution est simple à mettre en place mais peut rendre le jeu imprévisible si plusieurs joueurs jouent en même temps.

Exemple de situation

Imaginons :

  • Paul marche sur la plaque ;
  • la gravité est divisée par deux.

Même les autres joueurs situés à l’autre bout de la carte profiteront immédiatement de cet effet.

Créer une plaque de non gravité

Commence par construire une Part qui servira de plaque spéciale.

Tu peux lui donner :

  • une couleur vive ;
  • un matériau futuriste ;
  • un effet lumineux.

Les joueurs comprendront ainsi qu’il s’agit d’une zone particulière du parcours.

Détecter l’entrée du joueur

Lorsque le personnage marche sur la plaque, le jeu doit détecter le contact.

Cette détection permet de savoir :

  • quel joueur est entré dans la zone ;
  • quand appliquer l’effet de faible gravité.

C’est le même principe que pour une zone de téléportation ou un checkpoint.

Puis un script :

-- référence au part pour le changement de gravité
local part = script.Parent

-- détection du joueur qui touche la part
part.Touched:Connect(function(hit)
	local character = hit.Parent
	local humanoid = character and character:FindFirstChild("Humanoid")	
	if not humanoid then return end
	-- changement de gravité à 10 au moment de la collision
	workspace.Gravity = 10
end)

Créer une plaque pour retrouver la gravité

Commence par construire une Part qui servira de plaque spéciale .

Puis un script :

-- référence de la part pour retourner la gravité à 196.2
local part = script.Parent

-- détection du joueur qui touche la part
part.Touched:Connect(function(hit)
	local character = hit.Parent
	local humanoid = character and character:FindFirstChild("Humanoid")	
	if not humanoid then return end
	-- retour de la gravité à 196.2 au moment de la collision
	workspace.Gravity = 196.2
end)

Solution 2 : Modifier la gravité pour un seul joueur

Dans cette version, seul le joueur qui touche la plaque bénéficie de l’effet.

Les autres joueurs continuent à jouer normalement.

Cette méthode est souvent préférable dans un jeu multijoueur car chacun peut vivre sa propre expérience.

Comment simuler une faible gravité pour un joueur ?

Comme la gravité du monde est partagée par tous, on ne peut pas simplement changer la gravité globale pour un seul joueur.

On utilise donc une autre technique :

  • augmenter sa puissance de saut ;
  • ralentir sa descente ;
  • modifier certaines propriétés de déplacement.

Le résultat ressemble à une gravité plus faible sans affecter les autres joueurs.

Script à modifier pour la plaque de changement de gravité pour un seul joueur :

-- référence au part pour le changement de gravité
local part = script.Parent

-- détection du joueur qui touche la part
part.Touched:Connect(function(hit)
	local character = hit.Parent
	local hrp = character and character:WaitForChild("HumanoidRootPart")
	
	if not hrp then return end
	
	if hrp:FindFirstChild("GravityAttachment") then return end -- évite les doublons
	
	-- 1. Créer une pièce jointe (Attachment) requise pour VectorForce
	local attachment = Instance.new("Attachment")
	attachment.Name = "GravityAttachment"
	attachment.Parent = hrp

	-- 2. Créer la force physique (VectorForce)
	local vectorForce = Instance.new("VectorForce")
	vectorForce.Name = "CustomGravityForce"
	vectorForce.Attachment0 = attachment
	vectorForce.ApplyAtCenterOfMass = true
	vectorForce.RelativeTo = Enum.ActuatorRelativeTo.World

	-- 3. Calculer la masse totale du personnage
	local totalMass = 0
	for _, part in ipairs(character:GetDescendants()) do
		if part:IsA("BasePart") then
			totalMass = totalMass + part:GetMass()
		end
	end

	-- 4. Appliquer une force vers le haut pour réduire la gravité ressentie
	-- Exemple : contrer 60% de la gravité (le joueur se sentira plus léger)
	local gravityCounterFactor = 0.6 
	local upwardForce = totalMass * workspace.Gravity * gravityCounterFactor

	vectorForce.Force = Vector3.new(0, upwardForce, 0)
	vectorForce.Parent = hrp
end)

Script à modifier pour retrouver la gravité normal pour un seul joueur :

-- référence de la part pour retourner la gravité à 196.2
local part = script.Parent

-- détection du joueur qui touche la part
part.Touched:Connect(function(hit)
	local character = hit.Parent
	local hrp = character and character:FindFirstChild("HumanoidRootPart")
	if not hrp then return end
	
	-- Trouver et supprimer l'Attachment
	local attachment = hrp:FindFirstChild("GravityAttachment")
	if attachment then
		attachment:Destroy()
	end

	-- Trouver et supprimer le VectorForce
	local vectorForce = hrp:FindFirstChild("CustomGravityForce")
	if vectorForce then
		vectorForce:Destroy()
	end
	
end)