К карте
ОСТРОВА ИГРОКОВ · ЭКСПЕДИЦИЯ V · КВЕСТ 5
Тайна двух миров
0
Прогресс0 / 6
ПОСТАВЬ ПЕРВУЮ ДЕТАЛЬ

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

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

Почему друг не видит того же

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

Капитан рисует на песке две окружности и черту между ними.

«Здесь то, что видишь ты. Здесь то, что знают все. Между ними — граница».

Кто путает эти два мира, у того игроки летают сквозь стены и рисуют себе миллион дублонов.

капитан Рэй · капитан «Дублона»
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ГОТОВОЙ ИГРЫ
Экран игрока нарисовал себе 999999 дублонов — а сервер проверил и вернул правду: 70. Клиент показывает, сервер решает.

Это запись из Roblox Studio: экран игрока рисует одно, сервер отвечает другое. Такой же мост между двумя мирами ты построишь за этот квест.

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

Разберёмся, кто где живёт — и построим между мирами мост.

СЕРВЕР — общий мир один на всех · хранит правду счёт, команды, мяч — живут здесь КЛИЕНТ · Маша её экран, её мышь, её кнопки КЛИЕНТ · ты твой экран и только твой КЛИЕНТ · Ваня его экран и только его Изменил на сервере — увидели все. Изменил у себя — увидел ты один.

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

LocalScript — красит только у тебя
1  -- LocalScript — работает ТОЛЬКО на твоём экране
2  local beacon = workspace:WaitForChild("Маяк")
3  beacon.Color = Color3.fromRGB(255, 90, 60)
4  
5  -- ты видишь красный маяк. друг видит старый цвет.
6  -- ошибки нет. просто это твой личный мир.

Этот код рабочий — и в этом ловушка. Маяк покраснеет, Output промолчит, ты решишь, что всё получилось. А друг рядом увидит серый маяк. Не баг: просто ты покрасил его в своём личном мире. Если решишь попробовать прямо сейчас — клади LocalScript в StarterPlayer → StarterPlayerScripts: из ServerScriptService он молча не запустится. Почему — на следующем шаге.

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

Кто где живёт

Script — обычный живёт на сервере ServerScriptService Workspace (внутри Part) МОЖЕТ: менять мир для всех НЕ МОЖЕТ: читать твои клавиши и мышь LocalScript живёт у игрока StarterPlayerScripts StarterGui (кнопки) МОЖЕТ: слышать клавиши и мышь НЕ МОЖЕТ: по-настоящему менять мир для всех Каждый умеет то, чего не умеет другой. Поэтому им нужен мост.

Вот и вся тайна: LocalScript слышит твои клавиши, но не может менять общий мир. Script меняет мир для всех, но не слышит клавиш. Ни один не справится в одиночку — им придётся договариваться.

Куда положить LocalScript, чтобы он ожил ▾ StarterPlayer ▾ StarterPlayerScripts ← сюда! LocalScript StarterCharacterScripts В ServerScriptService LocalScript просто не запустится. Ни ошибки, ни предупреждения — мёртвая тишина

Самая обидная ошибка новичка: положить LocalScript не в ту папку. Он не ругается — он просто молчит. Правильный дом — StarterPlayer → StarterPlayerScripts.

Проверка · Ты покрасил маяк из LocalScript. Что увидит друг?

Тот же новый цвет
Старый цвет — изменение произошло только на твоём экране
Ошибку в Output
LocalScript живёт в личном мире. Общий мир он менять не умеет — и не жалуется на это.

Кто умеет слышать нажатие клавиши E?

Обычный Script на сервере
Оба одинаково
Только LocalScript — клавиатура ведь твоя личная
Сервер один на всех, а клавиатура у каждого своя. Откуда серверу знать, что ты нажал?

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

НАСТОЯЩИЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 1StarterPlayer → StarterPlayerScriptsЖми треугольник — строка раскроется. Только здесь LocalScript оживает и слышит твою клавишу E. Положишь его в ServerScriptService — ни ошибки, ни предупреждения, мёртвая тишина.
  • 2ReplicatedStorage — папка, которую видят оба мираВот она, живая, в списке — а не «где-то там». Наведи на строку → «+» → RemoteEvent и назови «ЗажечьМаяк». Это и есть мост между твоим экраном и общим миром.
  • 3ServerScriptService — сторона сервера«+» → Script. Он ловит OnServerEvent и красит маяк по-настоящему, для всех. И первым аргументом ему сам собой приходит player — Roblox добавляет его сам, подделать нельзя.
  • 4Селектор режима — «Server & Clients»На кадре он уже переключён. Только этот режим показывает оба мира сразу: окно сервера и окна игроков. Никаких «Local Server» и «2 Players» в меню нет.
  • 5Счётчик игроков — 2, и жми ▶ слеваПокрась маяк из LocalScript и переключись в соседнее окно: там он остался серым. Потом сделай то же через RemoteEvent — и цвет появится у обоих. Вот вся тайна двух миров.
Отмечено:0 из 5

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

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

Мост между мирами

RemoteEvent — рупор из личного мира в общий ТВОЙ КЛИЕНТ нажал клавишу E FireServer() сигнал летит СЕРВЕР OnServerEvent красит маяк по-настоящему и это видят ВСЕ игроки Сам RemoteEvent живёт в ReplicatedStorage — единственном месте, которое видят оба мира

Мост называется RemoteEvent. По шагам: в Explorer наведи мышь на ReplicatedStorage → нажми круглую кнопку + → в списке выбери RemoteEvent → сразу переименуй его в ЗажечьМаяк (ПКМ → Rename). Это папка, куда дотягиваются оба мира. Клиент кричит в рупор, сервер слышит и делает по-настоящему.

