Блог школы Роблоппа — Роблокс Студио, обучение, познавательные статьи и новости школы

10 скриптов на таймеры в Роблокс Студио — подробный гайд

2025-10-05 22:42 Туториалы
Таймеры — одна из первых полезных вещей, которые пригодятся в любой игре: гонка, испытание, мини-игра, магазин со временем действия и т.д. В этом руководстве я подробно покажу как создать таймер с TextLabel и дам 10 готовых вариантов — от простого обратного отсчёта до серверного раунд-таймера и таймера с прогресс-баром. Для каждого примера я укажу куда вставлять скрипт и дам объяснение «пошагово», чтобы даже ребёнок понял.

Важное правило перед началом

  • GUI-таймеры делаются в LocalScript (они работают у конкретного игрока).
  • Место для LocalScript: StarterPlayer → StarterPlayerScripts или StarterGui → ScreenGui → LocalScript внутри нужного UI.
  • Если таймер влияет на всю игру (раунд, событие для всех игроков) — логика должна быть на сервере (Script в ServerScriptService), а сервер уведомляет клиентов через RemoteEvent в ReplicatedStorage.
  • Всегда используем task.wait() (или RunService) вместо устаревшего wait() для стабильности.

Как создать простейший таймер с TextLabel

  1. В Роблокс Студио открой Explorer и Properties.
  2. В StarterGui создай новый ScreenGui.
  3. Внутри ScreenGui создай TextLabel. Поставь:
  • Size = UDim2.new(0, 200, 0, 50)
  • Position = UDim2.new(0.5, -100, 0, 20)
  • TextScaled = true
  • Text = "Время: 0"
  1. В ScreenGui добавь LocalScript и вставь туда код таймера (см. ниже в примерах).
  2. Запусти Play — таймер должен работать.

1) Простой обратный отсчёт (LocalScript)

Куда вставлять: StarterGui > ScreenGui > LocalScript
local timeLeft = 30 -- секунды
local label = script.Parent:WaitForChild("TextLabel")

while timeLeft > 0 do
label.Text = "Время: " .. timeLeft
task.wait(1) -- ждём 1 секунду
timeLeft -= 1
end

label.Text = "Время вышло!"
Объяснение: каждую секунду уменьшаем timeLeft и обновляем текст.

2) Отображение формата MIN:SEC (красивая строка)

Куда вставлять: StarterGui > ScreenGui > LocalScript
local timeLeft = 125 -- 2 минуты 5 секунд
local label = script.Parent:WaitForChild("TextLabel")

local function formatTime(t)
local minutes = math.floor(t / 60)
local seconds = t % 60
return string.format("%02d:%02d", minutes, seconds)
end

while timeLeft >= 0 do
label.Text = formatTime(timeLeft)
task.wait(1)
timeLeft -= 1
end

label.Text = "00:00"
Объяснение: функция formatTime делает вывод MM:SS с ведущими нулями.

3) Счётчик вверх (1, 2, 3, ...)

Куда вставлять: StarterGui > ScreenGui > LocalScript
local elapsed = 0
local label = script.Parent:WaitForChild("TextLabel")

while true do
label.Text = "Время: " .. elapsed .. " с"
task.wait(1)
elapsed += 1
end
Используется для: таймеров-стопвочей, записи времени прохождения уровня.

4) Таймер с прогресс-баром (TextLabel + Frame)

Куда вставлять: StarterGui > ScreenGui > LocalScript. В ScreenGui добавь Frame (фон) и внутри Frame — Frame (полоса прогресса). Назови внутреннюю Progress.
local total = 10
local label = script.Parent:WaitForChild("TextLabel")
local progress = script.Parent:WaitForChild("Frame"):WaitForChild("Progress")

for i = 0, total do
label.Text = "Осталось: " .. (total - i) .. " с"
progress.Size = UDim2.new(i/total, 0, 1, 0)
task.wait(1)
end

label.Text = "Готово!"
progress.Size = UDim2.new(1,0,1,0)
Объяснение: Progress.Size.X.Scale меняется от 0 до 1.

5) Повторяющийся таймер (каждые N секунд запускаем событие)

Куда вставлять: StarterGui > ScreenGui > LocalScript или ServerScriptService > Script, если событие должно запускаться на сервере.
local interval = 5 -- с
local label = script.Parent:WaitForChild("TextLabel")
local counter = 0

while true do
task.wait(interval)
counter += 1
label.Text = "Волна: " .. counter
-- тут можно запустить событие: например, создать врагов
end
Если нужно, чтобы все игроки узнали о волне — делаем этот Script в ServerScriptService и сообщаем через RemoteEvent.

6) Таймер с паузой/резюмом (Pause / Resume кнопки)

Куда вставлять: в StarterGui > ScreenGui создайте TextButton Pause и TextButton Resume, LocalScript внутри ScreenGui.
local label = script.Parent:WaitForChild("TextLabel")
local pauseBtn = script.Parent:WaitForChild("Pause")
local resumeBtn = script.Parent:WaitForChild("Resume")

local timeLeft = 60
local paused = false

pauseBtn.MouseButton1Click:Connect(function()
paused = true
end)

