Первую игру в Roblox Studio лучше начать не с огромной карты, а с одного законченного цикла: игрок появляется, находит монету, касается её и получает очко. Ниже превратим Baseplate в работающий прототип: соберём маленькую сцену, добавим счёт Coins, напишем механику сбора и проверим её в Play Test.
У игры должен быть наблюдаемый результат. Красивый Baseplate без действия остаётся сценой, а одна монета со счётчиком уже создаёт правило, цель и обратную связь. Этот маленький проект даёт правильную основу: объекты лежат в Workspace, серверная логика в ServerScriptService, ошибки видны в Output.
Оставляем SpawnLocation и добавляем платформы с монетами.
Touched определяет игрока и увеличивает его Coins.
Play создаёт персонажа, а Output показывает ошибки скриптов.
Что находится внутри Baseplate-проекта
Откройте Roblox Studio, выберите шаблон Baseplate и включите панели Explorer, Properties и Output на вкладке View. Explorer показывает дерево объектов, Properties меняет выбранный объект, Output собирает сообщения и ошибки во время запуска.
| Место в Explorer | Что там хранить | Что будет в проекте |
|---|---|---|
Workspace | Видимые и физические объекты мира | Baseplate, SpawnLocation, Platforms, Coins |
ServerScriptService | Серверные скрипты, которых нет в сцене | PlayerStats |
StarterGui | Интерфейс, копируемый игроку | Пока не нужен: счёт покажет leaderstats |
Output | Не объект, а панель диагностики | print, warn и красные ошибки |
Если объект можно увидеть или коснуться в мире, ищите его в Workspace. Если это общая серверная логика, начинайте с ServerScriptService.

Понятные имена в Explorer сокращают половину ошибок с поиском объектов.
Собираем маленькую карту и монету
- В Workspace создайте Folder с именем
Platforms. Добавьте в него 3-4 Part, растяните их инструментом Scale и поставьтеAnchored = true. - Оставьте
SpawnLocationна Baseplate. Убедитесь, что точка появления не находится внутри другой детали. - Создайте Folder
Coins. Внутри добавьте Part с именемCoin, задайте Shape = Ball, Material = Neon, жёлтый цвет,Anchored = trueиCanCollide = false. - Поднимите Coin примерно на 3 studs над платформой. Продублируйте её ещё два раза после того, как первая механика заработает.
Anchored = trueне даёт платформам и монете упасть под действием физики.CanCollide = falseразрешает персонажу пройти сквозь монету без толчка.- Свойство
CanTouchоставьте включённым, иначе событие касания не сработает. - Не берите случайную модель из Toolbox для первого теста: лишние скрипты усложняют диагностику.
Добавляем счёт Coins через leaderstats
Roblox автоматически показывает таблицу значений, если внутри Player есть Folder с точным именем leaderstats. Создадим этот Folder при входе каждого игрока. В ServerScriptService добавьте обычный Script, назовите его PlayerStats и вставьте код.
local Players = game:GetService("Players")
local function setupPlayer(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Value = 0
coins.Parent = leaderstats
end
Players.PlayerAdded:Connect(setupPlayer)После нового Play Test справа в списке игроков появится колонка Coins со значением 0. Если её нет, откройте Output и проверьте имя leaderstats: оно чувствительно к регистру и должно быть написано именно так.
Если таблицы, функции и события пока выглядят незнакомо, разберите их на коротких задачах в курсе Lua. Для первого игрового проекта важнее понимать каждую строку, чем быстро вставить большой чужой скрипт.

Счёт превращает касание объекта в понятный игроку результат.
Пишем механику сбора монеты и запускаем тест
Внутрь первой детали Coin добавьте обычный Script с именем Collect. Событие Touched может сработать несколько раз от разных частей персонажа, поэтому переменная enabled закрывает монету сразу после первого успешного касания.
local Players = game:GetService("Players")
local coin = script.Parent
local enabled = true
local RESPAWN_TIME = 5
local function onTouched(otherPart)
if not enabled then
return
end
local character = otherPart:FindFirstAncestorOfClass("Model")
local player = character and Players:GetPlayerFromCharacter(character)
if not player then
return
end
local leaderstats = player:FindFirstChild("leaderstats")
local coins = leaderstats and leaderstats:FindFirstChild("Coins")
if not coins then
return
end
enabled = false
coins.Value += 1
coin.Transparency = 1
coin.CanTouch = false
task.wait(RESPAWN_TIME)
coin.Transparency = 0
coin.CanTouch = true
enabled = true
end
coin.Touched:Connect(onTouched)- Игрок касается Coin, и значение Coins увеличивается ровно на 1.
- Монета становится невидимой и перестаёт принимать касания.
- Через 5 секунд она появляется снова и может быть собрана повторно.
- NPC и случайные физические детали не получают счёт, потому что код проверяет Player.

Проверки идут до изменения Coins, поэтому случайное касание не ломает счёт.
- Нажмите F5 или Test, добегите до монеты и следите за значением Coins.
- Коснитесь монеты одним персонажем несколько секунд: за один цикл должно добавиться только одно очко.
- Подождите пять секунд и соберите её снова. Затем откройте Output и убедитесь, что красных строк нет.
- Остановите тест через Shift+F5. Изменения, сделанные внутри запущенной симуляции, после остановки сбрасываются.
Частые ошибки и безопасный следующий шаг
У детали выключен Anchored. Выйдите из теста, выберите Coin и включите свойство в Properties.
Проверьте, что Script включён, лежит внутри Coin, у детали CanTouch = true, а тест запущен через Play, не просто Run без персонажа.
Блокировка ставится слишком поздно или отсутствует. Присвойте enabled = false до ожидания и изменения физических свойств.
Это ожидаемо: leaderstats показывает текущее значение, но не сохраняет его. Постоянный прогресс требует отдельного DataStore и серверных проверок.
Как создать первую игру в Roblox Studio?
Откройте Baseplate, соберите маленькую сцену из Anchored-деталей, добавьте одно понятное правило в серверном Script и проверьте полный игровой цикл через Play Test.
Чем Play отличается от Run?
Play запускает симуляцию и создаёт персонажа игрока. Run запускает мир без персонажа, поэтому механику касания игроком так полноценно не проверить.
Куда вставлять обычный Script?
Скрипт конкретной монеты можно положить внутрь Coin. Общую серверную логику создания статистики поместите в ServerScriptService.
Почему деталь должна быть Anchored?
Без Anchored на неё действует физика: платформа или монета может упасть. Для неподвижных частей первой карты свойство обычно включают.
Сохраняются ли Coins после выхода?
Нет. IntValue внутри leaderstats живёт только в текущем сервере. Для сохранения между сессиями понадобится DataStore.
Сначала разберите первый скрипт с реакцией на игрока, затем изучите leaderstats с монетами и победами. Если Output показывает красную строку, используйте разбор ошибок Roblox Studio.
После трёх работающих монет добавьте звук, таймер или магазин, но меняйте только одну механику за раз. Полный маршрут развития проекта собран в дорожной карте Lua-разработчика Roblox.