СЕРВЕР · ОБЩИЙ МИР
ТВОЙ ЭКРАН
маяк серый
ЭКРАН ДРУГА
маяк серый
Выбери способ сверху и нажми кнопку — увидишь, что произойдёт у друга.

Попробуй сам. Сначала покрась из LocalScript и посмотри на правый экран. Потом переключись на сервер и нажми ещё раз. Разницу лучше один раз увидеть, чем десять раз прочитать.

LocalScript — сторона клиента
1  -- LocalScript в StarterPlayerScripts
2  local RS = game:GetService("ReplicatedStorage")
3  local event = RS:WaitForChild("ЗажечьМаяк")
4  
5  local UIS = game:GetService("UserInputService")
6  UIS.InputBegan:Connect(function(key, typing)
7    if typing then return end   -- буква E набрана в чате — не наше дело
8    if key.KeyCode == Enum.KeyCode.E then
9      event:FireServer()   -- кричим на сервер: «зажигай!»
10   end
11 end)

Клиент делает ровно одно: слышит клавишу и кричит на сервер. Сам он маяк не трогает — не его работа. Обрати внимание на FireServer — «эй, сервер, тут кое-что произошло». А вторая строка — обязательная страховка: второй аргумент InputBegan говорит, «съел» ли нажатие интерфейс. Без него любая буква E, набранная в чате, будет зажигать маяк.

Script — сторона сервера
1  -- Script в ServerScriptService
2  local RS = game:GetService("ReplicatedStorage")
3  local event = RS:WaitForChild("ЗажечьМаяк")
4  local beacon = workspace:WaitForChild("Маяк")
5  
6  event.OnServerEvent:Connect(function(player)
7    -- player приходит САМ, первым. его никто не отправлял!
8    beacon.Color = player.TeamColor.Color
9    print(player.Name .. " зажёг маяк")
10 end)  -- теперь маяк видят ВСЕ

А вот это надо запомнить накрепко: в строке 6 player приходит первым сам по себе. Клиент его не отправлял — Roblox добавляет его к сигналу, чтобы сервер точно знал, кто кричал. Отсюда и цвет команды.

Разделение обязанностей — правило на всю жизнь Клиент: слышит игрока, показывает картинку, просит Сервер: проверяет, решает, меняет мир для всех Правда всегда на сервере. Клиент только просит. Так устроены все сетевые игры — от Roblox до огромных проектов

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

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

Золотое правило: не верь клиенту

Экран игрока — территория игрока. Всё, что считается только там, можно подменить. Так и появляются читеры с бесконечными деньгами.

Поэтому у профессионалов правило: никогда не верь клиенту. Важное считает сервер, а клиент только просит и показывает.

Это не только про игры. Точно так же устроены банковские приложения и магазины: настоящая проверка всегда на той стороне.

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

Сигнал пришёл, а цвет не тот

Script на сервере — падает при нажатии E
1local RS = game:GetService("ReplicatedStorage")
2local event = RS:WaitForChild("ЗажечьМаяк")
3local beacon = workspace:WaitForChild("Маяк")
4-- клиент шлёт: event:FireServer(color)
5
6event.OnServerEvent:Connect(function(color)
7 beacon.Color = color
8end)
OUTPUT
Unable to assign property Color. Color3 expected, got Instance

Здесь Output наконец-то помогает: «ждали Color3, получили Instance». То есть в переменной лежит какой-то объект вместо цвета. Найди строку, где мы принимаем сигнал неправильно.

Как читать сигнал правильно КЛИЕНТ отправил: event:FireServer(color) один аргумент СЕРВЕР получил: function(player, color) уже два — player добавлен Отправил один — принимай два. Первый всегда player.

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

ШАГ 5 ИЗ 6 · ПРОВЕРКА

Два экрана рядом

Test ▾ → Server & Clients → поставь 2 игрока → ▶ Play Client — Player1 нажал E — маяк красный Client — Player2 ничего не нажимал — тоже красный! Вот он, момент истины: мост работает Если бы красил LocalScript — второе окно осталось бы серым

Запусти Test ▾ → Server & Clients → поставь 2 игрока → ▶ Play и поставь окна рядом. Нажми E в первом — и смотри во второе. Маяк должен покраснеть у обоих. Это и есть доказательство, что ты достучался до общего мира.

Судовой журнал — отметь сделанное:
Создал RemoteEvent «ЗажечьМаяк» в ReplicatedStorage
LocalScript лежит в StarterPlayerScripts
Клавиша E ловится (проверил через print)
На сервере первым аргументом стоит player
Маяк меняет цвет в обоих окнах сразу
Маяк красится в цвет команды нажавшего
Опубликовал обновление: File → Publish to Roblox (Alt+P)

Шестая галочка — самая красивая: маяк загорается цветом той команды, чей игрок нажал. Сервер узнал это из player, которого никто не отправлял.

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

Что теперь можно построить

Мост открыл целый список возможностей · Кнопка на экране, которую нажимают все по очереди · Способность по клавише: рывок, прыжок, вспышка · Покупка в лавке: клиент просит, сервер проверяет монеты · Чат-команда, которая меняет погоду для всего острова Всё это — один и тот же приём: попросил → сервер проверил → сделал

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

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

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

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

Мост построен!

Пятый артефакт — и самый ценный: ты понял, что миров два, и построил между ними мост. Бейдж «СВЯЗНОЙ» твой. Осталось два острова до звания Штурман.

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

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

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

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

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