Таймеры — одна из первых полезных вещей, которые пригодятся в любой игре: гонка, испытание, мини-игра, магазин со временем действия и т.д. В этом руководстве я подробно покажу как создать таймер с TextLabel и дам 10 готовых вариантов — от простого обратного отсчёта до серверного раунд-таймера и таймера с прогресс-баром. Для каждого примера я укажу куда вставлять скрипт и дам объяснение «пошагово», чтобы даже ребёнок понял.
Важное правило перед началом
- GUI-таймеры делаются в LocalScript (они работают у конкретного игрока).
- Место для LocalScript: StarterPlayer → StarterPlayerScripts или StarterGui → ScreenGui → LocalScript внутри нужного UI.
- Если таймер влияет на всю игру (раунд, событие для всех игроков) — логика должна быть на сервере (Script в ServerScriptService), а сервер уведомляет клиентов через RemoteEvent в ReplicatedStorage.
- Всегда используем task.wait() (или RunService) вместо устаревшего wait() для стабильности.
Как создать простейший таймер с TextLabel
- В Роблокс Студио открой Explorer и Properties.
- В StarterGui создай новый ScreenGui.
- Внутри ScreenGui создай TextLabel. Поставь:
- Size = UDim2.new(0, 200, 0, 50)
- Position = UDim2.new(0.5, -100, 0, 20)
- TextScaled = true
- Text = "Время: 0"
- В ScreenGui добавь LocalScript и вставь туда код таймера (см. ниже в примерах).
- Запусти 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
Важно: это серверный код — спавн нужен всем, поэтому он на сервере.
Практические советы и частые ошибки
- TextLabel должен быть в ScreenGui (в StarterGui), а скрипт — LocalScript, иначе GUI не появится у игрока.
- Не запускайте бесконечные циклы без пауз (while true do + task.wait()), иначе Studio «подвиснет».
- Для UI используйте RenderStepped, если нужно обновлять каждый кадр (например, плавное движение прогресс-бара). Но для секундного таймера — task.wait(1) проще.
- Синхронизация: если таймер влияет на всех — делайте его на сервере и рассылайте клиентам RemoteEvent.
- Дебаунс и защита: если у кнопки «старт» есть таймер и игроки могут кликать много раз, используйте флаг debounce, чтобы не запустить таймер несколько раз.
- Тестируйте на телефоне — иногда GUI выглядит по-другому на маленьком экране. Используйте Device Emulator.
Борьба с фальшивыми таймерами (читерство)
Если таймер влияет на геймплей (например, покупка предметов, начало/конец раунда), контролируйте его на сервере. Никогда не доверяйте только LocalScript'у для важных действий.
Быстрый чек-лист перед публикацией
- GUI появляется у игрока? (да — LocalScript в StarterGui)
- Таймер не блокирует игру? (нет зависаний)
- Если нужен общий таймер — он на сервере и клиенты получают данные через RemoteEvent.
- Таймер показывает корректный формат (мм:сс) — удобно смотреть.
- Все кнопки для управления таймером работают (паузa, рестарт).
🚀 Хочешь научиться создавать таймеры и другие крутые фишки в Роблокс Студио?
Записывайся на занятия на сайте roblo.ru! Там ты узнаешь, как делать собственные игры, придумывать задания и удивлять друзей своими проектами. Начни путь разработчика прямо сейчас!
