← Все практические скрипты
Мини-проекты · Уверенный · 30 мин

Мини-проект: гонка на время

Старт, финиш, честный замер времени и личный рекорд в текущем раунде.

Иллюстрация: Мини-проект: гонка на время
🎯 Что получится

Таймер фиксирует время пробежки и лучший результат игрока за текущий сеанс.

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

Где разместить: Несколько скриптов — смотрите инструкцию и отдельные блоки кода

В Workspace создайте два Part: RaceStart и RaceFinish. Сделайте их Anchored=true, CanTouch=true, расположите на противоположных концах трассы.
В ServerScriptService создайте обычный Script RaceTimer и вставьте код.
Включите Play. Коснитесь старта, пробегите маршрут и коснитесь финиша. Результат появится в Output сервера.
Для показа на экране можно добавить интерфейс отдельным уроком.

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

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

└── ServerScriptService
    └── RaceTimer (Script)

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

ServerScriptService/RaceTimer (Script)
local Players = game:GetService("Players")
local startPart = workspace:WaitForChild("RaceStart")
local finishPart = workspace:WaitForChild("RaceFinish")
local started = {}
local best = {}
local TOUCH_COOLDOWN = 2
local nextStart = {}
local function getPlayer(hit)
    local char = hit:FindFirstAncestorOfClass("Model")
    local hum = char and char:FindFirstChildOfClass("Humanoid")
    return hum and hum.Health > 0 and Players:GetPlayerFromCharacter(char)
end
startPart.Touched:Connect(function(hit)
    local player = getPlayer(hit)
    if not player then return end
    local now = os.clock()
    if now < (nextStart[player] or 0) then return end
    nextStart[player] = now + TOUCH_COOLDOWN
    started[player] = now
    print(player.Name .. ": старт!")
end)
finishPart.Touched:Connect(function(hit)
    local player = getPlayer(hit)
    if not player or not started[player] then return end
    local elapsed = os.clock() - started[player]
    if elapsed < 1 then return end -- защита от мгновенного финиша
    started[player] = nil
    best[player] = math.min(elapsed, best[player] or math.huge)
    print(string.format("%s: %.2f сек; рекорд %.2f сек", player.Name, elapsed, best[player]))
end)
Players.PlayerRemoving:Connect(function(player)
    started[player], best[player], nextStart[player] = nil, nil, nil
end)

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

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

Ваш прогресс

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

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

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

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

Сделайте трассу длиннее.

2. Улучшите

Добавьте прыжки и туннели между стартом и финишем.

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

Создайте три трассы: лёгкую, среднюю и сложную.

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

Когда следует остановить секундомер гонки?

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

В Output отображаются серверные сообщения, а не игровой интерфейс. Рекорды не сохраняются между посещениями.