로블록스 커스텀 캐릭터 이동: 벽 달리기, 모서리 잡기 및 VectorForce 물리

2026-09-29 • DopaBrain 로블록스 물리 엔지니어링 팀 • DopaBrain Engineering

Featured DopaBrain Interactive Tools

벽 달리기, 슬라이딩, 턱걸이(Ledge Mantle) 같은 고속 파쿠르 메커니즘은 현대 액션 게임의 핵심 재미 요소입니다. 기본 Humanoid의 상태만으로 이를 구현하려 하면 벽에 달라붙어 굳거나 속도가 급감하는 버그가 발생합니다.

최신 Luau 물리 제약인 `LinearVelocity`, `VectorForce`, 그리고 방향성 Raycast를 결합하면 모바일, PC, 콘솔 모두에서 부드럽게 작동하는 AAA급 커스텀 물리 컨트롤러를 제작할 수 있습니다.

1. 유연한 파쿠르를 위한 휴머노이드 상태 재정의

로블록스 스튜디오의 커스텀 이동 상태 머신 설계 원칙:

2. 방향성 레이캐스트와 표면 법선(Normal) 정렬

벽면 감지 및 최적의 달리기 벡터 산출 공식:

3. 현대적 물리 제약: LinearVelocity & VectorForce

구형 BodyMovers를 대체하는 최신 물리 제약 조건 활용:

ReplicatedStorage.Controllers.WallRunController
-- 최신 제약 조건 기반 클라이언트 벽 달리기 컨트롤러
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")
    
    -- LinearVelocity 제약 인스턴스 생성
    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. 절차적 모서리 감지 및 턱걸이(Mantle) 전환

모서리 잡기와 부드러운 장애물 극복 애니메이션 연동:

5. 모바일 터치 최적화와 서버 유효성 검증

멀티 플랫폼 지원과 핵 방지를 동시에 달성하는 보안 설계:

Frequently Asked Questions

로블록스에서 BodyVelocity 대신 LinearVelocity를 써야 하는 이유는 무엇인가요?

BodyVelocity는 로블록스에서 사용 중단(Deprecated)된 구형 인스턴스입니다. LinearVelocity는 차세대 물리 제약 엔진으로 질량 계산이 정확하고 멀티플레이어 환경에서 훨씬 안정적입니다.

벽을 달릴 때 캐릭터가 아래로 떨어지지 않게 하려면 어떻게 하나요?

중력(기본 196.2)을 상쇄하는 상향 힘을 VectorForce나 LinearVelocity의 Y축 값으로 인가합니다. 게임 밸런스를 위해 1.5~2초 후 상향력을 서서히 줄여 낙하하도록 설계합니다.

벽 달리기 방향 벡터는 어떻게 계산하나요?

Raycast로 얻은 벽면 충돌 법선 벡터(Normal)와 월드 상향 벡터(0, 1, 0)의 외적(Cross Product)을 구하면 벽면과 평행한 수평 전진 벡터를 산출할 수 있습니다.

서버에서 벽 달리기 핵(Speed/Fly Hack)을 어떻게 방지하나요?

서버가 플레이어 위치 주변에 실제 유효한 벽면이 있는지 자체 Raycast로 확인하고, 벽 달리기 상태가 아닐 때의 최고 이동 속도를 엄격하게 제한합니다.

Explore More Interactive Tests & Guides

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

Go to Portal Hub