← Все практические скрипты
Платформы и движение · Уверенный · 35 мин

Лифт по вызову: вверх и вниз

У лифта две кнопки вызова и плавное движение платформы.

Иллюстрация: Лифт по вызову: вверх и вниз
🎯 Что получится

Плавный подъём и спуск платформы по нажатию E.

1. Подготовьте объект

Где разместить: Отдельные блоки кода: создайте файлы в указанных местах

В Workspace создайте Part ElevatorPlatform (Anchored=true, CanCollide=true) и два Part CallBottom и CallTop (Anchored=true).
Поставьте платформу в нижнее положение. Кнопку CallTop разместите на высоте верхнего этажа; её разница по Y с CallBottom задаёт высоту подъёма.
В ServerScriptService создайте Script ElevatorController и вставьте код.
В Play встаньте НА платформу и нажмите E у нижней кнопки. Лифт перемещает стоящего на нём персонажа вместе с собой. Проверьте с двумя игроками и не используйте второй контроллер для этой же платформы.

Карта файлов в Explorer

Это пути для скриптов из блоков кода ниже. Остальные объекты создайте по инструкции.

└── ServerScriptService
    └── ElevatorController (Script)

2. Вставьте код

ServerScriptService/ElevatorController (Script)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local platform = workspace:WaitForChild("ElevatorPlatform")
local bottom = workspace:WaitForChild("CallBottom")
local top = workspace:WaitForChild("CallTop")
local startCFrame = platform.CFrame
local endCFrame = startCFrame + Vector3.new(0, top.Position.Y - bottom.Position.Y, 0)
local busy = false
local position = "bottom"
local TRAVEL_TIME = 4

local function moveTo(destination)
    local origin = platform.CFrame
    local elapsed = 0
    while elapsed < TRAVEL_TIME do
        local dt = RunService.Heartbeat:Wait()
        elapsed = math.min(TRAVEL_TIME, elapsed + dt)
        local alpha = elapsed / TRAVEL_TIME
        alpha = alpha * alpha * (3 - 2 * alpha)
        local previous = platform.CFrame
        local nextFrame = origin:Lerp(destination, alpha)
        -- Переносим стоящих НА платформе игроков вместе с платформой.
        local riders = {}
        for _, player in ipairs(Players:GetPlayers()) do
            local char = player.Character
            local root = char and char:FindFirstChild("HumanoidRootPart")
            local humanoid = char and char:FindFirstChildOfClass("Humanoid")
            if root and humanoid and humanoid.Health > 0 then
                local p = previous:PointToObjectSpace(root.Position)
                if math.abs(p.X) < platform.Size.X / 2 and math.abs(p.Z) < platform.Size.Z / 2
                    and p.Y > platform.Size.Y / 2 and p.Y < platform.Size.Y / 2 + 6 then
                    table.insert(riders, char)
                end
            end
        end
        platform.CFrame = nextFrame
        local delta = nextFrame * previous:Inverse()
        for _, char in ipairs(riders) do
            if char.Parent then char:PivotTo(delta * char:GetPivot()) end
        end
    end
end
local function createPrompt(part, label, target)
    local prompt = part:FindFirstChildOfClass("ProximityPrompt") or Instance.new("ProximityPrompt")
    prompt.ActionText = label
    prompt.MaxActivationDistance = 10
    prompt.Parent = part
    prompt.Triggered:Connect(function()
        if busy or position == target then return end
        busy = true
        moveTo(target == "top" and endCFrame or startCFrame)
        position = target
        busy = false
    end)
end
createPrompt(bottom, "Поднять лифт", "top")
createPrompt(top, "Опустить лифт", "bottom")

3. Проверьте в игре

Нажмите Play в Roblox Studio и проверьте действие механики. Если механика не работает, откройте окно Output и проверьте тип скрипта, его расположение и названия объектов.

Ваш прогресс

Когда проверите механику в Roblox Studio, отметьте практику как выполненную. Отметка хранится только в этом браузере, не в личном кабинете.

Если объединяете несколько скриптов

Добавляйте механики по одной и проверяйте окно Output. Не создавайте несколько одинаковых систем монет или интерфейсов; скрипты, меняющие WalkSpeed, прыжок или освещение, могут влиять друг на друга.

⭐ Три шага к собственной игре
1. Повторите и измените

Измените длительность движения с 4 на 8 секунд.

2. Улучшите

Добавьте подсветку к каждой кнопке.

3. Придумайте своё

Сделайте двухэтажный дом с лифтом и лестницей.

4. Проверьте себя

Для чего лифту нужна кнопка вызова?

🛠 Если не работает

При движении Anchored платформы игрок может соскальзывать: это демо движения, а не готовый пассажирский лифт.