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

Движущаяся платформа

Платформа автоматически ездит туда и обратно.

Иллюстрация: Движущаяся платформа
🎯 Что получится

Платформа плавно движется на 18 студов по оси X и возвращается. Игрока может понадобиться сопровождать движением: TweenService не гарантирует перенос стоящего персонажа.

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

Где разместить: Script внутри движущегося Part

Создайте Part MovingPlatform (Anchored = true, CanCollide = true, CanTouch = true), размером примерно 12 × 1 × 12 studs. Добавьте внутрь обычный Script и вставьте код.
В Play встаньте на платформу: она перенесёт персонажа на 18 studs и вернётся назад. Проверьте с двумя игроками в Test → Start.
Платформа должна иметь свободный путь без стен. Это учебный вариант для простой плоской платформы: в сложных играх лучше использовать модель лифта с отдельной системой перевозки.

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

Script
-- Script внутри MovingPlatform (Part)
-- Платформа движется вправо и обратно и переносит стоящих на ней игроков.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local platform = script.Parent
local DISTANCE = 18
local MOVE_TIME = 3
local PAUSE = 0.5
local start = platform.CFrame
local finish = start * CFrame.new(DISTANCE, 0, 0)

local function ridersAt(frame)
    local riders = {}
    local params = RaycastParams.new()
    params.FilterType = Enum.RaycastFilterType.Include
    params.FilterDescendantsInstances = {platform}
    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 travel(from, to)
    local elapsed = 0
    while elapsed < MOVE_TIME do
        elapsed = math.min(MOVE_TIME, elapsed + RunService.Heartbeat:Wait())
        local t = elapsed / MOVE_TIME
        local eased = t * t * (3 - 2 * t)
        local previous = platform.CFrame
        local passengers = ridersAt(previous)
        local nextFrame = from:Lerp(to, 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
    travel(start, finish)
    task.wait(PAUSE)
    travel(finish, start)
    task.wait(PAUSE)
end

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

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

Ваш прогресс

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

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

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

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

Измените DISTANCE и MOVE_TIME. Попробуйте двигать платформу вдоль оси Z.

2. Улучшите

Измените внешний вид игрового объекта и добавьте рядом второй экземпляр с другими настройками.

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

Придумайте мини-уровень, в котором эта механика помогает игроку достичь цели.

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

Что нужно включить у платформы, чтобы она не падала от гравитации?

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

Если персонаж соскальзывает, увеличьте площадь платформы и убедитесь, что CanCollide = true, Anchored = true. Не ставьте на одну платформу два скрипта движения. Скрипт переносит только игроков, находящихся над платформой; NPC и свободные предметы он не перевозит.