К карте
ОСТРОВА ИГРОКОВ · ЭКСПЕДИЦИЯ V · КВЕСТ 4
Мяч и погоня
0
Прогресс0 / 6
ПОСТАВЬ ПЕРВУЮ ДЕТАЛЬ

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

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

Один мяч на всех

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

На песок выкатывают тяжёлый мяч из просмолённой парусины.

«Правила простые: мяч не твой, — капитан отбивает его ногой. — Он физический. Толкнул — покатился, врезался — отскочил».

Никто не пишет сценарий погони. Она получается сама, из веса, скорости и азарта.

капитан Рэй · капитан «Дублона»
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ГОТОВОЙ ИГРЫ
Мяч никто не программировал лететь по сценарию — у него просто есть вес и физика. Толкнул — покатился, врезался в борт — остановился.

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

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

Сегодня научим мяч возвращаться домой и помнить, кто его последним трогал.

У каждого своя монета все бегут в разные стороны и не мешают друг другу это сбор, а не игра Мяч один на всех обе стороны хотят одно и то же и смотрят друг на друга вот это уже игра

Четыре монеты — четыре человека занимаются своими делами. Один мяч — и вдруг у всех появляется общий интерес. Дефицит рождает игру: этим приёмом пользуются и в футболе, и в захвате флага.

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

Мяч, который помнит дом

Настройки мяча в Properties Shape Ball Anchored false ← обязательно! Name Мяч Anchored = true — и мяч намертво прибит к воздуху. Толкнуть нельзя. Именно на этой галочке спотыкаются чаще всего

Сделай Part, поставь Shape = Ball, обязательно сними Anchored и назови «Мяч». Прибитый мяч — самая частая поломка этого квеста: код работает, а шар не двигается.

Script — мяч запоминает дом
1  -- Script в ServerScriptService
2  local ball = workspace:WaitForChild("Мяч")
3  local home = ball.CFrame   -- запомнили место старта ОДИН раз
4  
5  local function sendHome()
6    ball.CFrame = home
7    ball.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
8    -- без этой строки мяч прилетит домой и умчится дальше
9  end

Строка 3 — вся суть: home («дом») запоминается один раз при запуске, когда мяч ещё в центре. Дальше сколько угодно голов — место возврата известно. А строка 7 гасит скорость: без неё мяч вернётся домой и тут же улетит по инерции.

Проверка · Почему home запоминаем в самом начале?

Тогда мяч ещё в центре — запомнится правильное место
Так короче код
Roblox запрещает запоминать позицию позже
Если запомнить место во время матча, «домом» станет случайная точка, куда мяч успел укатиться.

Зачем обнулять AssemblyLinearVelocity?

Чтобы мяч стал невидимым
Чтобы игроки не могли его толкать
Чтобы мяч не улетел дальше по инерции сразу после возврата
Мяч летел с большой скоростью. Мы перенесли его домой — но скорость-то никуда не делась.

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

НАСТОЯЩИЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 1Part — из него и получается мячПоставь деталь, а маленькой стрелкой справа от кнопки выбери форму шара. Назови её «Мяч» — код ищет её по имени через workspace:WaitForChild("Мяч").
  • 2Anchor — этот якорь должен быть ВЫКЛЮЧЕНКнопка прибивает деталь к воздуху намертво. Для мяча это смерть: код работает, а шар не двигается. Самая частая поломка квеста — проверяй её первой.
  • 3Панель Properties — Shape, Anchored и весСейчас пусто: ничего не выделено. Выдели мяч — появятся строки Shape (ставь Ball), Anchored (снят) и Name. А вот Density отдельной строкой не найдётся: сначала разверни CustomPhysicalProperties и включи её галочкой, только тогда откроются Density, Friction и Elasticity.
  • 4Окно мира — поле собирается за десять минутДлинная платформа, мяч ровно в центре, две цветные плиты-ворота по краям. Никакой красоты: сначала должно быть весело, украшать будешь потом.
  • 5ServerScriptService — мозг матча«+» на строке → Script. Здесь и «дом» мяча (запомнить CFrame один раз, при запуске), и гашение скорости AssemblyLinearVelocity, и гол. Переменную «последняя» объявляй СНАРУЖИ функций — родилась внутри, умрёт внутри.
Отмечено:0 из 5

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

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

Кто трогал последним

Script — память о последнем касании
1  local lastTeam  -- ВНЕ функций! иначе забудется
2  
3  ball.Touched:Connect(function(hit)
4    local p = game.Players:GetPlayerFromCharacter(hit.Parent)
5    if p and p.Team then
6      lastTeam = p.Team   -- запомнили, чья это заслуга
7    end
8  end)

Смотри на строку 1 очень внимательно. Переменная lastTeam («последняя команда») объявлена снаружи функции — и это не мелочь, а главный приём квеста. Внутри функции она бы рождалась заново при каждом касании и тут же забывалась.

Где живёт переменная ВНУТРИ функции — забывает function(hit) local lastTeam касание кончилось — переменная исчезла СНАРУЖИ — помнит local lastTeam function(hit) lastTeam = p.Team функция закончилась — значение осталось Хочешь, чтобы код помнил между событиями — объявляй снаружи

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

