Главные отличия Luau от Lua связаны с постепенной типизацией, дополнительным синтаксисом, анализатором и оптимизациями для Roblox. Luau создан на основе Lua 5.1. Для Roblox Studio пишите на Luau, а общую базу удобно изучать как Lua: переменные, таблицы, функции, условия и циклы работают знакомо.
Название часто сбивает новичков. В интерфейсе Studio файлы и примеры могут выглядеть как обычный Lua, однако анализатор и среда выполнения используют Luau. Это не отдельный язык с нуля и не полная копия свежей версии Lua. Luau развивается под задачи больших игровых проектов: быстрый анализ кода, предсказуемая работа в редакторе, совместимость с существующими скриптами Roblox и возможность постепенно включать строгие типы.
Компактный универсальный язык, который встраивают в программы и игры.
Форк Lua 5.1 для Roblox с типами, анализатором и своим развитием.
Для Roblox учите общую базу Lua и сразу практикуйтесь в Luau.

Luau vs Lua: отличия на одном примере
В Luau типы можно добавлять не сразу. Режим --!strict включает более строгий анализ файла. Аннотация после параметра описывает ожидаемый тип, а запись после скобок описывает результат функции. Эти подсказки не заменяют тесты, зато помогают поймать строку вместо числа ещё до запуска. В обычном Lua такой встроенной системы аннотаций нет.
--!strict
type PlayerScore = {
name: string,
points: number,
}
local function formatScore(score: PlayerScore): string
return score.name .. ": " .. tostring(score.points)
end
local currentScore: PlayerScore = {
name = "BuilderFox",
points = 120,
}
print(formatScore(currentScore))- BuilderFox: 120
- Неверный тип points анализатор отметит до запуска
Код остаётся узнаваемым для человека, который знает Lua: здесь есть таблица, локальная функция, конкатенация и вызов print(). Новое находится вокруг данных. Алиас PlayerScore фиксирует форму таблицы, поэтому крупный проект реже ломается из-за опечатки в поле. Типизацию можно вводить по файлам, не переписывая игру целиком.
Что совпадает, а что отличается
| Элемент | Что означает | Что делать |
|---|---|---|
| Переменные, функции, таблицы | Есть | Есть, синтаксис в основном знакомый |
| Постепенная типизация | Нет в стандартном языке | Есть аннотации и вывод типов |
| Операторы += и continue | Нет в базовом Lua 5.1 | Есть |
| Интеграция с Roblox API | Нет | Есть типы классов и подсказки Studio |
| Среда выполнения | Зависит от версии Lua | Встроена в Roblox и развивается отдельно |
Не копируйте без проверки код для Lua 5.4 в Studio. Некоторые библиотеки, модули и детали стандартной среды отличаются. Обратное тоже верно: скрипт с Instance, Vector3, типами Luau или сервисами Roblox не запустится в обычном интерпретаторе Lua. При поиске ответа добавляйте к запросу слово Luau или Roblox, если вопрос связан со Studio.

