← Все практические скрипты
Механизмы · Уверенный · 20 мин

Лифт-платформа по кругу

Платформа плавно перемещается между верхней и нижней точкой.

Иллюстрация: Лифт-платформа по кругу
🎯 Что получится

Платформа автоматически движется вверх на 25 studs, ждёт 2 секунды и опускается. Это простая учебная анимация платформы.

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

Где разместить: Обычный Script в ServerScriptService

В Workspace создайте широкий Part ElevatorPlatform, установите Anchored = true и CanCollide = true. Добавьте внутрь обычный Script и вставьте код.
В Play встаньте на платформу: лифт поднимется на 25 studs, остановится на 2 секунды и опустится обратно. Проверьте движение и с двумя игроками.
Это учебная реализация: она переносит игроков, стоящих на платформе, но не переносит NPC или незакреплённые предметы. Для полноценного лифта с кабиной нужен отдельный контроллер.

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

Script
-- Script внутри ElevatorPlatform (Part)
-- Лифт сам ездит вверх и вниз и переносит стоящих на нём игроков.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local platform = script.Parent
local HEIGHT = 25
local TRAVEL_TIME = 5
local WAIT_AT_END = 2
local bottom = platform.CFrame
local top = bottom + Vector3.new(0, HEIGHT, 0)

local params = RaycastParams.new()
params.FilterType = Enum.RaycastFilterType.Include
params.FilterDescendantsInstances = {platform}

local function getRiders()
    local riders = {}
    for _, player in ipairs(Players:GetPlayers()) do
        local character = player.Character
        local root = character and character:FindFirstChild("HumanoidRootPart")
        local humanoid = character and character:FindFirstChildOfClass("Humanoid")
        if root and humanoid and humanoid.Health > 0 then
            local hit = workspace:Raycast(root.Position, Vector3.new(0, -7, 0), params)
            if hit and hit.Instance == platform then
                riders[#riders + 1] = character
            end
        end
    end
    return riders
end

local function move(from, destination)
    local elapsed = 0
    while elapsed < TRAVEL_TIME do
        elapsed = math.min(TRAVEL_TIME, elapsed + RunService.Heartbeat:Wait())
        local t = elapsed / TRAVEL_TIME
        local eased = t * t * (3 - 2 * t)
        local previous = platform.CFrame
        local passengers = getRiders()
        local nextFrame = from:Lerp(destination, eased)
        platform.CFrame = nextFrame
        local delta = nextFrame * previous:Inverse()
        for _, character in ipairs(passengers) do
            if character.Parent then character:PivotTo(delta * character:GetPivot()) end
        end
    end
end

while platform.Parent do
    move(bottom, top)
    task.wait(WAIT_AT_END)
    move(top, bottom)
    task.wait(WAIT_AT_END)
end

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

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

Ваш прогресс

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

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

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

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

Измените HEIGHT с 25 на 12.

2. Улучшите

Сделайте платформу шире и измените время подъёма.

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

Постройте космический лифт между двумя башнями.

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

Что делает лифт после достижения верхней точки?

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

Если персонаж не поднимается, проверьте, что стоит именно на ElevatorPlatform, а не на соседней детали. Убедитесь, что платформа Anchored = true, CanCollide = true и путь вверх свободен. Не добавляйте второй скрипт движения на ту же платформу.