Нажми — и деталь появится в мире
- ⏱ Сколько займёт
- 40–60 минут, 6 шагов. Каждый шаг заканчивается результатом на экране.
- 💻 Что нужно
- Компьютер с Windows или macOS. Понадобится Roblox Studio — бесплатная, поставим на первом шаге. С телефона этот квест не проходится.
- ⏸ Если прервёшься
- Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
- 🎓 Чему научишься
- физика объекта · скорость и импульс · правила игры
Один мяч на всех
На песок выкатывают тяжёлый мяч из просмолённой парусины.
«Правила простые: мяч не твой, — капитан отбивает его ногой. — Он физический. Толкнул — покатился, врезался — отскочил».
Никто не пишет сценарий погони. Она получается сама, из веса, скорости и азарта.
Это запись из Roblox Studio: один мяч, песчаная арена и погоня за ним. Такое же поле ты соберёшь сам за этот квест.
Читать текстом
Сегодня научим мяч возвращаться домой и помнить, кто его последним трогал.
Четыре монеты — четыре человека занимаются своими делами. Один мяч — и вдруг у всех появляется общий интерес. Дефицит рождает игру: этим приёмом пользуются и в футболе, и в захвате флага.
Мяч, который помнит дом
Сделай Part, поставь Shape = Ball, обязательно сними Anchored и назови «Мяч». Прибитый мяч — самая частая поломка этого квеста: код работает, а шар не двигается.
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 запоминаем в самом начале?
Зачем обнулять AssemblyLinearVelocity?
Оба верных ответа — +10 дублонов.

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

Физика вместо сценария
Можно прописать, как летит мяч, вручную. А можно дать ему вес и физику — и он полетит сам, каждый раз по-новому.
Второй путь и есть современная разработка: движок считает столкновения, а непредсказуемость получается бесплатно.
Именно поэтому игры с физикой так долго не надоедают: ни один матч не повторяется.
Мяч забыл, кто его бил
Самая коварная поломка из всех: ошибок нет вообще. Мяч заезжает в ворота, а счёт молчит. Найди строку, из-за которой память стирается.
Запиши приём в судовой журнал: когда игра молчит, ставь print(lastTeam) прямо перед проверкой. Увидишь nil — значит переменная пустая, и искать надо там, где она рождается.
Поле для погони
Поле собирается за десять минут: длинная зелёная платформа, мяч ровно в центре и две плиты-ворота по краям. Ворота красных назови ВоротаКрасных, синих — ВоротаСиних: имена должны совпасть с кодом буква в букву. Русское имя объекта берём только строкой в кавычках — workspace:WaitForChild("ВоротаКрасных"); в самих именах переменных русских букв быть не может, только латиница. Цвет плитам ставь через BrickColor — «Bright red» и «Bright blue», те же имена, что у команд. Никакой красоты пока не нужно — сначала должно быть весело, украшать будешь потом.
Шестая галочка — фирменная проверка этого квеста: забей гол и посмотри, стоит ли мяч в центре. Если он тут же уехал — забыл обнулить скорость.
Первый матч с мячом
Матч уже играется? Тогда выбери одну идею из списка и добавь. Одну — не все сразу: так ты каждый раз будешь точно знать, что именно сломалось, если что-то пойдёт не так.
Вызов другу: «матч до трёх голов». Заметь, что после гола никто не хочет выходить — это и есть признак того, что игра получилась.
Читать текстом
Жми — Гильдия отметит четвёртый остров.