Практика: включите --!strict и поймайте неверный тип до запуска
Соберите пример со структурой PlayerScore в пустом месте Studio и посмотрите, где Luau расходится с обычным Lua. Успех состоит из двух частей: в Output печатается строка BuilderFox: 120, а подменённый тип поля подчёркивается анализатором ещё до нажатия Play.
- Script с --!strict. Создайте пустое место, добавьте Script в ServerScriptService и первой строкой файла напишите --!strict. Этот режим включает более строгий анализ, в обычном Lua такой директивы нет.
- Алиас типа PlayerScore. Объявите type PlayerScore с полями name: string и points: number. Алиас фиксирует форму таблицы, поэтому опечатка в имени поля будет видна в редакторе, а не на тестовом сервере.
- Функция formatScore. Добавьте local function formatScore(score: PlayerScore): string, которая склеивает score.name и tostring(score.points). Запись после скобок описывает результат функции, аннотация после параметра описывает вход.
- Печать BuilderFox: 120. Заведите currentScore с name = "BuilderFox" и points = 120, вызовите print(formatScore(currentScore)) и нажмите Play. В Output появится строка BuilderFox: 120.
- Подмена типа points. Замените points = 120 на points = "120" и не запускайте игру. Анализатор Studio подчеркнёт присваивание и сообщит, что строка не подходит под number, ошибка видна до запуска.
Удалите строку --!strict и оставьте points = "120". Претензия анализатора пропадёт, а игра спокойно запустится и напечатает BuilderFox: 120, потому что tostring принимает и строку. Это и есть постепенная типизация: без режима файл ведёт себя как обычный Lua, строгие проверки вы включаете сами и по одному файлу.
Дальше типизируйте только входы и выходы одной публичной функции своего проекта, локальные очевидные значения анализатор выведет сам. Перенесите PlayerScore в ModuleScript и подключите его через require, чтобы форму таблицы использовали несколько скриптов. Помните границу: типы ловят несоответствие данных, но не проверяют баланс наград, права игрока и порядок событий.
Частые ошибки и почему они появляются
Самая частая ошибка выбора звучит так: «сначала полностью выучу Lua, потом открою Roblox». Полностью язык до проекта не изучают. После базовых конструкций нужен маленький игровой результат. Вторая крайность: учить только свойства объектов и копировать скрипты, не понимая таблиц и функций. Тогда любая новая механика превращается в набор несвязанных фрагментов.
Проверяйте, для Lua или Luau написан пример, и есть ли в нём API конкретного движка.
Начните со входов и выходов публичных функций. Локальные очевидные значения анализатор выведет сам.
Типы ловят несоответствия данных, но не проверяют баланс игры, сетевую безопасность и порядок событий.
Самопроверка
На каком языке пишут скрипты в Roblox Studio?
Скрипты в Roblox Studio выполняются на Luau. Это форк Lua 5.1, который Roblox развивает отдельно: добавлены постепенная типизация, собственный анализатор и оптимизации под большие игровые проекты.
Обязательно ли писать аннотации типов в Luau?
Аннотации типов в Luau необязательны, типизация здесь постепенная, и файл без них остаётся рабочим. Включайте --!strict и подписи по одному файлу, начиная со входов и выходов публичных функций.
Запустится ли скрипт с Roblox API в обычном Lua?
Скрипт с Instance, Vector3 или сервисами Roblox в обычном интерпретаторе Lua не запустится: эти классы существуют только внутри движка. Обратное тоже верно, часть библиотек и деталей Lua 5.4 в Studio недоступна.
Чем синтаксис Luau отличается от Lua 5.1?
Luau добавляет к синтаксису Lua 5.1 аннотации типов, алиасы вида type PlayerScore, оператор += и continue. Переменные, таблицы, функции, условия и циклы пишутся так же, поэтому база переносится почти без изменений.
Нужно ли сначала выучить Lua, а потом переходить на Luau?
Отдельно проходить весь Lua перед Roblox не нужно. Возьмите общую базу (переменные, условия, циклы, функции, таблицы) и сразу повторяйте каждый пример в Studio, где код уже выполняется на Luau.
Почему найденные примеры на Lua не работают в Studio?
Многие примеры на Lua написаны под версии 5.3 и 5.4 или под встраивание в другую программу, а Studio работает на Luau. Добавляйте к запросу слово Luau или Roblox, тогда в примерах будут учтены типы, сервисы и объекты движка.
Что делать дальше
Начните с переменных, условий, циклов, функций и таблиц в курсе Lua. После каждой темы переносите один пример в Studio: таблица становится настройками предметов, функция рассчитывает награду, условие проверяет доступ к двери. Затем включите --!strict в одном небольшом ModuleScript. Продолжить маршрут помогут дорожная карта Roblox-разработчика и разбор ошибок Roblox Studio.