resumeBtn.MouseButton1Click:Connect(function()
paused = false
end)

while timeLeft > 0 do
if not paused then
label.Text = "Время: " .. timeLeft
timeLeft -= 1
end
task.wait(1)
end

label.Text = "Конец"
Объяснение: флаг paused управляет циклом.

7) Персональный таймер игрока (каждому своё время)

Куда вставлять: StarterPlayer > StarterPlayerScripts > LocalScript
local label = script.Parent:WaitForChild("TextLabel")
local timeLeft = 30

while timeLeft > 0 do
label.Text = "Твой таймер: " .. timeLeft
task.wait(1)
timeLeft -= 1
end

label.Text = "Почти конец!"
Примечание: каждый игрок при заходе запускает свой LocalScript — у всех будут свои часы.

8) Серверный раунд-таймер (всем игрокам показываем одно и то же)

Куда вставлять:
  • В ReplicatedStorage создайте RemoteEvent с именем RoundTimeEvent.
  • В ServerScriptService — Script для отсчёта времени.
  • В StarterGui > ScreenGui > LocalScript подпишитесь на RoundTimeEvent и обновляйте TextLabel.
Server Script (ServerScriptService):
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local roundEvent = ReplicatedStorage:WaitForChild("RoundTimeEvent")

local roundTime = 90

while roundTime >= 0 do
roundEvent:FireAllClients(roundTime)
task.wait(1)
roundTime -= 1
end

roundEvent:FireAllClients(0)
LocalScript (в ScreenGui):
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local roundEvent = ReplicatedStorage:WaitForChild("RoundTimeEvent")
local label = script.Parent:WaitForChild("TextLabel")

roundEvent.OnClientEvent:Connect(function(timeLeft)
label.Text = "Раунд: " .. timeLeft .. " с"
end)
Преимущество: таймер контролируется сервером — нельзя подделать время, все синхронизированы.

9) Таймер с уведомлением (когда осталось N секунд — показать сообщение)

Куда вставлять: StarterGui > ScreenGui > LocalScript
local label = script.Parent:WaitForChild("TextLabel")
local timeLeft = 20

while timeLeft >= 0 do
label.Text = "Осталось: " .. timeLeft
if timeLeft == 10 then
-- показываем на экране уведомление
local notice = Instance.new("TextLabel", script.Parent)
notice.Size = UDim2.new(0,200,0,50)
notice.Position = UDim2.new(0.5,-100,0.3,0)
notice.Text = "10 секунд осталось!"
task.delay(2, function() notice:Destroy() end)
end
task.wait(1)
timeLeft -= 1
end
label.Text = "Время вышло!"
Используется в: гонках, испытаниях, когда нужно предупредить игрока.

10) Таймер-спаун (по таймеру создаём предмет на сервере)

Куда вставлять:
  • ServerScriptService > Script (логика спауна).
  • Предмет для спауна положите в ServerStorage или ReplicatedStorage.
local ServerStorage = game:GetService("ServerStorage")
local spawnItem = ServerStorage:WaitForChild("HealthPack")
local spawnPos = workspace:WaitForChild("SpawnPoint")

while true do
task.wait(30) -- каждые 30 секунд
local clone = spawnItem:Clone()
clone.Parent = workspace
clone.Position = spawnPos.Position
end
Важно: это серверный код — спавн нужен всем, поэтому он на сервере.

Практические советы и частые ошибки

  1. TextLabel должен быть в ScreenGui (в StarterGui), а скрипт — LocalScript, иначе GUI не появится у игрока.
  2. Не запускайте бесконечные циклы без пауз (while true do + task.wait()), иначе Studio «подвиснет».
  3. Для UI используйте RenderStepped, если нужно обновлять каждый кадр (например, плавное движение прогресс-бара). Но для секундного таймера — task.wait(1) проще.
  4. Синхронизация: если таймер влияет на всех — делайте его на сервере и рассылайте клиентам RemoteEvent.
  5. Дебаунс и защита: если у кнопки «старт» есть таймер и игроки могут кликать много раз, используйте флаг debounce, чтобы не запустить таймер несколько раз.
  6. Тестируйте на телефоне — иногда GUI выглядит по-другому на маленьком экране. Используйте Device Emulator.

Борьба с фальшивыми таймерами (читерство)

Если таймер влияет на геймплей (например, покупка предметов, начало/конец раунда), контролируйте его на сервере. Никогда не доверяйте только LocalScript'у для важных действий.

Быстрый чек-лист перед публикацией

  • GUI появляется у игрока? (да — LocalScript в StarterGui)
  • Таймер не блокирует игру? (нет зависаний)
  • Если нужен общий таймер — он на сервере и клиенты получают данные через RemoteEvent.
  • Таймер показывает корректный формат (мм:сс) — удобно смотреть.
  • Все кнопки для управления таймером работают (паузa, рестарт).

🚀 Хочешь научиться создавать таймеры и другие крутые фишки в Роблокс Студио?

Записывайся на занятия на сайте roblo.ru! Там ты узнаешь, как делать собственные игры, придумывать задания и удивлять друзей своими проектами. Начни путь разработчика прямо сейчас!