Нажми — и деталь появится в мире
- ⏱ Сколько займёт
- 40–60 минут, 6 шагов. Каждый шаг заканчивается результатом на экране.
- 💻 Что нужно
- Компьютер с Windows или macOS. Понадобится Roblox Studio — бесплатная, поставим на первом шаге. С телефона этот квест не проходится.
- ⏸ Если прервёшься
- Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
- 🎓 Чему научишься
- игровой цикл · таймер и раунды · состояния игры
Игра, которая идёт сама
Клык бьёт в склянки: восемь ударов. Все бросают дела и идут на палубу.
«Море живёт по склянкам, — говорит он. — Игра тоже. Ждём, играем, считаем победителя, начинаем снова».
Этот круг и есть настоящая многопользовательская игра. Без него — просто песочница.
Это запись из Roblox Studio: игра, которая объявляет старт и подводит итоги сама. Такой же круг раунда ты соберёшь за этот квест.
Читать текстом
Соберём круг раунда: подготовка, матч, итоги — и снова.
Вот весь механизм: четыре шага по кругу. Такой круг есть в каждой игре с матчами — от футбола до огромных сетевых проектов. Меняются только цифры и правила внутри.
Сердце матча
1 -- Script в ServerScriptService — сердце матча
2 local PREP, MATCH, RESULTS = 10, 90, 8
3
4 while true do
5 resetRound() -- чистим прошлый матч
6 countdown(PREP, "Матч через")
7 announce:FireAllClients("ПОЕХАЛИ!")
8 countdown(MATCH, "До конца")
9 announce:FireAllClients(whoLeads())
10 task.wait(RESULTS)
11 end -- и снова по кругу, вечно
Одиннадцать строк — и матч крутится вечно. while true do означает «повторяй, пока игра жива». Внутри — ровно тот круг, что был на схеме: сброс, отсчёт, старт, матч, итоги, пауза. Три числа в строке 2 — длительности фаз: PREP, MATCH, RESULTS. Пока не набирай это: цикл зовёт resetRound, countdown, whoLeads и announce, которых ещё нет. Их напишем дальше, а на шаге 4 будет весь скрипт целиком — оттуда и набирай, сверху вниз.
Прочитай это дважды. В нашем цикле пауза спрятана внутри countdown — там есть task.wait(1). Без неё Studio замирает секунд на десять, а потом Roblox сам обрывает скрипт строкой «Script timeout: exhausted allowed execution time» — и матч не запустится вовсе. Привычка простая: написал while — сразу поставь wait.
1 local function countdown(seconds, text)
2 for i = seconds, 1, -1 do -- шаг -1: считаем НАЗАД
3 announce:FireAllClients(text .. " " .. i)
4 task.wait(1) -- ждём ровно секунду
5 end
6 end
Знакомый for, но с хитростью: шаг -1 заставляет считать назад — 10, 9, 8… Каждый круг цикла кричит новое число всем игрокам и ждёт секунду. Так и получается таймер.

- 1ServerScriptService — сердце матча«+» на строке → Script. Тут крутится while true do: сброс, отсчёт, «ПОЕХАЛИ!», матч, итоги — и снова. Правило без исключений: написал while — сразу пиши task.wait, иначе Studio повиснет намертво вместе с несохранённой работой.
- 2ReplicatedStorage — рупор на всех«+» → RemoteEvent, назови «Объявление». Через него сервер кричит сразу всем: FireAllClients("До конца 10"). Тот же мост, что и раньше, только в обратную сторону.
- 3StarterGui — где появляется надпись«+» → ScreenGui, внутрь него TextLabel, а внутрь надписи — LocalScript с OnClientEvent. Никакой доски с SurfaceGui строить не нужно: текст живёт прямо на экране у каждого.
- 4Синий треугольник ▶ — дождись конца раундаНе выключай сразу: цикл обязан пойти по второму кругу сам. Красный квадрат рядом обрывает тест, если что-то пошло не так.
- 5Вкладка Script — окно OutputОткрывается отсюда, вкладки View в этой Studio нет. Если Studio замерла и не отвечает — почти всегда это while без task.wait внутри.
Это настоящий экран Roblox Studio 2026 — такой же, как у тебя: та же лента вкладок, тот же Explorer со всеми сервисами, та же панель Properties. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Чего на кадре нет — про то честно написано словами. Отмечай пройденное — прогресс сохранится.
Голос на весь остров
Помнишь мост из пятого острова? Он двусторонний. FireServer — один игрок просит сервер. FireAllClients — сервер объявляет всем сразу. Именно так работают надписи «ПОЕХАЛИ!» и «До конца 10».
1 -- LocalScript внутри TextLabel на экране
2 local label = script.Parent
3 local RS = game:GetService("ReplicatedStorage")
4 local announce = RS:WaitForChild("Объявление")
5
6 announce.OnClientEvent:Connect(function(text)
7 -- тут player НЕ приходит: клиент и так знает, что он это он
8 label.Text = text
9 end)
Ловит объявление OnClientEvent. И важная деталь, которая часто путает: здесь player первым не приходит. На сервере он нужен был, чтобы понять, кто крикнул. А клиенту это незачем — он и так один.
Проверка · Чем FireAllClients отличается от FireServer?
Что случится с while true do без task.wait внутри?
Оба верных ответа — +10 дублонов.

