Roblox · Движение
Подходишь к стене из папки ClimbWalls и держишь «вперёд» — персонаж лезет вверх. Пробел — отпрыгнуть от стены. Плюс верёвочная лестница из TrussPart: по ней Roblox умеет лазать сам.
Синим — что нужно создать.
StarterPlayer └─ StarterPlayerScripts └─ ClimbLocal (LocalScript) Workspace ├─ ClimbWalls (Folder) — стены, по которым можно лезть └─ Ladder (TrussPart) — лестница: лазание встроено в Roblox
Где: StarterPlayer → StarterPlayerScripts · LocalScript
Зачем: Лазание по стенам из ClimbWalls.
-- события каждого кадра
local RunService = game:GetService("RunService")
-- клавиатура
local UIS = game:GetService("UserInputService")
-- этот игрок
local player = game.Players.LocalPlayer
-- стены, по которым можно лезть
local climbWalls = workspace:WaitForChild("ClimbWalls")
-- скорость подъёма
local CLIMB_SPEED = 12
-- на каком расстоянии стена считается рядом
local REACH = 2.2
-- настройки луча
local params = RaycastParams.new()
-- луч видит только список
params.FilterType = Enum.RaycastFilterType.Include
-- список — стены для лазания
params.FilterDescendantsInstances = {climbWalls}
-- каждый кадр
RunService.Heartbeat:Connect(function()
-- персонаж
local character = player.Character
-- его Humanoid
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
-- его центр
local root = character and character:FindFirstChild("HumanoidRootPart")
-- нет персонажа
if not humanoid or not root or humanoid.Health <= 0 then return end
-- игрок не идёт — не лезем
if humanoid.MoveDirection.Magnitude < 0.1 then return end
-- куда смотрит, по земле
local look = root.CFrame.LookVector * Vector3.new(1, 0, 1)
-- есть ли стена прямо перед лицом
local result = workspace:Raycast(root.Position, look.Unit * REACH, params)
-- нет
if not result then return end
-- идёт не в стену, а вдоль — не лезем
if humanoid.MoveDirection:Dot(-result.Normal) < 0.5 then return end
-- пробел — прыжок со стены
if UIS:IsKeyDown(Enum.KeyCode.Space) then
-- отталкиваемся назад и вверх
root.AssemblyLinearVelocity = result.Normal * 30 + Vector3.new(0, 35, 0)
-- больше ничего
return
-- конец проверки
end
-- прижимаемся к стене и лезем вверх
root.AssemblyLinearVelocity = -result.Normal * 2 + Vector3.new(0, CLIMB_SPEED, 0)
-- конец обработчика
end)Запусти Play (или Run) и убедись: