К карте
ОСТРОВА ИГРОКОВ · ЭКСПЕДИЦИЯ V · КВЕСТ 6
Рычаг для всех
0
Прогресс0 / 6
ПОСТАВЬ ПЕРВУЮ ДЕТАЛЬ

Нажми — и деталь появится в мире

Жми кнопки по очереди — это три строчки настоящего скрипта.
ПЕРЕД СТАРТОМ
⏱ Сколько займёт
40–60 минут, 6 шагов. Каждый шаг заканчивается результатом на экране.
💻 Что нужно
Компьютер с Windows или macOS. Понадобится Roblox Studio — бесплатная, поставим на первом шаге. С телефона этот квест не проходится.
⏸ Если прервёшься
Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
🎓 Чему научишься
события на всех игроков · синхронизация · защита от читов
ШАГ 1 ИЗ 6 · ЭКСПЕДИЦИЯ V · ПИРАТСКАЯ БУХТА · КВЕСТ 6

У половины игроков нет клавиатуры

ЧТО ПРОИСХОДИТ
ЭПИЗОД 23Пиратская Бухта

Посреди острова торчит ржавый рычаг. Капитан кладёт на него руку, но не тянет.

«Опасная штука, — говорит он. — Один дёрнул — изменилось у всех. Хочешь, чтобы кто угодно мог такое?»

Значит, сервер обязан проверять: имеет ли право тот, кто дёргает. Иначе игру сломают за вечер.

капитан Рэй · капитан «Дублона»
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ГОТОВОЙ ИГРЫ
Старший брат сегодняшнего приёма: один игрок наступил на плиту — ворота открылись для всех, потому что их двигает сервер, а не чей-то экран.

Механика та же, вид другой: вместо плиты у тебя будет кнопка прямо на экране, а вместо ворот — маяк, который вспыхивает у обоих игроков. И кнопка, в отличие от плиты, работает на телефоне.

СНАЧАЛА — ПОСМОТРИ
ЖИВАЯ ЗАПИСЬ СТУДИИ
Плита с красной кнопкой и светящаяся дверь: одно событие — и мир поменялся для всех. Твоя экранная кнопка сработает точно так же.
ШТУРМАН · ВЕДУЩИЙ
Читать текстом
Связной, у твоего маяка есть проблема, о которой ты пока не догадываешься. Он зажигается по клавише E — а больше половины игроков Roblox сидят с телефона. У них нет никакой клавиши E. Они зайдут, побегают, не поймут, что нужно нажать, и уйдут. Сегодня чиним это по-взрослому: рисуем настоящую кнопку прямо на экране. И знаешь, что самое приятное? Серверный код менять не придётся вообще.

Мост ты уже построил — осталось приделать к нему красивую ручку.

Компьютер клавиатура есть — жми E Телефон клавиатуры НЕТ игрок уходит Кнопка на экране работает и там, и там Её видно, по ней понятно, что делать — и её можно ткнуть пальцем

Дело не только в телефонах. Клавиша — это секрет, о котором надо догадаться. Кнопка — приглашение: её видно, на ней написано, что будет. Хорошая игра не заставляет угадывать.

ШАГ 2 ИЗ 6 · ~15 МИНУТ

Где живёт интерфейс

Матрёшка интерфейса — три уровня ▾ StarterGui папка: раздаётся каждому игроку при входе ▾ ScreenGui — холст на весь экран ▾ TextButton — сама кнопка LocalScript — мозг кнопки Скрипт кладём ВНУТРЬ кнопки — тогда script.Parent и есть она

Три вложенных слоя, как матрёшка: StarterGui раздаёт интерфейс каждому, ScreenGui — холст на весь экран, TextButton — сама кнопка. А LocalScript живёт внутри кнопки, и тогда script.Parent — это она сама.

LocalScript внутри TextButton
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, что был у клавиши. Серверный код не тронут ни на букву — ему всё равно, откуда прилетел сигнал.

клавиша E FireServer() кнопка на экране FireServer() ОДИН серверный код ему всё равно, кто позвал Добавляй сколько угодно способов позвать — сервер не переписывается

Вот за это программисты и любят мосты. Захочешь потом добавить третий способ — жест, команду в чате, нажатие на сам маяк — сервер останется прежним. Хорошо сделанная середина экономит уйму работы.

НАСТОЯЩИЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 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 мышью: кнопка, заданная в долях, останется на месте и того же вида.
Отмечено:0 из 5

Это настоящий экран Roblox Studio 2026 — такой же, как у тебя: та же лента вкладок, тот же Explorer со всеми сервисами, та же панель Properties. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Чего на кадре нет — про то честно написано словами. Отмечай пройденное — прогресс сохранится.

ШАГ 3 ИЗ 6 · ~20 МИНУТ

Размер, который не ломается

Два способа задать размер — и только один правильный OFFSET — в пикселях UDim2.new(0, 200, 0, 60) большой экран кнопка-крошка телефон вылезла за край 200 пикселей — это всегда 200 пикселей, а экраны разные так делать НЕ надо SCALE — в долях экрана UDim2.fromScale(0.22, 0.09) большой экран 22% ширины телефон те же 22% кнопка подстраивается под любой экран сама вот так — правильно

Главный секрет всех интерфейсов, и он простой: задавай размер в долях экрана, а не в пикселях. 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 поставит по центру левый верхний угол, и кнопка уедет вправо. С ним — встанет ровно посередине.

Проверка · Кнопка задана в пикселях. Что будет на телефоне?

Ничего, Roblox подстроит сам
Экран меньше, а кнопка та же — займёт пол-экрана или вылезет
Кнопка исчезнет
200 пикселей на большом мониторе — маленькая кнопочка. На узком телефоне — почти вся ширина.

Зачем нужен AnchorPoint = (0.5, 0.5)?

Чтобы позиция считалась по центру кнопки, а не по её углу
Чтобы кнопку нельзя было двигать
Чтобы кнопка стала круглой
Представь, что держишь картинку за уголок или за середину. Куда она встанет — зависит от того, за что держишь.

Оба верных ответа — +10 дублонов.

ЭКСКУРС
БЕЗОПАСНОСТЬ

Событие, которое меняет мир для всех

Когда один игрок дёргает рычаг, а меняется у всех — это сетевое событие. В Roblox оно называется RemoteEvent.

Опасность в том, что послать такое сообщение может кто угодно. Поэтому сервер обязан проверять: имел ли право, не слишком ли часто, есть ли предмет.

Профессионалы говорят коротко: клиент просит — сервер решает. Всё, что не проверено, обязательно сломают.

ШАГ 4 ИЗ 6 · ТРЕНАЖЁР

На компьютере красиво, на телефоне беда

LocalScript — кнопка, которая ломается на телефоне
1local button = script.Parent
2button.Text = "ЗАЖЕЧЬ МАЯК"
3button.TextScaled = true
4button.Size = UDim2.new(0, 320, 0, 90)
5button.Position = UDim2.fromScale(0.5, 0.88)
6button.AnchorPoint = Vector2.new(0.5, 0.5)
7button.MouseButton1Click:Connect(function()
8 event:FireServer()
9end)
ЧТО ВИДЯТ ИГРОКИ
У тебя на мониторе всё отлично. Друг заходит с телефона — кнопка занимает пол-экрана и половина её торчит за краем. Ошибок в Output нет.

Новый вид поломки, самый подлый: на твоём экране всё идеально. Ошибка живёт только у других. Найди строку, из-за которой кнопка не умеет подстраиваться.

Четыре вида поломок — ты собрал все 1. Красная строка — код упал, место указано 2. Печатает успех, а игра не меняется — делаем не то 3. Полная тишина — где-то пусто вместо значения 4. У тебя работает, у других нет — забыл про чужие экраны Четвёртая лечится только одним: проверить не на себе

Возьми это правило во все будущие игры: «у меня работает» — это ещё не «работает». В Studio есть режим просмотра с телефона: вкладка Test → кнопка Device (в новом интерфейсе она может называться «Device Emulation»). Включил — Studio показывает игру в рамке телефона, и кнопку сразу видно как есть. Заглядывать туда стоит до того, как позовёшь друзей.

ШАГ 5 ИЗ 6 · ~15 МИНУТ

Кнопка, которая ждёт

Кнопка должна отвечать на нажатие ЗАЖЕЧЬ готова — яркая ПОДОЖДИ 3 остывает — тусклая ЗАЖЕЧЬ снова готова Без паузы игрок задолбит кнопку двадцать раз в секунду и маяк превратится в мигающую дискотеку

Живая кнопка отвечает: гасни, пиши «подожди», потом возвращайся. Это называется перезарядкой, и она есть в каждой второй игре — иначе первый же ребёнок устроит из твоего маяка светомузыку.

LocalScript — кнопка с перезарядкой
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 значит «выходим отсюда прямо сейчас»: если ещё остываем, дальше код просто не пойдёт.

Судовой журнал — отметь сделанное:
Создал ScreenGui в StarterGui
Внутри — TextButton, внутри него LocalScript
Размер и позиция заданы через fromScale
AnchorPoint = 0.5, 0.5 — кнопка стоит ровно
Нажатие зажигает маяк у всех
Кнопка пишет «ПОДОЖДИ» и возвращается
Проверил вид телефона: Test → Device

Последняя галочка — новая привычка, которой не было в прошлых квестах. Test → Device показывает игру глазами телефона. Заглядывай туда всегда: половина игроков видит именно это.

ШАГ 6 ИЗ 6 · ФИНАЛ

Панель управления островом

Одна кнопка — а дальше сколько захочешь ЗАЖЕЧЬ МАЯК НОВЫЙ МЯЧ СБРОСИТЬ СЧЁТ 3 : 2 игровой экран Каждая кнопка — свой RemoteEvent. Приём один и тот же. Копируешь готовую кнопку, меняешь текст и сигнал — и она работает

Самое приятное: вторая кнопка делается за минуту. Скопировал первую, поменял текст и название сигнала — готово. Добавь одну свою: например, «новый мяч» или «сбросить счёт».

Вызов другу: пусть зайдёт с телефона. Если кнопка на месте и нажимается пальцем — ты сделал игру, в которую могут играть все, а не только те, у кого компьютер.

ШТУРМАН · ВЕДУЩИЙ
Читать текстом
Шестой остров позади — и твоя игра перестала быть загадкой для новичков. Теперь в неё заходят и сразу понимают, что делать. Ты научился рисовать интерфейс, который не разваливается на чужих экранах, и делать кнопки с перезарядкой. Остался один остров до финала: соберём раунды с таймером — чтобы матч начинался, шёл и заканчивался сам, без твоей команды. А потом — своя игра и звание Штурман.

Жми — Гильдия отметит шестой остров.

Кнопка на месте!

Шестой артефакт: настоящая кнопка на экране, которая работает и на компьютере, и на телефоне. Бейдж «ЗВОНАРЬ» твой. Остался один остров до финала.

Что дальше. Клык бьёт в склянки: восемь ударов. Все бросают дела и идут на палубу.

🏅 Забрать диплом Следующий квест: Склянки и раунды Вернуться на карту экспедиции
🔒

Этот остров ещё закрыт

Сначала пройди предыдущий квест — хотя бы просмотри все шаги.

⚑ Экспедиционный режим