Игровой цикл: чем живут все сетевые игры
Почти любая многопользовательская игра крутится по кругу: ожидание — раунд — итоги — снова. Так устроены и шутеры, и обби, и прятки.
В Tower of Hell раунд длится восемь минут, потом башня собирается заново — и все начинают одновременно.
Цикл решает главную проблему: опоздавшие. Пришёл посреди раунда — подождал немного и играешь со всеми на равных.
Второй раунд начинается со старым счётом
Пятый вид поломки — пропущенная строка. Всё написанное верно, ошибок нет, первый матч честный. А со второго игра начинает разваливаться. Найди место, где чего-то не хватает.
1 local function resetRound()
2 for _, team in ipairs(Teams:GetChildren()) do
3 team["Очки"].Value = 0 -- счёт с чистого листа
4 end
5 sendHome() -- мяч в центр — уже умеем
6 lastTeam = nil -- и память о касании
7 end
1 -- дописываем В КОНЕЦ скрипта мяча (там уже есть ball, home,
2 -- sendHome и lastTeam — они нам понадобятся)
3 local Teams = game:GetService("Teams")
4 local RS = game:GetService("ReplicatedStorage")
5 local announce = RS:FindFirstChild("Объявление")
6 if not announce then -- нет — создаём сами
7 announce = Instance.new("RemoteEvent")
8 announce.Name = "Объявление"
9 announce.Parent = RS
10 end
11
12 local PREP, MATCH, RESULTS = 10, 90, 8
13
14 local function countdown(seconds, text)
15 for i = seconds, 1, -1 do
16 announce:FireAllClients(text .. " " .. i)
17 task.wait(1)
18 end
19 end
20
21 local function whoLeads()
22 local red = Teams["Красные"]["Очки"].Value
23 local blue = Teams["Синие"]["Очки"].Value
24 if red > blue then return "КРАСНЫЕ победили!" end
25 if blue > red then return "СИНИЕ победили!" end
26 return "НИЧЬЯ " .. red .. " : " .. blue -- поровну — тоже ответ
27 end
28
29 local function resetRound()
30 for _, team in ipairs(Teams:GetChildren()) do
31 team["Очки"].Value = 0
32 end
33 sendHome() -- из скрипта мяча
34 lastTeam = nil -- оттуда же
35 end
36
37 while true do -- цикл — САМЫМ ПОСЛЕДНИМ
38 resetRound()
39 countdown(PREP, "Матч через")
40 announce:FireAllClients("ПОЕХАЛИ!")
41 countdown(MATCH, "До конца")
42 announce:FireAllClients(whoLeads())
43 task.wait(RESULTS)
44 endСброс собирает всё, что ты делал в прошлых квестах: обнуляет счёт команд (остров 3), возвращает мяч домой (остров 4) и чистит память о касании (тоже остров 4). А вторая карточка — весь скрипт раундов целиком: добавь его в конец скрипта мяча, где уже живут ball, home, sendHome и lastTeam. И запомни порядок: сначала все функции, цикл — самой последней строкой. Всё, что окажется под while true do, не выполнится никогда.
Табло матча на экране
Надпись делается как кнопка, только это TextLabel: наведи на тот же ScreenGui → «+» → TextLabel, а внутрь неё → «+» → LocalScript. Размер и место — тем же fromScale. Ставь её сверху по центру — там взгляд ищет счёт и время, а середину экрана оставь для самой игры.
Матч уже идёт сам? Тогда добавь одну мелочь из списка. Особенно советую первую: когда время краснеет, последние секунды становятся настоящими.
Шестая галочка — главная проверка этого острова. Один раунд может выглядеть нормально по случайности. Три подряд покажут правду: если счёт каждый раз стартует с нуля, сброс работает.
Теперь это настоящая игра
Оглянись на список. Каждая строчка была отдельным островом, а вместе они собрались в работающую игру с матчами. Осталось одно: собрать всё в свою собственную — и это финальный остров.
Вызов друзьям: позови сразу троих и не объясняй ничего. Просто смотри, разберутся ли они сами. Если да — ты сделал понятную игру, а это умеют далеко не все взрослые разработчики.
Читать текстом
Жми — Гильдия отметит седьмой остров.