Script — гол засчитан
1  -- ворота красных: сюда забивают синие
2  local gate = workspace:WaitForChild("ВоротаКрасных")
3  gate.Touched:Connect(function(hit)
4    if hit == ball and lastTeam then
5      lastTeam["Очки"].Value += 1   -- счёт из прошлого квеста!
6      print("ГОЛ! забили " .. lastTeam.Name)
7      sendHome()
8      lastTeam = nil   -- новый розыгрыш — чистая память
9    end
10 end)
Script — весь мяч целиком, один файл
1  -- ОДИН Script в ServerScriptService: всё про мяч — здесь
2  local ball = workspace:WaitForChild("Мяч")
3  local gate = workspace:WaitForChild("ВоротаКрасных")
4  local home = ball.CFrame              -- место старта, запомнили один раз
5  local lastTeam                     -- ВНЕ функций! иначе забудется
6  
7  local function sendHome()
8    ball.CFrame = home
9    ball.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
10 end
11 
12 ball.Touched:Connect(function(hit)
13   local p = game.Players:GetPlayerFromCharacter(hit.Parent)
14   if p and p.Team then lastTeam = p.Team end
15 end)
16 
17 gate.Touched:Connect(function(hit)
18   if hit == ball and lastTeam then
19     lastTeam["Очки"].Value += 1
20     print("ГОЛ! забили " .. lastTeam.Name)
21     sendHome()
22     lastTeam = nil
23   end
24 end)

Вот и встреча двух квестов: lastTeam["Очки"].Value += 1 — это тот самый счёт команды, который ты сделал на прошлом острове. Мяч касается ворот — очко идёт стороне, которая била последней, мяч едет домой, память очищается. Заметь честно: автогол засчитывается — если красный сам закатит мяч в свои ворота, очко всё равно уйдёт красным. Хочешь иначе — сравнивай команду ворот с lastTeam. И главное: все три куска — мяч, касание, ворота — это один Script, вот он целиком во второй карточке.

ЭКСКУРС
КАК В НАСТОЯЩИХ ИГРАХ

Физика вместо сценария

Можно прописать, как летит мяч, вручную. А можно дать ему вес и физику — и он полетит сам, каждый раз по-новому.

Второй путь и есть современная разработка: движок считает столкновения, а непредсказуемость получается бесплатно.

Именно поэтому игры с физикой так долго не надоедают: ни один матч не повторяется.

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

Мяч забыл, кто его бил

Script — голы не засчитываются
1ball.Touched:Connect(function(hit)
2 local lastTeam
3 local p = game.Players:GetPlayerFromCharacter(hit.Parent)
4 if p and p.Team then lastTeam = p.Team end
5end)
6gate.Touched:Connect(function(hit)
7 if hit == ball and lastTeam then lastTeam["Очки"].Value += 1 end
8end)
ЧТО ПРОИСХОДИТ В ИГРЕ
Мяч катится, в ворота заезжает — а счёт не меняется. Ни ошибки, ни красной строки в Output. Полная тишина.

Самая коварная поломка из всех: ошибок нет вообще. Мяч заезжает в ворота, а счёт молчит. Найди строку, из-за которой память стирается.

Три вида поломок — и как их ловить Красная строка в Output — код упал, место указано Код печатает, но игра не меняется — начисляем не туда Полная тишина — что-то пустое там, где ждали значение Тишина лечится так: ставь print перед проверкой и смотри, что там на самом деле — значение или nil

Запиши приём в судовой журнал: когда игра молчит, ставь print(lastTeam) прямо перед проверкой. Увидишь nil — значит переменная пустая, и искать надо там, где она рождается.

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

Поле для погони

ВОРОТА КРАСНЫХ ВОРОТА СИНИХ Мяч в центре · ворота по краям · база у каждой стороны своя

Поле собирается за десять минут: длинная зелёная платформа, мяч ровно в центре и две плиты-ворота по краям. Ворота красных назови ВоротаКрасных, синих — ВоротаСиних: имена должны совпасть с кодом буква в букву. Русское имя объекта берём только строкой в кавычках — workspace:WaitForChild("ВоротаКрасных"); в самих именах переменных русских букв быть не может, только латиница. Цвет плитам ставь через BrickColor — «Bright red» и «Bright blue», те же имена, что у команд. Никакой красоты пока не нужно — сначала должно быть весело, украшать будешь потом.

Судовой журнал — отметь сделанное:
Сделал мяч: Shape = Ball, Anchored снят
Мяч толкается и катится по полю
Поставил двое ворот и покрасил в цвета команд
lastTeam объявлена СНАРУЖИ функций
Гол засчитывается и счёт растёт
После гола мяч сам возвращается в центр и стоит
Опубликовал обновление: File → Publish to Roblox (Alt+P)

Шестая галочка — фирменная проверка этого квеста: забей гол и посмотри, стоит ли мяч в центре. Если он тут же уехал — забыл обнулить скорость.

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

Первый матч с мячом

Что можно докрутить, когда матч уже идёт · Мяч светится цветом команды, что била последней · После гола — вспышка и звук на всё поле · Мяч чуть тяжелее — играть азартнее (включи CustomPhysicalProperties, потом Density) · Два мяча сразу — хаос, но дети такое обожают Сначала работает — потом красиво. Порядок только такой

Матч уже играется? Тогда выбери одну идею из списка и добавь. Одну — не все сразу: так ты каждый раз будешь точно знать, что именно сломалось, если что-то пойдёт не так.

Вызов другу: «матч до трёх голов». Заметь, что после гола никто не хочет выходить — это и есть признак того, что игра получилась.

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

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

Гол!

Четвёртый артефакт: один мяч, за которым гоняются обе стороны, и голы, меняющие счёт. Бейдж «ЛОВЧИЙ» твой. Дальше — тайна двух миров: сервер и клиент.

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

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

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

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

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