Нажми — и деталь появится в мире
- ⏱ Сколько займёт
- 40–60 минут, 6 шагов. Каждый шаг заканчивается результатом на экране.
- 💻 Что нужно
- Компьютер с Windows или macOS. Понадобится Roblox Studio — бесплатная, поставим на первом шаге. С телефона этот квест не проходится.
- ⏸ Если прервёшься
- Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
- 🎓 Чему научишься
- события на всех игроков · синхронизация · защита от читов
У половины игроков нет клавиатуры
Посреди острова торчит ржавый рычаг. Капитан кладёт на него руку, но не тянет.
«Опасная штука, — говорит он. — Один дёрнул — изменилось у всех. Хочешь, чтобы кто угодно мог такое?»
Значит, сервер обязан проверять: имеет ли право тот, кто дёргает. Иначе игру сломают за вечер.
Механика та же, вид другой: вместо плиты у тебя будет кнопка прямо на экране, а вместо ворот — маяк, который вспыхивает у обоих игроков. И кнопка, в отличие от плиты, работает на телефоне.
Читать текстом
Мост ты уже построил — осталось приделать к нему красивую ручку.
Дело не только в телефонах. Клавиша — это секрет, о котором надо догадаться. Кнопка — приглашение: её видно, на ней написано, что будет. Хорошая игра не заставляет угадывать.
Где живёт интерфейс
Три вложенных слоя, как матрёшка: StarterGui раздаёт интерфейс каждому, ScreenGui — холст на весь экран, TextButton — сама кнопка. А LocalScript живёт внутри кнопки, и тогда script.Parent — это она сама.
1 -- LocalScript ВНУТРИ самой кнопки
2 local button = script.Parent -- script.Parent = TextButton
3 local RS = game:GetService("ReplicatedStorage")
4 local event = RS:WaitForChild("ЗажечьМаяк")
5
6 button.MouseButton1Click:Connect(function()
7 event:FireServer() -- тот же мост, что и с клавишей!
8 end)
Восемь строк — и вся кнопка готова. Присмотрись к строке 7: это точно тот же FireServer, что был у клавиши. Серверный код не тронут ни на букву — ему всё равно, откуда прилетел сигнал.
Вот за это программисты и любят мосты. Захочешь потом добавить третий способ — жест, команду в чате, нажатие на сам маяк — сервер останется прежним. Хорошо сделанная середина экономит уйму работы.

- 1GUI — быстрый способ добавить экранный интерфейсКнопка на ленте, стрелка рядом раскрывает список элементов. То же самое делается и вручную через Explorer — так даже понятнее, потому что видно всю матрёшку целиком.
- 2StarterGui — три слоя матрёшки«+» на строке → ScreenGui (холст на весь экран), внутрь него «+» → TextButton (сама кнопка), а внутрь кнопки — LocalScript. Тогда script.Parent — это она сама. StarterGui раздаёт всё это каждому игроку при входе.
- 3ReplicatedStorage — мост уже построенRemoteEvent «ЗажечьМаяк» лежит тут с прошлого острова. Кнопка зовёт тот же самый FireServer — серверный код не меняется ни на букву, ему всё равно, кто позвал: клавиша или палец.
- 4Панель Properties — размер кнопки в долях экранаПусто, пока ничего не выделено. Выдели TextButton — и правь Size через UDim2.fromScale(0.22, 0.09), а не в пикселях: 200 пикселей на мониторе крошечные, на телефоне — пол-экрана. Плюс AnchorPoint (0.5, 0.5) и TextScaled.
- 5Синий треугольник ▶ — ткни свою кнопкуМаяк должен загореться. А чтобы проверить телефон, просто сузь окно Studio мышью: кнопка, заданная в долях, останется на месте и того же вида.
Это настоящий экран Roblox Studio 2026 — такой же, как у тебя: та же лента вкладок, тот же Explorer со всеми сервисами, та же панель Properties. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Чего на кадре нет — про то честно написано словами. Отмечай пройденное — прогресс сохранится.
Размер, который не ломается
Главный секрет всех интерфейсов, и он простой: задавай размер в долях экрана, а не в пикселях. 0.22 — это «двадцать два процента ширины», и на любом устройстве кнопка будет выглядеть одинаково.
1 -- размер и место кнопки
2 button.Size = UDim2.fromScale(0.22, 0.09)
3 -- 22% ширины экрана и 9% высоты — на любом устройстве
4
5 button.Position = UDim2.fromScale(0.5, 0.88)
6 button.AnchorPoint = Vector2.new(0.5, 0.5)
7 -- якорь в середине кнопки → 0.5 ставит её ровно по центру
8
9 button.Text = "ЗАЖЕЧЬ МАЯК"
10 button.TextScaled = true -- буквы подстроятся сами
Эти строки идут в тот же LocalScript, выше блока MouseButton1Click. То же самое можно выставить и мышкой: выдели TextButton и заполни в Properties поля Size, Position, AnchorPoint, Text, TextScaled — многим так проще. Строка 6 — маленькое волшебство. AnchorPoint говорит: «считай точкой кнопки её середину». Без него позиция 0.5 поставит по центру левый верхний угол, и кнопка уедет вправо. С ним — встанет ровно посередине.
Проверка · Кнопка задана в пикселях. Что будет на телефоне?
Зачем нужен AnchorPoint = (0.5, 0.5)?
Оба верных ответа — +10 дублонов.

