Roblox · Дополнительное

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

Платформа (вместе с перилами и украшениями) ездит туда-обратно и везёт стоящих на ней игроков. Её двигает физика (AlignPosition), а не Tween — поэтому игрок не выскальзывает из-под ног, как с обычной анимированной платформой.

Структура

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

Workspace
└─ MovingPlatform (Model) — PrimaryPart = Base
   ├─ Base (Part) — пол платформы; Anchored вкл. в редакторе — скрипт отключит сам
   ├─ RailLeft, RailRight (Part) — перила (по желанию), Anchored
   ├─ Configuration (Configuration)
   │  ├─ Offset (Vector3Value) — куда ехать от начала, 0, 0, 30
   │  ├─ Time (NumberValue) — секунд в одну сторону, 4
   │  └─ Pause (NumberValue) — секунд стоит на конце, 1
   └─ MovingPlatformServer (Script)

Шаги

  1. Workspace → «+» → Model, переименуй в MovingPlatform. Платформа — модель: пол, перила, украшения едут вместе.
  2. В MovingPlatform: «+» → Part, переименуй в Base — пол платформы. Size — 8, 1, 8; Anchored — вкл. (в редакторе платформа не упадёт, а в игре скрипт сам отключит Anchored). Поставь в начальную точку пути.
  3. Перила (по желанию): в MovingPlatform «+» → Part «RailLeft» — Size 8, 1.5, 0.4, Anchored, поставь на край пола; Ctrl+D — «RailRight» на другой край. Так же можно добавить столбики, фонари, ящики — любые детали внутри модели.
  4. Выдели модель MovingPlatform → в Properties PrimaryPart → нажми на Base. Это главная деталь: её тянет физика, а остальные скрипт приварит к ней.
  5. Configuration — папка для настроек (как Folder, значок шестерёнки): наведи на MovingPlatform → «+» → Configuration. Внутри: «+» → Vector3Value «Offset» (Value — куда ехать, например 0, 0, 30), «+» → NumberValue «Time» = 4 и «Pause» = 1.
  6. В MovingPlatform: «+» → Script, переименуй в MovingPlatformServer, вставь текст из «Скриптов».
  7. Как работает: скрипт приваривает все детали модели к Base (WeldConstraint) — получается одно целое. AlignPosition тянет Base к цели с постоянной скоростью «путь ÷ время», AlignOrientation не даёт наклоняться, а приваренные перила едут следом. Платформа физическая — трение везёт стоящих на ней.
  8. Лифт — Offset 0, 20, 0 (вверх). Несколько платформ — копируй модель целиком с разными Offset: у каждой свой скрипт.
  9. Платформа не должна задевать стены по пути — иначе застрянет.

Скрипты

MovingPlatformServer

Где: Workspace → MovingPlatform · Script
Зачем: Двигает платформу туда-обратно физикой — стоящих на ней она везёт с собой.

-- платформа — модель: пол Base, перила и украшения
local platform = script.Parent
-- главная деталь: её тянет физика
local base = platform.PrimaryPart or platform:FindFirstChild("Base")
-- главной детали нет
if not base then
    -- подсказка в Output
    warn("Движущаяся платформа: задай PrimaryPart у модели")
    -- дальше не работаем
    return
-- конец проверки
end
-- куда и как быстро ехать
local config = platform:WaitForChild("Configuration")
-- куда ехать от начала (Vector3)
local offset = config.Offset.Value
-- секунд в одну сторону
local travel = config.Time.Value
-- секунд стоит на конце
local pause = config.Pause.Value
-- начальная точка
local start = base.Position

-- все детали модели
for _, part in pairs(platform:GetDescendants()) do
    -- кроме главной
    if part:IsA("BasePart") and part ~= base then
        -- сварка: деталь держится за Base
        local weld = Instance.new("WeldConstraint")
        -- к чему привариваем
        weld.Part0 = base
        -- что привариваем
        weld.Part1 = part
        -- сварку храним в детали
        weld.Parent = part
        -- деталь едет вместе с Base
        part.Anchored = false
    -- конец проверки
    end
-- конец перебора
end

-- точка, за которую тянем
local attachment = Instance.new("Attachment")
-- в главную деталь
attachment.Parent = base
-- тянет платформу к цели
local align = Instance.new("AlignPosition")
-- цель — просто точка в мире
align.Mode = Enum.PositionAlignmentMode.OneAttachment
-- кого тянем
align.Attachment0 = attachment
-- без ограничения силы — не провиснет под игроками
align.MaxForce = math.huge
-- скорость: путь ÷ время
align.MaxVelocity = offset.Magnitude / travel
-- держит скорость точно
align.Responsiveness = 50
-- пока стоит на месте
align.Position = start
-- включаем
align.Parent = base
-- не даёт платформе наклоняться
local orientation = Instance.new("AlignOrientation")
-- держит заданный поворот
orientation.Mode = Enum.OrientationAlignmentMode.OneAttachment
-- кого держим
orientation.Attachment0 = attachment
-- поворот — как в редакторе
orientation.CFrame = base.CFrame
-- жёстко
orientation.RigidityEnabled = true
-- включаем
orientation.Parent = base

-- двигает физика — поэтому стоящих на ней она везёт с собой
base.Anchored = false
-- физику всей модели считает сервер — у всех одинаково
base:SetNetworkOwner(nil)

-- бесконечно туда-обратно
while true do
    -- едем в конец
    align.Position = start + offset
    -- доехали и постояли
    task.wait(travel + pause)
    -- едем обратно
    align.Position = start
    -- доехали и постояли
    task.wait(travel + pause)
-- следующий круг
end

Проверка

Запусти Play (или Run) и убедись:

Собрать движущуюся платформу одной командой