Коротко: на першу робочу гру вистачає шести конструкцій Lua: змінна, умова, цикл, функція, звернення до об'єкта і підписка на подію. Дві речі ламають код із чужих уроків: wait() замінили на task.wait(), а нумерація в таблицях Lua починається з одиниці, а не з нуля.

Lua обрали для Roblox не випадково: мова маленька. Усе, що в ній є, вміщується на кількох аркушах, і дитині не треба вивчати половину підручника, перш ніж зробити двері, які відчиняються.

Де взагалі живе скрипт

У Roblox Studio скрипт — це об'єкт, який лежить усередині іншого об'єкта. Покладений у деталь, він керує саме нею. Покладений у ServerScriptService, працює на весь світ. Від місця залежить і те, що скрипт бачить навколо себе, і те, коли він запускається.

Типів скриптів три. Звичайний Script виконується на сервері, LocalScript — на комп'ютері гравця, ModuleScript зберігає спільний код. Плутанина між першими двома дає найзагадковіші помилки перших місяців: код ніби правильний, але нічого не відбувається, бо серверний скрипт намагається дістати інтерфейс гравця.

Шпаргалка

Шість конструкцій, з яких складається перший скрипт
Що требаЯк пишеться
Зміннаlocal zdorovya = 100
Вивести в консольprint("Привіт")
Умоваif zdorovya <= 0 then ... end
Інакшеelseif ... then і else
Цикл із лічильникомfor i = 1, 10 do ... end
Нескінченний циклwhile true do ... end
Функціяlocal function vidchynyty() ... end
Об'єкт поряд зі скриптомscript.Parent
Подія дотикуpart.Touched:Connect(function(hit) ... end)
Паузаtask.wait(1)
Коментар-- текст після двох дефісів

Порядок слів у Lua жорсткий: після if обов’язково йде then, після for і while — do. Пропущене службове слово Studio помічає одразу, і це та категорія помилок, яка зникає за перші два тижні. Кожен блок закривається словом end. Саме незакритий end дає більшість помилок у перші тижні: Studio підкреслює рядок нижче того, де насправді проблема, і дитина довго дивиться не туди.

Змінні й те, що в них лежить

Слово local перед іменем означає, що змінна живе тільки в цьому блоці. Без нього змінна стає глобальною, і два скрипти починають непомітно перезаписувати одне одному значення. Звичка писати local завжди економить години пошуку.

Типів небагато: число, рядок, логічне значення, таблиця і nil — порожнеча. Останній і дає найчастішу помилку attempt to index nil value: скрипт звернувся до об'єкта, якого ще немає або вже немає.

Таблиці: єдина структура даних

У Lua немає окремо масивів і словників — є таблиця, яка працює і так, і так. Запис local spysok = {"меч", "щит"} створює список, spysok[1] дістає перший елемент.

Саме тут головна пастка для тих, хто вже писав Python або JavaScript: нумерація починається з одиниці. Дитина, яка прийшла зі Scratch, цього навіть не помічає, а та, що знає Python, спотикається кілька разів поспіль.

Події: з чого складається інтерактив

Гра в Roblox тримається на подіях. Touched спрацьовує від дотику, MouseButton1Click — від кліку по кнопці, PlayerAdded — коли гравець заходить у світ. До кожної підписуються через :Connect(), передаючи функцію, яка має виконатися.

Функція всередині Connect отримує аргумент — те, що спричинило подію. У випадку Touched це деталь, яка торкнулася. Перевірка, чи належить вона гравцеві, і є той рядок, який відрізняє робочу пастку від пастки, що спрацьовує на кожен камінь.

Перший скрипт, який ми даємо писати, — платформа, що зникає під ногами. У ньому є все одразу: подія Touched, пауза, зміна властивості й повернення назад. Шість рядків, зате після них дитина розуміє будову будь-якого наступного скрипта.

Властивості: те, що змінюють найчастіше

Будь-який об'єкт у Studio має набір властивостей, і скрипт міняє їх так само, як панель справа. part.Transparency = 0.5 робить деталь напівпрозорою, part.Anchored = true прибиває її на місці, part.BrickColor = BrickColor.new("Bright red") перефарбовує.

Імена властивостей пишуться з великої літери й без пробілів — саме тут діти помиляються найчастіше, бо в панелі вони відображаються інакше. Підказка проста: що написано у вікні Properties без пробілів, те й пишемо в коді.

Окремо варто запам'ятати Anchored. Деталь без нього падає під дією фізики, і половина питань «чому моя платформа провалилася» вирішується одним рядком.

Створити об'єкт кодом

Не все має лежати на сцені заздалегідь. Запис local part = Instance.new("Part") створює деталь, після чого їй задають властивості й вказують батька: part.Parent = workspace. Поки батька немає, об'єкт існує в пам'яті, але його не видно.

Цей порядок — спершу властивості, потім батько — не формальність. Якщо поставити батька першим, гравці побачать, як деталь мигає й міняє колір просто на очах.

Чому у Studio працює, а в грі ні

Найнеприємніший клас помилок. У режимі Play все тримається на одному комп'ютері, а на справжньому сервері код розділений: серверний скрипт не бачить того, що намалював локальний, і навпаки.

Через це кнопка інтерфейсу має оброблятися в LocalScript, а нарахування очок — у звичайному Script. Зв'язок між ними йде через RemoteEvent, і це перша по-справжньому доросла тема курсу.

Дві зміни, через які чужі уроки не працюють

Перша: wait() застарів, і в нових проєктах його замінює task.wait(). Старий варіант поки працює, але Studio підсвічує його як небажаний, а відео трирічної давнини повні саме ним. Те саме сталося зі spawn() і delay() — у них тепер є відповідники в task.

Друга стосується способу отримати об'єкт. Замість крапкового звернення на кшталт workspace.Dveri надійніше писати workspace:WaitForChild("Dveri"): якщо об'єкт ще не завантажився, перший варіант поверне nil, а другий дочекається.

Три помилки в Output, які бачиш найчастіше

attempt to index nil value означає, що скрипт звернувся до об'єкта, якого немає. Найчастіша причина — звернення по імені до деталі, яку перейменували або ще не завантажили. Лікується через WaitForChild і перевіркою написання.

attempt to call a nil value — спроба викликати функцію, якої не існує. Зазвичай це друкарська помилка в назві або виклик методу через крапку замість двокрапки: part.Destroy() замість part:Destroy().

Expected 'end' to close 'function' — незакритий блок. Studio називає рядок, де дійшла до кінця файлу, а не той, де насправді забули слово. Шукати треба вище, і найшвидше допомагає акуратний відступ: правильно зсунутий код показує пропущений end очима.

Жодна з цих трьох помилок не означає, що дитина щось зробила не так. Вони трапляються в усіх, і єдина різниця між новачком і досвідченим — швидкість упізнавання.

Консоль — головний інструмент

Вікно Output у Studio показує і print, і помилки з номером рядка. Звичка дивитися туди першою справою відрізняє дитину, яка просунеться, від тієї, що кликатиме викладача на кожну дрібницю.

На курсі Roblox для 9–11 років більша частина часу йде саме на читання помилок, а не на запам'ятовування слів. У старшій групі 11–14 років додаються серверна логіка й збереження даних. Чим шлях гравця відрізняється від шляху розробника, ми розбирали окремо — у матеріалі Roblox: старт чи професійна розробка.