Le wall running, les glissades et l'escalade de rebords dynamisent les jeux d'action. Utiliser l'Humanoid classique mène souvent à des accrochages disgracieux et des pertes d'élan.
En exploitant les contraintes physiques modernes de Luau (`LinearVelocity` et `VectorForce`) avec des Raycasts directionnels, vous créez des sensations de plateforme AAA sur mobile, PC et console.
1. Neutraliser les États Humanoid pour un Parkour Fluide
Conception de la machine à états de déplacement :
- Désactiver les États en Conflit : Dès le début du wall run, désactivez l'escalade et la chute libre pour éviter que les animations par défaut ne brisent la physique.
- Propriété Réseau : Définissez la propriété réseau du RootPart sur le client depuis le serveur pour éliminer la latence.
- Machine à États Finis : Séparez clairement la marche, le sprint, la course sur mur et l'accrochage aux rebords.
2. Raycasts Directionnels et Vecteurs Normaux de Surface
Détection des murs et calcul de la trajectoire :
- Sondes Latérales : Projetez des rayons depuis les hanches et les épaules (3,5 studs) pour détecter les surfaces praticables.
- Validation de Verticalité : Assurez-vous que la normale est perpendiculaire au sol (75° à 105°) pour ignorer les pentes douces.
- Produit Vectoriel : Utilisez
wallNormal:Cross(Vector3.yAxis)pour obtenir la direction exacte longeant le mur.
3. Contraintes Physiques : LinearVelocity & VectorForce
Remplacer les anciens BodyMovers par les contraintes modernes :
- LinearVelocity pour une Vitesse Constante : Maintient l'élan vers l'avant sans être ralenti par la friction du mur.
- VectorForce Antigravité : Annule la gravité par défaut (196,2 studs/s²) par une poussée verticale adaptée à la masse.
- Atténuation Graduelle : Réduisez la force vers le haut après 1,5–2 secondes pour créer une courbe de chute réaliste.
-- Contrôleur client de Wall Running
local RunService = game:GetService("RunService")
local WallRun = {}
WallRun.__index = WallRun
function WallRun.new(character)
local self = setmetatable({}, WallRun)
self.Char = character
self.RootPart = character:WaitForChild("HumanoidRootPart")
self.Humanoid = character:WaitForChild("Humanoid")
local att = Instance.new("Attachment", self.RootPart)
local lv = Instance.new("LinearVelocity")
lv.Attachment0 = att
lv.MaxForce = 15000
lv.RelativeTo = Enum.ActuatorRelativeTo.World
lv.Enabled = false
lv.Parent = self.RootPart
self.Attachment = att
self.LinearVelocity = lv
self.IsRunning = false
return self
end
function WallRun:CheckWall(side)
local rightVec = self.RootPart.CFrame.RightVector
local rayDir = (side == "Left" and -rightVec or rightVec) * 3.5
local params = RaycastParams.new()
params.FilterDescendantsInstances = {self.Char}
params.FilterType = Enum.RaycastFilterType.Exclude
return workspace:Raycast(self.RootPart.Position, rayDir, params)
end
function WallRun:Start(hitNormal, forwardDir)
self.IsRunning = true
self.LinearVelocity.VectorVelocity = forwardDir * 32 + Vector3.new(0, 4, 0)
self.LinearVelocity.Enabled = true
self.Humanoid:ChangeState(Enum.HumanoidStateType.Physics)
end
function WallRun:Stop()
self.IsRunning = false
self.LinearVelocity.Enabled = false
self.Humanoid:ChangeState(Enum.HumanoidStateType.Freefall)
end
return WallRun
4. Détection des Rebords et Rétablissement (Mantle)
Attraper les corniches et franchir les obstacles avec fluidité :
- Double Détection Raycast : Un rayon frontal au niveau du torse détecte le mur et un rayon vertical du haut vers le bas repère l'arête.
- Alignement avec AlignPosition : Verrouillez la position du personnage sur le rebord dès la prise.
- Courbe de Bézier pour l'Ascension : Sur une impulsion de saut, hissez le RootPart dans un arc harmonieux au-dessus de la plateforme.
5. Commandes Mobiles et Sécurité Côté Serveur
Ergonomie sur écran tactile et rempart contre les tricheries :
- Boutons Tactiles Confortables : Associez le saut mural et l'escalade à des touches d'au moins 48x48 pixels.
- Vérification des Vitesses : Le serveur calcule la vitesse entre chaque tick et bloque les accélérations suspectes.
- Contrôle de Présence du Mur : Le serveur effectue ses propres rayons pour confirmer la proximité d'un mur valide.
Frequently Asked Questions
Pourquoi privilégier LinearVelocity face à BodyVelocity ?
BodyVelocity est obsolète. LinearVelocity s'intègre au nouveau solveur de contraintes physiques de Roblox, offrant une stabilité nettement supérieure.
Comment empêcher le personnage de glisser vers le bas pendant la course sur mur ?
En exerçant une force verticale avec VectorForce compensant la gravité, puis en l'atténuant progressivement après quelques secondes.
Comment calcule-t-on le vecteur d'avancement le long du mur ?
En réalisant le produit vectoriel entre la normale de la surface renvoyée par le Raycast et le vecteur mondial vertical (0, 1, 0).
Comment le serveur empêche-t-il les tricheries de vol ?
Le serveur vérifie la présence de murs physiques réels à proximité du joueur et bride les déplacements anormaux.