{}const=>[]async()letfn</>var
LuaОсновы

Luau vs Lua: главные отличия для разработки игр в Roblox

Сравниваем Lua и Luau без путаницы: типы, синтаксис, производительность, совместимость и то, какой язык учить для Roblox Studio.

К

Кодик

Автор

6 мин чтения

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

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

1Lua

Компактный универсальный язык, который встраивают в программы и игры.

2Luau

Форк Lua 5.1 для Roblox с типами, анализатором и своим развитием.

3Выбор

Для Roblox учите общую базу Lua и сразу практикуйтесь в Luau.

Общая база Lua 5.1 и то, что Luau добавляет сверху
Что переносится из Lua в Luau без правок: переменные, таблицы, функции, условия и циклы, а сверху добавляются аннотации типов, оператор += , continue и объекты Roblox API.

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 фиксирует форму таблицы, поэтому крупный проект реже ломается из-за опечатки в поле. Типизацию можно вводить по файлам, не переписывая игру целиком.

🔥 100 000+ учеников уже с нами

Устал читать теорию?
Пора кодить!

Кодик — приложение, где ты учишься программировать через практику. AI-наставник, интерактивные уроки, реальные проекты.

🤖 AI 24/7
🎓 Сертификаты
💰 Бесплатно
🚀 Начать учиться
Присоединились сегодня

Что совпадает, а что отличается

ЭлементЧто означаетЧто делать
Переменные, функции, таблицыЕстьЕсть, синтаксис в основном знакомый
Постепенная типизацияНет в стандартном языкеЕсть аннотации и вывод типов
Операторы += и continueНет в базовом Lua 5.1Есть
Интеграция с Roblox APIНетЕсть типы классов и подсказки Studio
Среда выполненияЗависит от версии LuaВстроена в Roblox и развивается отдельно

Не копируйте без проверки код для Lua 5.4 в Studio. Некоторые библиотеки, модули и детали стандартной среды отличаются. Обратное тоже верно: скрипт с Instance, Vector3, типами Luau или сервисами Roblox не запустится в обычном интерпретаторе Lua. При поиске ответа добавляйте к запросу слово Luau или Roblox, если вопрос связан со Studio.

Как понять, под Luau написан пример или под обычный Lua
Проверка примера перед копированием: код с Instance, Vector3 и game:GetService живёт только в Studio, пример под Lua 5.4 там может не запуститься, поэтому к поисковому запросу добавляют слово Luau.

Практика: включите --!strict и поймайте неверный тип до запуска

Соберите пример со структурой PlayerScore в пустом месте Studio и посмотрите, где Luau расходится с обычным Lua. Успех состоит из двух частей: в Output печатается строка BuilderFox: 120, а подменённый тип поля подчёркивается анализатором ещё до нажатия Play.

  1. Script с --!strict. Создайте пустое место, добавьте Script в ServerScriptService и первой строкой файла напишите --!strict. Этот режим включает более строгий анализ, в обычном Lua такой директивы нет.
  2. Алиас типа PlayerScore. Объявите type PlayerScore с полями name: string и points: number. Алиас фиксирует форму таблицы, поэтому опечатка в имени поля будет видна в редакторе, а не на тестовом сервере.
  3. Функция formatScore. Добавьте local function formatScore(score: PlayerScore): string, которая склеивает score.name и tostring(score.points). Запись после скобок описывает результат функции, аннотация после параметра описывает вход.
  4. Печать BuilderFox: 120. Заведите currentScore с name = "BuilderFox" и points = 120, вызовите print(formatScore(currentScore)) и нажмите Play. В Output появится строка BuilderFox: 120.
  5. Подмена типа points. Замените points = 120 на points = "120" и не запускайте игру. Анализатор Studio подчеркнёт присваивание и сообщит, что строка не подходит под number, ошибка видна до запуска.

Удалите строку --!strict и оставьте points = "120". Претензия анализатора пропадёт, а игра спокойно запустится и напечатает BuilderFox: 120, потому что tostring принимает и строку. Это и есть постепенная типизация: без режима файл ведёт себя как обычный Lua, строгие проверки вы включаете сами и по одному файлу.

Критерий готовности. Готово, когда вы делите свой же пример на две части: таблица, локальная функция, конкатенация и print работают в любом Lua, а --!strict, алиас PlayerScore и аннотации существуют только в Luau. Подтверждение: строка BuilderFox: 120 в Output и подчёркивание на подменённом типе, которое появилось без запуска.

Дальше типизируйте только входы и выходы одной публичной функции своего проекта, локальные очевидные значения анализатор выведет сам. Перенесите 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.

🎯Хватит откладывать

Понравилась статья?
Пора применять на практике!

В Кодик ты не просто читаешь — ты сразу пишешь код. Теория + практика = реальный скилл.

Мгновенная практика
🧠AI объяснит код
🏆Сертификат

Без регистрации • Без карты