Коротко
Чтобы сделать игру в Roblox Studio, откройте Studio, выберите шаблон Baseplate, постройте уровень из партов (отметьте Anchored, чтобы они не двигались) и добавьте Script в ServerScriptService для правил, например папку leaderstats для монет. Нажмите Play (F5), чтобы протестировать. Затем выберите File > Publish, чтобы сохранить игру в аккаунт. Она остаётся закрытой, пока вы не выпустите её (сделаете публичной) из того же меню и не ответите на вопрос о контенте с возрастными ограничениями.
- Держите правила игры в серверных Script. Изменение, сделанное LocalScript, видит только один игрок, а всё на устройстве игрока может изменить читер.
- Для выпуска нужен аккаунт с хорошей репутацией возрастом не меньше 2 дней и проверка возраста. Если ответить No на вопрос о контенте с возрастными ограничениями, Roblox помечает игру Content May Vary и открывает её пользователям от 16 лет с проверкой возраста. Для всех возрастов есть дополнительные требования.
- Studio работает на Windows и Mac. Страница установки Roblox не называет версии для телефона или планшета.
На этой странице
Что вы построите
Игра это короткая трасса. Игроки стартуют на SpawnLocation, прыгают между платформами над полом из лавы, собирают монеты и касаются зелёной площадки Finish. Finish даёт победу только игроку, который собрал не меньше 3 монет с последнего возрождения или финиша, а затем отправляет его на старт. Coins и Wins показываются в списке игроков, и все правила работают на сервере.
| Часть | Где лежит | Что делает |
|---|---|---|
SpawnLocation | Прямо в Workspace (идёт с шаблоном Baseplate) | Где игроки появляются при входе и возрождении. Finish отправляет игроков сюда. |
Папка Course | Workspace | Содержит весь уровень, чтобы скрипт находил всё в одном месте. |
Папка Lava и её парты | Внутри Course | Каждый парт в ней перезапускает коснувшегося игрока. |
Папка Coins и её парты | Внутри Course | Каждая монета платит 1 Coin первому коснувшемуся игроку, скрывается и возвращается через 10 секунд. |
Парт Finish | Внутри Course | Даёт победу игроку, который собрал 3 монеты за этот забег, затем переносит его на старт. |
Script PlayerStats | ServerScriptService | Даёт каждому игроку характеристики Coins и Wins в списке игроков. |
Script CourseService | ServerScriptService | Управляет лавой, монетами и финишем. Единственное место, где меняются Coins и Wins. |
Workspace
Baseplate Part
SpawnLocation SpawnLocation
Course Folder new
Platform Part new
Lava Folder new
Lava Part new
Coins Folder new
Coin Part new
Finish Part new
ServerScriptService
PlayerStats Script new
CourseService Script new
Всё в Workspace вы строите вручную на шаге 2. Два скрипта лежат в ServerScriptService. Roblox никогда не отправляет игрокам скрипты из этого контейнера, поэтому никто не может прочитать или изменить их со своего устройства.
Шаг 1: установите Studio и откройте Baseplate
- Скачайте Roblox Studio из Creator Hub Roblox и запустите установщик (
RobloxStudio.exeв Windows,RobloxStudio.dmgна Mac). Studio это бесплатное приложение для Windows и Mac. - Когда он откроется, войдите через аккаунт Roblox. Если аккаунта нет, сначала создайте его на roblox.com.
- В разделе Open a Template выберите Baseplate. В нём всего два объекта: SpawnLocation, где персонажи появляются и возрождаются, и Baseplate, пол с текстурой сетки 4 на 4, совпадающей со стадами, единицей длины в Roblox.
- Откройте три окна, которыми будете пользоваться постоянно. Explorer перечисляет все объекты игры, а Properties меняет выделенный объект; оба открываются из меню Window или вкладки Home. Output показывает ошибки скриптов и открывается из меню Window или вкладки Script.
Шаг 2: постройте трассу
- В Explorer наведите курсор на Workspace, нажмите + (или Ctrl+I, Cmd+I на Mac) и вставьте Folder. Переименуйте его в
Course. - Наведите курсор на Course, нажмите + и вставьте внутрь ещё две папки. Назовите их
LavaиCoins. - Постройте пол из лавы. Нажмите Part на вкладке Home или Model, чтобы вставить блок, затем инструментом Scale растяните его в одну большую плоскую плиту, которая будет лежать под всей трассой с запасом со всех сторон. В Properties задайте Color красный и Material Neon, отметьте Anchored и перетащите его в папку
Lava. Теперь игрок, упавший где угодно, попадает в лаву, а не на Baseplate. - Постройте платформы. Вставьте ещё парты так же и инструментами Move и Scale поставьте их над лавой, каждую на несколько стадов выше неё, с промежутками для прыжков. В Properties убедитесь, что Anchored отмечен у каждой, и перетащите их в Course.
- Постройте монеты. Зажмите маленькую стрелку на кнопке Part и выберите Cylinder. Сделайте его маленьким и жёлтым, отметьте Anchored и снимите CanCollide, чтобы игроки проходили сквозь монету, а не упирались в неё. Положите её в папку
Coins, затем нажимайте Ctrl+D (Cmd+D на Mac), чтобы дублировать, пока их не станет хотя бы 3, и расставьте их над платформами вдоль трассы. - Постройте финиш. Вставьте ещё один парт над лавой в дальнем конце, достаточно большой, чтобы на него приземлиться, покрасьте его в зелёный, отметьте Anchored, назовите точно
Finishи перетащите прямо в Course, а не в одну из папок. - Перенесите SpawnLocation на лаву в начале трассы, рядом с первой платформой, чтобы он стоял на плите. Оставьте его прямо в Workspace, а не внутри Course: CourseService ищет его там, чтобы отправлять игроков на старт.
Имена важны
CourseService находит трассу по именам: папка Course прямо в Workspace, папки Lava и Coins внутри неё и парт Finish внутри неё. Пишите их точно, с теми же заглавными буквами. Имена партов лавы и монет неважны: каждый парт прямо внутри Lava это лава, а каждый парт прямо внутри Coins это монета.
Шаг 3: добавьте Coins и Wins в список игроков
В Explorer наведите курсор на ServerScriptService, нажмите +, вставьте Script и назовите его PlayerStats. Замените всё содержимое этим:
-- Script в ServerScriptService с именем PlayerStats.
-- Даёт каждому игроку характеристики Coins и Wins. Папка с именем leaderstats внутри
-- игрока заставляет Roblox показывать эти значения в списке игроков справа вверху.
local Players = game:GetService("Players")
local function onPlayerAdded(player: Player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats" -- писать нужно точно так
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Value = 0
coins.Parent = leaderstats
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Value = 0
wins.Parent = leaderstats
leaderstats.Parent = player
end
Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do -- все, кто зашёл до того, как выполнилась эта строка
onPlayerAdded(player)
end
Папка должна называться leaderstats, строчными буквами. Roblox читает каждое значение внутри и показывает его в списке игроков, с именем значения в заголовке столбца.
Каждый игрок получает папку leaderstats с двумя объектами IntValue. IntValue хранит целое число, а большего счётчику монет и не нужно. Цикл в конце настраивает всех, кто зашёл до того, как выполнилась строка PlayerAdded, поэтому никто не пропущен.
Гайд по таблице лидеров (на английском) строит ту же папку подробнее, а потом добавляет сохранение и глобальный топ 10.
Шаг 4: заставьте работать лаву, монеты и финиш
Вставьте второй Script в ServerScriptService, назовите его CourseService и вставьте этот код. Это единственное место, где меняются Coins и Wins. Две настройки вверху это числа, которые вы можете менять.
-- Script в ServerScriptService с именем CourseService.
-- Управляет трассой на сервере, поэтому все игроки видят одно и то же и никто не может
-- выдать себе монеты: парты лавы перезапускают игроков, монеты платят 1 Coin и возвращаются,
-- а площадка Finish даёт победу игрокам, которые собрали достаточно монет за этот забег.
local Players = game:GetService("Players")
local COINS_TO_FINISH = 3 -- сколько монет нужно собрать за забег, чтобы Finish засчитался
local COIN_RESPAWN_SECONDS = 10
local course = workspace:WaitForChild("Course")
local lavaFolder = course:WaitForChild("Lava")
local coinFolder = course:WaitForChild("Coins")
local finish = course:WaitForChild("Finish") :: BasePart
local spawnLocation = workspace:FindFirstChildOfClass("SpawnLocation")
if not spawnLocation then
warn("CourseService: no SpawnLocation directly in Workspace, so the Finish cannot send players back")
end
-- Монеты за этот забег: с последнего возрождения игрока или его финиша
local runCoins: { [Player]: number } = {}
-- Находит игрока, чей персонаж коснулся парта, или nil для всего остального
local function playerFromHit(otherPart: BasePart): Player?
local character = otherPart:FindFirstAncestorOfClass("Model")
return if character then Players:GetPlayerFromCharacter(character) else nil
end
local function addStat(player: Player, statName: string, amount: number)
local leaderstats = player:FindFirstChild("leaderstats")
local stat = leaderstats and leaderstats:FindFirstChild(statName)
if stat and stat:IsA("IntValue") then
stat.Value += amount
end
end
-- Лава: любой парт в папке Lava перезапускает коснувшегося игрока
for _, lava in lavaFolder:GetChildren() do
if lava:IsA("BasePart") then
lava.Touched:Connect(function(otherPart: BasePart)
local character = otherPart:FindFirstAncestorOfClass("Model")
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
if humanoid and humanoid.Health > 0 then
humanoid.Health = 0
end
end)
end
end
-- Монеты: монету получает первый коснувшийся игрок, потом она скрыта до возвращения
for _, coin in coinFolder:GetChildren() do
if coin:IsA("BasePart") then
local shownTransparency = coin.Transparency
local taken = false
coin.Touched:Connect(function(otherPart: BasePart)
local player = playerFromHit(otherPart)
if not player or taken then
return -- не игрок, или эту монету уже взяли
end
taken = true
coin.Transparency = 1
addStat(player, "Coins", 1)
runCoins[player] = (runCoins[player] or 0) + 1
task.delay(COIN_RESPAWN_SECONDS, function()
coin.Transparency = shownTransparency
taken = false
end)
end)
end
end
-- Финиш: победа для прошедших трассу, затем обратно на старт
finish.Touched:Connect(function(otherPart: BasePart)
local player = playerFromHit(otherPart)
if not player or (runCoins[player] or 0) < COINS_TO_FINISH then
return
end
runCoins[player] = 0 -- ставим сначала, чтобы повторное касание площадки не засчиталось дважды
addStat(player, "Wins", 1)
local character = player.Character
if character and spawnLocation then
character:PivotTo(spawnLocation.CFrame + Vector3.new(0, 4, 0))
player:SetAttribute("MovementCheckSkip", true) -- для скрипта проверки скорости, если вы его добавите
end
end)
-- Новый персонаж (после перезапуска или падения) начинает новый забег
local function onPlayerAdded(player: Player)
runCoins[player] = 0
player.CharacterAdded:Connect(function()
runCoins[player] = 0
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do -- все, кто зашёл, пока скрипт ждал Course
onPlayerAdded(player)
end
Players.PlayerRemoving:Connect(function(player: Player)
runCoins[player] = nil
end)
CourseService просматривает папки Lava и Coins один раз, при старте игры. Стройте все парты лавы и монеты в Studio до нажатия Play: парт, который другой скрипт добавит во время игры, не будет подключён.
| Часть скрипта | Код | Что делает |
|---|---|---|
| Настройки | COINS_TO_FINISH, COIN_RESPAWN_SECONDS | Сколько монет игрок должен собрать за забег, чтобы Finish засчитался (3), и сколько взятая монета остаётся скрытой (10 секунд). |
| Поиск трассы | WaitForChild, FindFirstChildOfClass("SpawnLocation") | Ждёт Course, Lava, Coins и Finish по именам и находит SpawnLocation прямо в Workspace, куда Finish отправляет игроков. Если его нет, печатает предупреждение в Output. |
| Кто коснулся | playerFromHit | Коснуться может стопа, рука или ручка шляпы. FindFirstAncestorOfClass("Model") поднимается к модели персонажа, а GetPlayerFromCharacter превращает её в игрока или в nil для всего, что не персонаж игрока. |
| Лава | humanoid.Health = 0 | Перезапускает любого персонажа, который коснулся парта в папке Lava. |
| Монеты | taken, Transparency = 1, task.delay | Первый коснувшийся игрок получает 1 Coin. Монета становится невидимой и игнорирует касания, пока не вернётся через COIN_RESPAWN_SECONDS. Поскольку её скрывает сервер, она исчезает для всех игроков. |
| Этот забег | runCoins | Считает монеты каждого игрока с последнего возрождения или финиша. Число Coins в списке игроков продолжает расти; этот счётчик начинается с 0 при каждом возрождении и каждой победе. |
| Финиш | runCoins[player] < COINS_TO_FINISH | Игнорирует игрока, у которого меньше 3 монет за этот забег. Иначе сначала обнуляет его счётчик, чтобы стояние на площадке не заплатило дважды, добавляет 1 победу и переносит персонажа на 4 стада выше SpawnLocation. |
| Новый забег | CharacterAdded, GetPlayers() | Каждый новый персонаж начинает новый забег. Цикл покрывает игроков, которые зашли, пока скрипт ещё ждал Course. |
| Уборка | PlayerRemoving | Забывает вышедшего игрока. |
Лава ставит Health в 0, как и собственный туториал Roblox про лаву. У нового персонажа по умолчанию 10 секунд есть ForceField после появления на SpawnLocation, и Humanoid:TakeDamage ничего не делает, пока он защищает. Прямая установка Health игнорирует ForceField, поэтому лава работает даже сразу после возрождения.
Finish двигает персонажа через character:PivotTo(...), который справочник Roblox называет основным способом двигать модель из скрипта. Если вместо этого задать позицию корневого парта персонажа, он оторвётся от остального тела.
Строка с MovementCheckSkip сама по себе ничего не делает. Она нужна для серверной проверки скорости из гайда по спринту: если вы добавите эту проверку позже, телепорт на финише не будет считаться превышением скорости.
Почему правила работают на сервере
Все правила этой трассы живут в CourseService, серверном Script, и это сделано нарочно. Если бы монету добавлял LocalScript, новое значение Coins существовало бы только на устройстве этого игрока: сервер и другие игроки его бы не увидели. А всё на устройстве игрока можно изменить. Гайд Roblox по безопасности говорит, что у эксплойтера полный контроль над его локальным состоянием и сетевым трафиком, поэтому каждое важное решение должен принимать сервер.
| Читер пытается | Результат | Почему |
|---|---|---|
| Изменить свои Coins или Wins на своём устройстве | Видит только он | Настоящие значения на сервере, и меняет их только CourseService. |
| Телепортироваться прямо на Finish | Победы нет | Finish требует 3 монеты за этот забег. Страница Roblox о защитном дизайне разбирает именно этот случай с обби, эксплойтера, который телепортируется в конец за наградой, и советует чекпоинты, которые сервер проверяет перед наградой. |
| Касаться монет или финиша издалека | Возможно | Гайд Roblox по безопасности говорит, что эксплойтеры могут вызывать события Touched на любом расстоянии и с любой частотой. Каждая монета всё равно платит один раз, тому, кто коснулся первым, и потом скрыта на 10 секунд для всех. |
| Долететь или телепортироваться к каждой монете, затем к финишу | Возможно | Устройство каждого игрока управляет его персонажем, и Roblox называет телепорт и полёт среди того, что клиент может с ним делать. |
| Игнорировать лаву | Возможно | То же устройство решает, срабатывают ли касания его персонажа вообще. Для первой игры это приемлемо. |
Так что правило с монетами останавливает самый простой чит, прыжок прямо в конец, и не более. Для первой игры это нормально. Следующие уровни защиты: серверная проверка, что персонаж действительно рядом с монетой или финишем, прежде чем платить, как гайд Roblox по безопасности проверяет расстояние игрока до магазина; чекпоинты, которые нужно проходить по порядку, как в гайде по чекпоинтам в обби; и проверка движения, как в гайде по спринту. Что реплицируется, а что нет подробнее объясняет разделение клиента и сервера (на английском).
Шаг 5: протестируйте
- Убедитесь, что в списке режима теста выбран Test, затем нажмите Play (F5). Ваше имя появится в списке игроков с Coins 0 и Wins 0.
- Пройдите через монету. Coins становится 1, а монета исчезает. Подождите 10 секунд, и она вернётся. Пройдите через неё снова: Coins вырастет до 2.
- Коснитесь лавы. Персонаж выбывает и снова появляется на SpawnLocation через 5 секунд, стандартное время возрождения в Roblox. Coins в списке игроков не меняется, но ваш счётчик за этот забег начинается с 0.
- Коснитесь Finish, имея меньше 3 монет за этот забег: ничего не происходит. Соберите 3 монеты, затем коснитесь: Wins становится 1, и вы оказываетесь на SpawnLocation.
- Нажмите Stop (Shift+F5). Выберите Server & Clients в списке, поставьте 2 клиента и нажмите Play (или F7). Возьмите монету в одном окне клиента и посмотрите на другое: монеты нет и там, потому что сервер скрыл её для всех.
Всё время держите окно Output открытым. Эти два скрипта ничего не печатают, когда работают, поэтому любое предупреждение или красная ошибка от PlayerStats или CourseService это настоящая проблема. Смотрите частые ошибки.
Шаг 6: опубликуйте игру
- Откройте меню File и выберите Publish. Откроется окно Game details.
- Введите Name, выберите Genre (Subgenre необязателен) и напишите короткое Description того, что делают игроки. Здесь же можно загрузить иконку и миниатюру. Сначала проверьте их размеры бесплатной проверкой размеров миниатюр и иконок.
- Нажмите Save. Roblox опубликует игру в облако и привяжет её к аккаунту, чтобы её можно было открыть с любого компьютера.
- Теперь игра опубликована, но закрыта. Играть в неё можете только вы, люди с доступом Edit и участники группы с нужными ролями.
- Хотите отзывов до выпуска? Выберите File > Invite early testers и выберите до 10 друзей похожего возраста. Если вы ещё не прошли проверку возраста, Roblox сначала попросит её пройти. Тестеры видят водяной знак, который говорит, что это превью.
С этого момента сохранение в Roblox из меню File держит версию плейса в облаке. Версию, которую получают игроки, меняет именно File > Publish. Время от времени запускайте опубликованную копию из Roblox, вне Studio, чтобы проверить, что она совпадает с протестированной.
Шаг 7: выпустите игру (сделайте её публичной)
Выпуск это то, как игра становится публичной, чтобы в неё могли играть не только вы и ваши соавторы. Сначала проверьте требования: аккаунт должен иметь хорошую репутацию и возраст не меньше 2 дней, и нужна проверка возраста, через оценку возраста по лицу или государственный документ.
- Откройте меню File и снова выберите Publish. Откроется окно Publish.
- Нажмите Continue. (Кнопка Invite рядом приглашает ранних тестеров.)
- Ответьте на первый вопрос анкеты Roblox Maturity & Compliance Questionnaire: есть ли в игре контент с возрастными ограничениями? Отвечайте по тому, что в игре действительно есть. Если ответить Yes, вы заполняете всю анкету.
- Нажмите Publish.
| Что вы делаете | Метка | Кто может играть |
|---|---|---|
| Отвечаете No | Content May Vary | Пользователи от 16 лет с проверкой возраста. Позже можно заполнить всю анкету в Creator Hub, чтобы охватить более широкую аудиторию. |
| Отвечаете Yes и заполняете анкету | По вашим ответам | Пользователи от 16 лет с проверкой возраста или от 18 лет с подтверждённым возрастом, в зависимости от содержания игры. |
| Выполняете требования для всех возрастов | Minimal, Mild или Moderate (9+), по полной анкете | Все возрасты. Помимо шагов выше, вы подтверждаете аккаунт (оценка возраста по лицу, если вам меньше 18, государственный документ, если 18 или больше), включаете двухэтапную проверку, либо держите подписку Roblox Plus или Premium 2 месяца подряд, либо платите разовый возвратный сбор, и игра проходит проверку Roblox для выпуска на все возрасты. |
Чтобы пустить только друзей, откройте Creator Dashboard, выберите игру, перейдите в Publish settings > Manage Audience, нажмите Manage access, включите Friends на вкладке Public и нажмите Save Changes. С включённым Friends играть могут только ваши друзья и люди на вкладке Playtest.
Те же требования действуют для каждого действия выпуска: первого выпуска, выпуска новой версии уже вышедшей игры, выпуска в другую игру через Publish As и изменения того, кто может играть.
Делайте игру с друзьями
Инструменты совместной работы Studio позволяют вам и другу править один плейс одновременно. Для игры, которой владеете вы:
- С открытой в Studio игрой нажмите Collaborate справа на панели mezzanine, той, где слева кнопка Play.
- Найдите друга, выберите его, выберите Edit в списке прав и нажмите Save. Для вашей игры доступ Edit могут получить только друзья в Roblox.
- Друг открывает игру из Creator Dashboard, и вы работаете в одном плейсе одновременно.
Чтобы работать с другими создателями, сначала пройдите проверку возраста, по документу или оценке возраста по лицу. После этого по умолчанию Studio позволяет работать только с создателями совместимых возрастных групп. Team Create в одиночку можно использовать без проверки возраста. Во время совместной сессии Studio сохраняет плейс в облако каждые четыре минуты.
Превратите её в настоящую игру
Трасса это законченный цикл: играть, собирать, финишировать, побеждать. Каждый из этих гайдов (на английском, кроме первого) добавляет поверх одну систему.
- Впервые со скриптами? Скриптинг в Roblox для начинающих разбирает переменные, функции, события и циклы, детали, из которых сделан CourseService.
- Сохраняйте Coins и Wins между сессиями по шагу 3 гайда по таблице лидеров. Его скрипт сохранения заменяет скрипт Coins и Wins вроде PlayerStats, поэтому удалите PlayerStats, когда добавите его. Туториал по DataStore объясняет сохранение подробно.
- Чекпоинты по порядку, с характеристикой Stage и возрождением на последнем чекпоинте: гайд по чекпоинтам в обби. Его скрипт создаёт свою папку leaderstats, поэтому скопируйте строки Coins и Wins из PlayerStats в эту папку и удалите PlayerStats. Два скрипта, каждый из которых создаёт leaderstats, дают каждому игроку две папки, и Coins и Wins могут перестать меняться.
- Тратьте монеты в GUI магазина. Он использует значение Coins в leaderstats, поэтому пропустите его скрипт Leaderstats: PlayerStats уже создаёт Coins.
- Продавайте бонус за Robux через геймпасс. Прежде чем назначать цену, бесплатный калькулятор налога Robux покажет, сколько вы получите с каждой продажи после доли Roblox, а калькулятор DevEx сколько эти Robux стоят в долларах США.
- Титульный экран с кнопкой Play: гайд по главному меню.
- Раунды с перерывом, случайными картами и таймером: гайд по системе раундов, который прибавляет к тому же значению Wins. Пропустите его скрипт leaderstats, потому что PlayerStats уже создаёт Wins.
- Вступительная катсцена с ракурсами камеры, подписями и кнопкой Skip: гайд по катсценам.
- Дверь в секретную зону, которая открывается на E, с необязательным замком на ключ: гайд по дверям.
- Площадки-телепорты между частями карты или меню телепорта: гайд по телепортам.
- Спринт на Shift на клавиатуре, телефоне и геймпаде, с серверной проверкой движения: гайд по спринту. Его проверка движения читает атрибут
MovementCheckSkip, который ставит Finish. - Бой или другой цикл: дайте игрокам меч или оружие на raycast или начните новую игру, где игроки кликают за монеты, покупают улучшения и делают ребёрт, по гайду по игре-симулятору.
Частые ошибки и решения
Откройте окно Output (меню Window или вкладка Script) до нажатия Play. Большинство проблем на этой трассе либо печатают там предупреждение или ошибку, либо идут от несовпадающего имени.
Infinite yield possible on 'Workspace:WaitForChild("Course")'
CourseService 5 секунд ждал папку Course прямо в Workspace и не нашёл её. Проверьте написание и заглавную C. То же предупреждение с Lava, Coins или Finish значит, что этого объекта нет в Course или он назван иначе. Пока он не появится, ничего после этой строки не выполняется, поэтому лава, монеты и финиш не работают.
Coins и Wins не появляются в списке игроков
Проверьте, что имя папки в PlayerStats leaderstats, строчными буквами, и что PlayerStats это Script, а не LocalScript, прямо внутри ServerScriptService. Если всё верно, ищите красную ошибку от PlayerStats в Output.
Красная ошибка от CourseService сразу после нажатия Play
Проверьте CanTouch в Properties у каждого парта лавы, каждой монеты и финиша. Если он выключен хоть у одного при нажатии Play, Roblox выдаёт ошибку, когда CourseService подключает Touched к этому парту, и скрипт останавливается там: ничего после этого места не работает, поэтому дальнейшие монеты, финиш или сброс забега могут быть не подключены. Отметьте CanTouch у всех и нажмите Play снова.
Касание монеты ничего не делает
Монета должна быть партом прямо внутри папки Coins, а не в другой папке или модели там, потому что CourseService смотрит только на прямых потомков папки. Она также должна быть там до нажатия Play, с отмеченным CanTouch (см. пункт выше).
Я касаюсь Finish, и ничего не происходит
Нужно 3 монеты за этот забег, с последнего возрождения или финиша. Касание лавы сбрасывает этот счётчик, и победа тоже, хотя число Coins в списке игроков остаётся. Также проверьте, что парт называется точно Finish и лежит прямо внутри Course.
Finish даёт победу, но не переносит меня обратно
CourseService ищет SpawnLocation прямо в Workspace и печатает предупреждение в Output, если его там нет. Если вы перетащили SpawnLocation в Course или одну из его папок, перетащите его обратно в Workspace в Explorer и нажмите Play снова.
Лава меня не перезапускает
Парт лавы должен лежать прямо внутри папки Lava до нажатия Play, с отмеченным CanTouch. Парт лавы в другом месте Course это просто красная платформа.
Платформы или монеты падают при нажатии Play
Они не закреплены. Выделите их, отметьте Anchored в Properties и нажмите Play снова.
С RoCode: та же трасса по описанию
Если вы предпочитаете описать игру, а не строить каждую деталь вручную, RoCode может построить её в открытом плейсе. RoCode это независимый ИИ-агент для Roblox Studio, не от Roblox: вы описываете функцию в его веб-чате, а плагин для Studio создаёт парты и скрипты в вашем Explorer, поэтому копировать код из окна чата не нужно.
Сделай трассу с монетами: папку Course с папками Lava и Coins и партом Finish, характеристики Coins и Wins в leaderstats, лаву, которая перезапускает игроков, монеты по 1, которые возвращаются через 10 секунд, и финиш, который даёт победу только после 3 монет за этот забег.
- Может сначала поискать в плейсе существующий код leaderstats или DataStore, чтобы расширить то, что есть, а не добавлять вторую таблицу лидеров
- Создаёт папку и парты в Workspace и скрипты в ServerScriptService
- Проверяет каждый написанный скрипт в Studio через Check Script. Это проверка компиляции, а не проверка типов и не плейтест
- Ставит точку отмены до и после каждой группы изменений, поэтому Ctrl+Z откатывает по одной группе
С плагином 3.9 или новее RoCode может запустить короткий плейтест и прочитать ошибки, а с 3.9.11 или новее управлять тестовым персонажем, но проверяет только то, что выбрал, поэтому играете вы сами. Целая игра с RoCode строится так же, по одной системе на промпт. Как RoCode подключается к Studio.
Частые вопросы
Можно ли сделать игру в Роблокс бесплатно?
Да. Studio бесплатен, а для стройки и публикации нужен только аккаунт Roblox. Для выпуска к игрокам ещё нужен аккаунт с хорошей репутацией возрастом не меньше 2 дней и проверка возраста. Некоторые дополнительные вещи стоят Robux, например возвратный сбор, который является одним из способов открыть игру для всех возрастов.
Можно ли сделать игру Roblox на телефоне, iPad или Chromebook?
Страница установки Roblox указывает Studio только для Windows и Mac, поэтому для создания игры нужен один из этих компьютеров.
Как сделать игру в Роблокс публичной?
Выпустите её. В Studio выберите File > Publish, нажмите Continue, ответьте на вопрос о контенте с возрастными ограничениями, затем нажмите Publish. Нужен аккаунт с хорошей репутацией возрастом не меньше 2 дней и проверка возраста. Если ответить No, Roblox откроет игру пользователям от 16 лет с проверкой возраста. Для всех возрастов есть дополнительные требования, перечисленные в шаге 7.
Почему друзья не могут зайти в мою игру?
Новые игры закрыты: зайти могут только вы, люди с доступом Edit и участники группы с нужными ролями. Выпустите игру через File > Publish, что требует проверки возраста и ответа на вопрос о контенте, или пригласите до 10 друзей похожего возраста как ранних тестеров через File > Invite early testers.
Почему пишет, что моя игра только для 16+?
Обычно потому, что при выпуске вы ответили No на вопрос о контенте с возрастными ограничениями. Тогда Roblox ставит метку Content May Vary и открывает игру пользователям от 16 лет с проверкой возраста. Ответ Yes с полной анкетой тоже даёт 16+ или 18+, в зависимости от содержания. Для всех возрастов нужны подтверждение аккаунта, двухэтапная проверка, подписка Roblox Plus или Premium 2 месяца подряд или разовый возвратный сбор, проверка игры и полная анкета.
Как сделать игру с друзьями?
Нажмите Collaborate в Studio и дайте другу доступ Edit. Чтобы работать с другими создателями, сначала пройдите проверку возраста, после чего Studio по умолчанию позволяет работать только с создателями совместимых возрастных групп. Затем вы оба можете работать в одном плейсе одновременно.
Нужно ли уметь писать скрипты?
Для этого гайда нет: вы вставляете два скрипта, а таблицы объясняют, что делает каждая часть. Чтобы уверенно их менять, начните со скриптинга для начинающих.
Источники и что почитать
- Roblox Creator Docs: Roblox Studio setup (на английском). Studio бесплатен для Windows и Mac; установка и вход
- Roblox Creator Docs: Create and publish games and places (на английском). шаблоны, File > Publish, закрыто по умолчанию, ранние тестеры, выпуск, требования, дневной лимит и Manage Audience
- Roblox Creator Docs: Templates (на английском). что содержит шаблон Baseplate
- Roblox Creator Docs: Explorer window (на английском). вставка объектов, папок и дублирование
- Roblox Creator Docs: Parts (на английском). вставка партов, цилиндров, перемещение, масштаб и цвет
- Roblox Creator Docs: Deadly lava tutorial (на английском). парт лавы, который ставит Health в 0 при касании
- Roblox Creator Docs: Create a coin collection mechanic (на английском). монеты с выключенным CanCollide и включённым Anchored
- Roblox Creator Docs: Score points tutorial (на английском). папка leaderstats и её точное имя
- Roblox Creator Docs: BasePart.CanTouch (на английском). подключение Touched к парту с выключенным CanTouch выдаёт ошибку
- Roblox Creator Docs: Studio testing modes (на английском). Test, Play (F5), Stop и Server & Clients
- Roblox Creator Docs: Humanoid:TakeDamage (на английском). защита ForceField и прямая установка Health
- Roblox Creator Docs: PVInstance:PivotTo (на английском). как двигать модель из скрипта
- Roblox Creator Docs: Version History (на английском). сохранённые версии и опубликованные версии для игроков
- Roblox Creator Docs: Security tactics and cheat mitigation (на английском). не доверяйте клиенту; события Touched на любом расстоянии
- Roblox Creator Docs: Network ownership, movement validation, and physics (на английском). клиент может телепортировать своего персонажа и летать
- Roblox Creator Docs: Defensive design (на английском). случай с телепортом в конец обби
- Roblox Creator Docs: Collaboration (на английском). кнопка Collaborate, доступ Edit, проверка возраста и автосохранение
Как проверялся код: каждый скрипт на этой странице проходит строгую проверку типов Luau с определениями Roblox API (luau-lsp, 26 октября 2026 г.). Проверка типов ловит опечатки в API и неверные типы, но не ошибки игровой логики, поэтому протестируйте всё в Studio перед публикацией.