Событие, которое меняет мир для всех
Когда один игрок дёргает рычаг, а меняется у всех — это сетевое событие. В Roblox оно называется RemoteEvent.
Опасность в том, что послать такое сообщение может кто угодно. Поэтому сервер обязан проверять: имел ли право, не слишком ли часто, есть ли предмет.
Профессионалы говорят коротко: клиент просит — сервер решает. Всё, что не проверено, обязательно сломают.
На компьютере красиво, на телефоне беда
Новый вид поломки, самый подлый: на твоём экране всё идеально. Ошибка живёт только у других. Найди строку, из-за которой кнопка не умеет подстраиваться.
Возьми это правило во все будущие игры: «у меня работает» — это ещё не «работает». В Studio есть режим просмотра с телефона: вкладка Test → кнопка Device (в новом интерфейсе она может называться «Device Emulation»). Включил — Studio показывает игру в рамке телефона, и кнопку сразу видно как есть. Заглядывать туда стоит до того, как позовёшь друзей.
Кнопка, которая ждёт
Живая кнопка отвечает: гасни, пиши «подожди», потом возвращайся. Это называется перезарядкой, и она есть в каждой второй игре — иначе первый же ребёнок устроит из твоего маяка светомузыку.
1 local cooling = false -- снаружи функции — уже знаешь почему!
2
3 button.MouseButton1Click:Connect(function()
4 if cooling then return end -- ещё остываем — уходим
5 cooling = true
6
7 event:FireServer()
8 button.Text = "ПОДОЖДИ..."
9 task.wait(3)
10 button.Text = "ЗАЖЕЧЬ МАЯК"
11 cooling = false
12 end)
Узнаёшь приём? Переменная снаружи функции — ровно как lastTeam у мяча. Флажок зовётся cooling («остываем»), а return в строке 4 значит «выходим отсюда прямо сейчас»: если ещё остываем, дальше код просто не пойдёт.
Последняя галочка — новая привычка, которой не было в прошлых квестах. Test → Device показывает игру глазами телефона. Заглядывай туда всегда: половина игроков видит именно это.
Панель управления островом
Самое приятное: вторая кнопка делается за минуту. Скопировал первую, поменял текст и название сигнала — готово. Добавь одну свою: например, «новый мяч» или «сбросить счёт».
Вызов другу: пусть зайдёт с телефона. Если кнопка на месте и нажимается пальцем — ты сделал игру, в которую могут играть все, а не только те, у кого компьютер.
Читать текстом
Жми — Гильдия отметит шестой остров.