Roblox · Обби · урок 3

Исчезающие ступени, платформа и конвейер

Три новых препятствия: ступени, которые растворяются под ногами, платформа, которая возит игрока, и лента-конвейер, против которой надо бежать.

Структура

Синим — что добавляем на этом уроке.

Workspace
├─ Stairs (Folder)
│  └─ Step (Part) — жёлтая ступенька
│     └─ DisappearScript (Script)
├─ MovingPlatform (Part) — передняя грань (Front) — куда ехать
│  └─ MoveScript (Script)
└─ Conveyor (Part) — Anchored вкл.
   └─ ConveyorScript (Script)

Шаги

  1. Ступенька «Step» со скриптом «DisappearScript». Готовую ступень копируй Ctrl+D — скрипт копируется вместе с ней.
  2. Цикл for i = 1, 20 делает ступень прозрачнее по шагам: i / 20 — от 0.05 до 1. Флаг busy не даёт запустить исчезание второй раз, пока идёт первое.
  3. Платформа «MovingPlatform» 6 × 1 × 6, Anchored вкл. (скрипт сам её отпустит). Поверни так, чтобы передняя грань (View → Orientation Indicator или Front в Surface) смотрела туда, куда ехать.
  4. Почему не меняем Position в цикле, как в методичке: закреплённая деталь «телепортируется» кусочками, и игрок на ней не едет, а проваливается. AlignPosition двигает платформу силой — игрок стоит на ней и едет.
  5. Конвейер «Conveyor»: длинная деталь, Anchored вкл. Скорость AssemblyLinearVelocity у закреплённой детали её не двигает, но всё, что на ней стоит, едет. Направление — передняя грань.
  6. Поверни конвейер передней гранью назад по полосе — игроку придётся бежать против ленты. Перед ним удобно поставить SpeedBrick.

Скрипты

DisappearScript

Где: Workspace → Stairs → Step · Script
Зачем: Ступень растворяется и через 2 секунды возвращается.

-- ступенька
local part = script.Parent
-- ступень уже исчезает — повторные касания не считаем
local busy = false

-- касание
part.Touched:Connect(function(hit)
    -- уже исчезает — выходим
    if busy then return end
    -- исчезает только от игрока
    if not hit.Parent:FindFirstChildOfClass("Humanoid") then return end
    -- занято
    busy = true
    -- 20 шагов
    for i = 1, 20 do
        -- с каждым шагом прозрачнее
        part.Transparency = i / 20
        -- всего за 1 секунду
        task.wait(0.05)
    -- конец цикла
    end
    -- сквозь ступень можно упасть
    part.CanCollide = false
    -- 2 секунды её нет
    task.wait(2)
    -- снова видна
    part.Transparency = 0
    -- снова твёрдая
    part.CanCollide = true
    -- готова к следующему игроку
    busy = false
-- конец функции
end)

MoveScript

Где: Workspace → MovingPlatform · Script
Зачем: Возит платформу туда-обратно.

-- платформа
local platform = script.Parent
-- сколько studs проезжает
local DISTANCE = 14
-- за сколько секунд
local TIME = 3

-- откуда
local start = platform.Position
-- куда: вперёд по передней грани (Front)
local finish = start + platform.CFrame.LookVector * DISTANCE

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

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

-- бесконечно туда-обратно
while true do
    -- едем вперёд
    align.Position = finish
    -- доехали и стоим секунду
    task.wait(TIME + 1)
    -- едем обратно
    align.Position = start
    -- доехали и стоим
    task.wait(TIME + 1)
-- конец цикла
end

ConveyorScript

Где: Workspace → Conveyor · Script
Зачем: Лента тащит игрока.

-- лента (Anchored вкл.)
local part = script.Parent
-- скорость ленты; игрок ходит со скоростью 16
local SPEED = 12

-- закреплённая деталь не едет, но везёт всех, кто на ней
part.AssemblyLinearVelocity = part.CFrame.LookVector * SPEED

Проверка

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