← Все практические скрипты
Большие проекты · Продвинутый · 55 мин

Большой проект: побег из лаборатории

Три ключ-карты, лазеры, контрольная точка и дверь на выход.

Иллюстрация: Большой проект: побег из лаборатории
🎯 Что получится

Мини-игра на поиск трёх карт с дверью, лазерами и возрождением у контрольной точки.

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

Где разместить: Отдельные блоки кода: создайте файлы в указанных местах

В Workspace создайте Folder LabCards. Внутри три Part с именами Card1, Card2 и Card3. Установите Anchored=true, CanTouch=true, CanCollide=false.
В Workspace создайте Part LabExit (Anchored=true), а также Part LabCheckpoint (Anchored=true, CanTouch=true). Создайте Folder LabLasers и разместите в нём опасные Parts.
В ServerScriptService создайте три обычных Script: LabCardsAndDoor, LabCheckpointScript и LabLaserScript. Скопируйте код каждого файла отдельно.
Для испытания запустите Play: найдите три карты, пройдите лазеры, сохранитесь на контрольной точке и нажмите E у двери. Системы независимы, не требуют Coins.

Карта файлов в Explorer

Это пути для скриптов из блоков кода ниже. Остальные объекты создайте по инструкции.

└── ServerScriptService
    ├── LabCardsAndDoor (Script)
    ├── LabCheckpointScript (Script)
    └── LabLaserScript (Script)

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

ServerScriptService/LabCardsAndDoor (Script)
local Players = game:GetService("Players")
local cards = workspace:WaitForChild("LabCards")
local door = workspace:WaitForChild("LabExit")
local collected = {}
local prompt = Instance.new("ProximityPrompt")
prompt.ActionText = "Открыть выход"
prompt.ObjectText = "Нужны три карты"
prompt.MaxActivationDistance = 10
prompt.Parent = door
local open = false
for _, card in ipairs(cards:GetChildren()) do
    if card:IsA("BasePart") then
        card.Touched:Connect(function(hit)
            local char = hit:FindFirstAncestorOfClass("Model")
            local player = char and Players:GetPlayerFromCharacter(char)
            if not player then return end
            collected[player] = collected[player] or {}
            collected[player][card.Name] = true
        end)
    end
end
prompt.Triggered:Connect(function(player)
    if open then return end
    local found = collected[player] or {}
    if not (found.Card1 and found.Card2 and found.Card3) then return end
    open = true
    prompt.Enabled = false
    door.Transparency = 0.75
    door.CanCollide = false
    task.wait(8)
    door.CanCollide = true
    door.Transparency = 0
    prompt.Enabled = true
    open = false
end)
Players.PlayerRemoving:Connect(function(player) collected[player] = nil end)
ServerScriptService/LabCheckpointScript (Script)
local Players = game:GetService("Players")
local checkpoint = workspace:WaitForChild("LabCheckpoint")
local saved = {}
checkpoint.Touched:Connect(function(hit)
    local char = hit:FindFirstAncestorOfClass("Model")
    local player = char and Players:GetPlayerFromCharacter(char)
    if player then saved[player] = checkpoint.CFrame + Vector3.new(0, 5, 0) end
end)
local function bind(player)
    player.CharacterAdded:Connect(function(char)
        local root = char:WaitForChild("HumanoidRootPart", 10)
        if root and saved[player] then
            task.wait(0.15)
            char:PivotTo(saved[player])
        end
    end)
end
Players.PlayerAdded:Connect(bind)
for _, player in ipairs(Players:GetPlayers()) do bind(player) end
Players.PlayerRemoving:Connect(function(player) saved[player] = nil end)
ServerScriptService/LabLaserScript (Script)
local Players = game:GetService("Players")
local lasers = workspace:WaitForChild("LabLasers")
local nextHit = {}
local function connect(laser)
    if not laser:IsA("BasePart") then return end
    laser.Touched:Connect(function(hit)
        local char = hit:FindFirstAncestorOfClass("Model")
        local hum = char and char:FindFirstChildOfClass("Humanoid")
        local player = char and Players:GetPlayerFromCharacter(char)
        if not player or not hum or hum.Health <= 0 then return end
        local now = os.clock()
        if now < (nextHit[hum] or 0) then return end
        nextHit[hum] = now + 1
        hum:TakeDamage(20)
    end)
end
for _, obj in ipairs(lasers:GetChildren()) do connect(obj) end
lasers.ChildAdded:Connect(connect)

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

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

Ваш прогресс

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

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

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

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

Измените урон лазеров с 20 на 10.

2. Улучшите

Разместите карты на разных этажах и добавьте подсказки.

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

Постройте собственную историю побега с тремя комнатами и несколькими развилками.

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

Какие механики объединены в большом проекте лаборатории?

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

Имена LabCards, Card1–Card3, LabExit, LabCheckpoint и LabLasers должны совпадать точно. Дверь общая для игроков; прогресс не сохраняется после выхода.