Movimentação Personalizada no Roblox: Wall Running, Agarre de Bordas e VectorForce

2026-09-29 • Equipe de Engenharia Física de Roblox da DopaBrain • DopaBrain Engineering

Featured DopaBrain Interactive Tools

Mecânicas dinâmicas como correr em paredes e subir em parapeitos tornam qualquer jogo mais empolgante. Tentar criá-las apenas com o Humanoid padrão gera travamentos de colisão e perda de impulso.

Usando as restrições físicas modernas do Luau (`LinearVelocity` e `VectorForce`) em conjunto com Raycasts direcionais, você constrói uma jogabilidade de plataforma AAA estável em qualquer plataforma.

1. Sobrescrevendo Estados do Humanoid para Parkour Fluido

Estruturação da máquina de estados de movimento:

2. Raycasts Direcionais e Vetor Normal da Parede

Detectando paredes e calculando a trajetória de avanço:

3. Restrições Físicas: LinearVelocity e VectorForce

Substituindo os antigos BodyMovers por soluções modernas:

ReplicatedStorage.Controllers.WallRunController
-- Controlador de Wall Running no Cliente
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. Agarre de Bordas e Transição de Subida (Mantle)

Detectando corrimãos e executando a escalada:

5. Controles para Celular e Validação no Servidor

Acessibilidade em telas sensíveis ao toque e segurança:

Frequently Asked Questions

Por que usar LinearVelocity em vez de BodyVelocity?

BodyVelocity é um recurso antigo e descontinuado. LinearVelocity é moderno, respeita a massa do personagem e evita comportamentos erráticos.

Como manter o personagem na mesma altura durante a corrida na parede?

Aplicando uma força para cima que compense exatamente a gravidade da experiência por meio de VectorForce ou LinearVelocity.

Como calcular o vetor de movimento junto à parede?

Calculando o produto vetorial entre a normal da parede e o vetor vertical para cima (0, 1, 0).

Como o servidor previne trapaças de velocidade no parkour?

Validando se existem paredes reais perto do jogador e limitando o deslocamento máximo permitido por segundo.

Explore More Interactive Tests & Guides

Discover personalized cognitive assessments, stress evaluations, and game psychology tools on DopaBrain.

Go to Portal Hub