Roblox · Движение

Лазание: стены и лестницы

Подходишь к стене из папки ClimbWalls и держишь «вперёд» — персонаж лезет вверх. Пробел — отпрыгнуть от стены. Плюс верёвочная лестница из TrussPart: по ней Roblox умеет лазать сам.

Структура

Синим — что нужно создать.

StarterPlayer
└─ StarterPlayerScripts
   └─ ClimbLocal (LocalScript)
Workspace
├─ ClimbWalls (Folder) — стены, по которым можно лезть
└─ Ladder (TrussPart) — лестница: лазание встроено в Roblox

Шаги

  1. Workspace → Folder «ClimbWalls», в неё стены для лазания (скалы, сетки, плющ). Остальные стены лазанию не поддаются.
  2. StarterPlayerScripts → LocalScript «ClimbLocal».
  3. Как работает: каждый кадр короткий луч из центра персонажа вперёд ищет стену из ClimbWalls. Если она прямо перед лицом и игрок жмёт к ней — скорость персонажа «вверх + прижаться к стене». Наверху стена кончается — персонаж выходит на край.
  4. Лестница: Part → TrussPart (Model → Part → Truss) — высокая и узкая, Style NoSupports. Humanoid сам лезет по TrussPart — скрипт не нужен.
  5. Отрыв от стены — пробел; на телефоне персонаж отпускает стену, когда отпускаешь джойстик.

Скрипты

ClimbLocal

Где: 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) и убедись:

Собрать лазание одной командой