Lua и Luau: основные различия
Игровой движок Roblox создан на C++, а логику игр и скрипты пишут на Lua. Точнее, на его диалекте Luau: именно под ним обычно и имеют в виду «Lua для платформы». Этот язык используется в Roblox для всех скриптов. Типы (string, number, boolean прямо в объявлении), дженерики и оптимизации делают его удобнее классического языка для игрового движка, который используется в Roblox. Синтаксис совместим с версией 5.1, поэтому примеры из обычных руководств подходят и здесь.
Новичку разница между Lua и Luau почти не важна: начните со стандартного Lua и простых скриптов, а особенности Luau изучите по ходу. Редактор Roblox Studio поддерживает оба варианта. Язык Luau одинаково работает на сервере и на клиенте, а примеры в статье пишутся на том же языке — это scripting в чистом виде.
Разработку делят на две части: сборку сцены из готовых деталей и scripting — написание скриптов, которые задают объектам поведение. Эта статья про скрипты: с каких конструкций начать, чтобы объекты в игре двигались, реагировали на игрока и хранили данные. Основы программирования и сам язык в Roblox Studio важнее знания всех команд.
Lua читается легко: скрипты на нём пишутся быстро, и первые объекты в игре начинают двигаться уже на первом занятии. Luau — версия языка с удобными типами, а видно это сразу: ошибки подсвечиваются ещё до запуска. Языком для скриптов служит Luau, а сцену собирают в Roblox Studio. Языки семейства Lua похожи, поэтому, разобравшись в одном, легко понять другой. Синтаксис языка осваивают быстро: одна команда — одна мысль. Программированию удобно учиться по шагам, а главное — понимать, что решает сам язык, а не редактор.
Где писать скрипты и базовый синтаксис
Скрипты пишут прямо во встроенном редакторе: в панели Explorer выбирают объект — например, ServerScriptService, — правой кнопкой Insert Object → Script, и открывают код. Отдельную программу ставить не нужно. Roblox Studio скачивается бесплатно с официального сайта: запуск игры для проверки уже встроен, поэтому не придётся ни платить, ни устанавливать отдельный компилятор. Если редактора ещё нет на компьютере — разбор, как установить Roblox Studio и настроить его с нуля, есть в отдельной статье.
Синтаксис языка короткий: переменную объявляют словом local, а тип Luau определяет сам по значению. Roblox Studio сам подскажет тип, писать его вручную не нужно.
local playerName = "Steve" -- строка local score = 0 -- число local isReady = true -- логический тип print(playerName .. " готов: " .. tostring(isReady))
В Luau тип можно указать явно — local score: number = 0 — тогда Roblox Studio подсветит ошибку, если в переменную попадёт значение не того типа. Для первых скриптов это не обязательно, но упрощает поиск опечаток в больших проектах Luau и в самом scripting. Знакомство с типами — часть разработки на Luau. Язык Luau подсказывает типы прямо в Roblox Studio, а в больших проектах используется тот же подход.
Script, LocalScript, ModuleScript: зачем три типа
- Script — выполняется на сервере. Видит всех игроков в Roblox, управляет игровой логикой, хранит данные. Кладётся в ServerScriptService. Пример: начисление очков, управление волнами врагов
- LocalScript — выполняется на клиенте (у каждого игрока своя копия). Обрабатывает ввод, анимации интерфейса. Кладётся в StarterPlayerScripts или StarterCharacterScripts. Пример: кнопки UI, обработка нажатий клавиш
- ModuleScript — библиотека функций, которую вызывают другие скрипты. Кладётся в ReplicatedStorage. Пример: общие функции расчёта урона, работа с данными
Все три типа скриптов пишутся на Luau, но в проекте каждый из них работает по-своему. Script отвечает за сервер, LocalScript — за то, что видит игрок, ModuleScript — за общие функции. Код у них один и тот же, меняется место и роль.
Часто используемые API
Ниже — API, которые чаще всего встречаются в скриптах Roblox. Это и есть язык программирования Luau в действии.
-- Получить игрока
local player = game:GetService("Players").LocalPlayer
-- Получить объект по имени
local part = workspace:FindFirstChild("MyPart")
-- Изменить свойство
part.BrickColor = BrickColor.new("Bright red")
part.Transparency = 0.5
-- Уничтожить объект
part:Destroy()
-- Создать копию объекта
local clone = part:Clone()
clone.Parent = workspace
-- Событие
part.Touched:Connect(function(hit)
local character = hit.Parent
local hum = character:FindFirstChild("Humanoid")
if hum then
hum.Health -= 10 -- урон
end
end) RemoteEvents: сервер ↔ клиент
Для многопользовательских игр основа программирования — скрипты на сервере и клиенте, которые общаются через RemoteEvents на Luau:
-- LocalScript: игрок нажал кнопку "Купить"
local buyEvent = game.ReplicatedStorage:WaitForChild("BuyItem")
buyEvent:FireServer("sword")
-- Script: сервер получил запрос
buyEvent.OnServerEvent:Connect(function(player, item)
if player.leaderstats.Coins.Value >= 50 then
player.leaderstats.Coins.Value -= 50
-- выдать предмет
end
end) Это критически важный паттерн — без него невозможно сделать честную многопользовательскую игру. Все денежные операции должны проверяться на сервере!
Похожим образом через LocalScript управляют элементами интерфейса — например, обновляют текст на экране игрока. Разбор с примерами скриптов — в статье как сделать надпись или табличку в редакторе.
Синтаксис и события задают логику, но ими проект не ограничивается: нужна ещё карта, идея и публикация. Полный путь от пустой сцены до готовой игры, с местом Lua на каждом шаге, — в статье как создать игру на платформе.
DataStore: сохраняем прогресс между сессиями
Без сохранения данных игра забывает всё, что накопил игрок: монеты, уровень, купленные предметы. Для постоянного хранения в Luau платформа Roblox предоставляет DataStoreService. Он сохраняет данные между сессиями игрока и между разными серверами одной игры.
local DataStoreService = game:GetService("DataStoreService")
local coinsStore = DataStoreService:GetDataStore("PlayerCoins")
-- Сохранить при выходе игрока
game.Players.PlayerRemoving:Connect(function(player)
local success, err = pcall(function()
coinsStore:SetAsync(player.UserId, player.leaderstats.Coins.Value)
end)
end)
Обёртка pcall в Luau здесь не формальность: DataStore иногда отвечает с задержкой или ошибкой, и без обработки такой ошибки игра может вылететь у игрока в неподходящий момент — например, прямо во время сохранения его прогресса. Разбор ошибок такого рода — отдельный, но важный навык, который на курсе отрабатывают на практике, а не только в теории.
С чего начинать и сколько времени это займёт
Основы Lua можно освоить за одно занятие: первый скрипт, который двигает объект по нажатию клавиши, реально написать в первый день, а результат виден сразу в Roblox Studio. Разница между Script, LocalScript и ModuleScript, события вроде Touched и первые RemoteEvents требуют нескольких недель регулярных занятий. DataStore и защита от читерства на сервере — тема для следующего этапа.
Освоить основы языка Lua и работу с ним проще всего с малого: понятный цикл и один блок кода уже двигают объект. Дальше появляются новые задачи, а выбор остаётся за учеником: любой жанр подойдёт, писать код можно для платформера, гонки или симулятора. Обучение подростков строится так, чтобы создавать игры и дальше создавать собственные проекты, а создание игр Roblox помогает сразу видеть результат.
На занятиях в школе #АйДаКодить этот путь проходят пошагово: сначала синтаксис и простые скрипты, затем события и типы скриптов, потом системы вроде очков и покупок с DataStore, и в конце — сборка всех механик в цельную игру с публикацией в магазине платформы. Работа идёт в мини-группах до 6 человек или индивидуально онлайн, а формат не меняет программу — итогом становится собственная опубликованная игра, а не набор разрозненных примеров.
Типичные ошибки новичков в Luau
Самая частая ошибка новичков в Roblox — писать в LocalScript всю игровую логику, включая проверку покупок и начисление очков. Так проще: LocalScript ближе к интерфейсу, и результат виден сразу. Но такой код открыт для изменения на стороне игрока: читер может подделать локальные переменные и получить бесконечные монеты. Всё, где на кону честность игры, должно выполняться в Script на сервере, а LocalScript только показывает результат. Чтобы писать код и создавать собственные игры, достаточно взять понятный пример и разбирать один блок за раз: новые задачи появляются постепенно, а выбор жанра остаётся за автором. В процессе обучения инструкция и инструменты доступны внутри редактора, а с помощью подсказок ученик находит решения и получает доступ к нужному разделу.
Вторая типичная проблема — забыть про WaitForChild там, где объект может ещё не успеть загрузиться. Из-за этого скрипт иногда работает на медленном интернете и падает на быстром, или наоборот. Такие ошибки искать сложнее очевидных опечаток.
Ещё одна частая привычка — писать один огромный скрипт вместо нескольких небольших модулей. Пока игра простая, это не мешает. Но когда механик становится больше десяти, найти нужный код в тысяче строк одного файла сложно, а в аккуратных ModuleScript — легко. Разделение кода на модули — не формальность для больших проектов, а рабочая привычка с первого дня.
Начинающим полезно сразу привыкать к этим правилам программирования, а не переучиваться позже, когда игра выросла из одного файла. На занятиях педагог показывает разделение серверной и клиентской логики и объясняет его смысл: так появляются рабочие привычки программирования, а не только знание отдельных команд Luau.
Курс для детей
Игровой редактор — Lua на практике
Ребята 10–16 лет осваивают разработку на Luau через создание реальных игр. Script/LocalScript, RemoteEvents, DataStore — всё на практических проектах.
Подробнее о курсе