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

Чекпоинты

Длинную полосу никто не пройдёт с начала после каждой ошибки. Чекпоинты запоминают этап, а таблица по Tab показывает, кто дальше всех.

Структура

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

Workspace
└─ Checkpoints (Folder)
   ├─ 0 (Part) — старт
   └─ 1, 2, 3… (Part) — чекпоинты по порядку
ServerScriptService
└─ Checkpoints (Script)

Шаги

  1. Workspace → Folder «Checkpoints». В нём плоские детали, названные числами: «0» — на старте, рядом со SpawnLocation, дальше «1», «2», «3»… по ходу полосы.
  2. Чекпоинты Anchored вкл., CanCollide вкл. — на них стоят. Яркий цвет или Neon, чтобы их было видно.
  3. ServerScriptService → Script «Checkpoints».
  4. leaderstats — папка с таким именем в игроке: Roblox сам показывает её значения в таблице по Tab. Stage — этап.
  5. CharacterAdded срабатывает после каждой смерти: скрипт ставит персонажа на чекпоинт его этапа.
  6. Засчитывается только следующий номер: со 2 чекпоинта нельзя «перепрыгнуть» на 5, и назад этап не уменьшается.

Скрипты

Checkpoints

Где: ServerScriptService · Script
Зачем: Этапы игроков и появление на чекпоинте.

-- сервис игроков
local Players = game:GetService("Players")
-- папка с чекпоинтами 0, 1, 2…
local checkpoints = workspace:WaitForChild("Checkpoints")

-- игрок зашёл
Players.PlayerAdded:Connect(function(player)
    -- таблица по Tab
    local leaderstats = Instance.new("Folder")
    -- имя строго такое
    leaderstats.Name = "leaderstats"
    -- в игрока
    leaderstats.Parent = player
    -- номер этапа
    local stage = Instance.new("IntValue")
    -- столбец «Stage»
    stage.Name = "Stage"
    -- в таблицу
    stage.Parent = leaderstats

    -- персонаж появился (и после каждой смерти)
    player.CharacterAdded:Connect(function(character)
        -- Humanoid персонажа
        local humanoid = character:WaitForChild("Humanoid")
        -- ждём, пока персонаж соберётся
        character:WaitForChild("HumanoidRootPart")
        -- чекпоинт текущего этапа
        local point = checkpoints:FindFirstChild(tostring(stage.Value))
        -- нашёлся
        if point then
            -- даём Roblox закончить появление на SpawnLocation
            task.wait(0.1)
            -- ставим над чекпоинтом
            character:PivotTo(point.CFrame + Vector3.new(0, 3, 0))
        -- конец проверки
        end
        -- персонаж чего-то коснулся
        humanoid.Touched:Connect(function(hit)
            -- это следующий по номеру чекпоинт
            if hit.Parent == checkpoints and tonumber(hit.Name) == stage.Value + 1 then
                -- этап пройден
                stage.Value += 1
            -- конец проверки
            end
        -- конец функции
        end)
    -- конец функции
    end)
-- конец функции
end)

Проверка

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