Для создания игр в Роблокс Студио используется язык программирования Lua. Это простой и интуитивно понятный язык который очень похож на JavaScript. Lua предназначен для пользователей, не являющихся профессиональными программистами, вследствие чего большое внимание уделено простоте дизайна и лёгкости обучения.
Фишки языка Lua
- Очень простой синтаксис с которым разберется даже бабушка пенсионер;
- Легко расширятся С кодом;
- Самый быстрый JIT компилятор;
- Одна структура данный (нет никаких массивов, сетов, дикшинари и других сложных структур);
Где используется язык программирования Lua
На нем пишут игры:
- Garry s mod;
- Roblox Studio;
- Мобильные игры — CoronaSDK/Love2D и т.д.
Так же он используется в веб серверах, например Openresty, Embedded разработке, СУБД Tarantool.
Минусы языка программирования Lua
Так как Lua это прежде всего язык для скриптов, в нем:
- НЕТ официального репозитория пакетов;
- НЕТ встраиваемого механизма организации кода в пакеты.
Вывод
Lua — это простой, понятный и легко осваиваемый язык программирования на котором просто писать скрипты. Он ограничен по функционалу и далеко не все задумки можно реализовать используя только его. Однако если бы он умел больше, он был бы уже не таким приятным и легким.
🌑 Пишем .lua скрипты для GTA:SA. №1 — Среда разработки, переменные, if-else
Как выучить язык программирования Lua если ты чайник
На самом деле если подойти к вопросу серьезно и никуда не спешить, можно выучить Lua за 1 час. Вот например отличные мануалы по языку Lua:
- Ускоренный мануал «Lua за 15 минут» — на английском языке;
- Продвинутый курс от создателей языка в виде книги на 250 стр (пиратские ссылки ищите сами);
Для пользователей с аллергией на английский, рекомендую посмотреть уроки по языку Lua на примере создания игр в Roblox Studio, в котором 9 небольших, простых уроков.
Источник: game-roblox.ru
Сценарии LUA
WebHMI начиная с версии 1.10.0.3393 позволяет создавать пользовательские скрипты на языке Lua 5.1 1.
Управление скриптами происходит в пункте меню Setup —> Scripts:
Каждый скрипт должен содержать в себе функцию с именем main. Именно она будет вызвана в необходимый момент (в зависимости от настроек скрипта — в каждом цикле, при действии на dashboard или при изменении значения регистра). Также, весь скрипт будет выполнен один раз при запуске демона. Это необходимо для компиляции сценария Lua и его валидации.
Выполнен будет весь код, который находится в глобальной области видимости (т.е. вне функции main, функция main не будет вызвана). Это может быть полезно для инициализации некоторых переменный и т.п.
В функцию main будет передан один параметр — userId — ID пользователя, который выполнил этот скрипт. Если скрипт выполняется в каждом цикле или при изменении регистра то userId будет равен нулю.
WebHMI накладывает следующие ограничения на стандартные функции и библиотеки языка Lua:
- не доступны такие функции и таблицы: require, print, loadfile, dofile, os.execute, os.getenv, os.remove, os.rename, os.tmpname, package, debug.debug, debug.getfenv, debug.getregistry, arg
- не доступны библиотеки: io
Помимо стандартных функций Lua, в WebHMI определены еще такие функции:
- GetReg
- SetReg
- WriteReg
- AddInfoMessage
- AddWarningMessage
- AddAlertMessage
- SendSMS
- SendTelegramMessage
- SendViberMessage
- ERROR
- INFO
- DEBUG
- TRACE
- ApplyRecipe
Для удобства работы с регистрами из программ Lua, каждому регистру можно присвоить символическое имя и работать из Lua уже с этим именем. Это имя указывается в настройках регистра в поле Variable name:
Пример простейшего скрипта, который показывает вызовы всех WebHMI функций:
function main (userId) local randomVal = GetReg(«random_val»); SetReg(«random_val_copy», randomVal); WriteReg(«result», randomVal + 2); AddInfoMessage(«This is a Lua script», userId); AddWarningMessage(«Warning. This is a Lua script», userId); AddAlertMessage(«Alert! This is a Lua script», userId); SendSMS(«380501234567», «This is a test SMS»); ERROR(«This message will be added to communication log with ERROR level»); INFO(«This message will be added to communication log with INFO level»); DEBUG(«This message will be added to communication log with DEBUG level»); TRACE(«This message will be added to communication log with TRACE level»); end
Несмотря на то, что встроенный редактор проверяет синтаксис программы, он не в состоянии выявить все ошибки, которые могу возникнуть в процессе выполнения скрипта. В случаях, если во время его выполнения возникнут какие-либо ошибки, они будут выведены в Communication Log.
Например, при выполнении этого скрипта произойдет ошибка т.к. переменная random не объявлена.
function main (userId) local v1 = GetReg(«Drying_Humidity1_Value»); v1 = v1+random; — ошибка здесь, если убрать random, всё становится ок SetReg(«Drying_Humidity1_Value», v1); WriteReg(«Drying_Humidity1_Value», v1); AddInfoMessage(v1, userId); end
В Communication Log можно будет увидеть такие записи:
Jan 23 12:09:27.047: ERROR: LUA scripts: Can’t execute LUA script #1. Error #2: [string «Calculate humidity»]:4: attempt to perform arithmetic on a nil value (global ‘random’) Jan 23 12:09:27.551: ERROR: LUA scripts: Can’t execute LUA script #1. Error #2: [string «Calculate humidity»]:4: attempt to perform arithmetic on a nil value (global ‘random’) Jan 23 12:09:28.051: ERROR: LUA scripts: Can’t execute LUA script #1. Error #2: [string «Calculate humidity»]:4: attempt to perform arithmetic on a nil value (global ‘random’)
Здесь видно, что произошла ошибка при попытке выполнения арифметической операции с неопределенной переменной (nil). Ошибка произошла в скрипте номер 1, его название «Calculate humidity», ошибка произошла в строке номер 4. Переменная, которая вызвала ошибку называется ‘random’.
Таким образом, с помощью этого лога можно найти все ошибки выполнения сценариев.
GetReg(variable_name[, connection_name])
Функция GetReg возвращает текущее значение регистра с именем переменной variable_name где variable_name — это значение Srcipt alias из настроек регистра. Вместо variable_name можно указывать число — ID регистра. Однако, ID регистра — это менее наглядный способ и он усложняет чтение программы.
Опциональный параметр connection_name можно указать если в нескольких разных соединениях есть регистры с одинаковым variable_name. В этом случае connection_name указывает из какого конкретно соединения необходимо читать регистр с именем variable_name. Также, вместо строки connection_name можно указывать ID соединения. Однако, опять же, константы усложняют чтение кода и предпочтительней использовать именованные строки.
Если регистр не найден или не был прочитан то возвращается значение nil.
Для удобства выбора регистров возле редактора скриптов есть три дополнительные кнопки.
При нажатии на любую из них появляется всплывающее окно со списком регистров.
После щелчка по интересующему регистру в редактор будет вставлен код с идентификатором выбранного регистра (variable_name если есть или ID) и комментарием с именем регистра, его адресом и именем соединения.
SetReg(variable_name[,connection_name] , new_value)
Функция SetReg устанавливает текущее значение регистра с именем переменной variable_name в new_value для текущего цикла. Запись во внешние устройства не происходит и при опросе этого регистра в последующих циклах будет прочитано старое значение. Возвращает 1 если произошла ошибка и 0 в случае успеха.
Параметры variable_name и connection_name работают так же как и в функции GetReg.
WriteReg(variable_name, new_value)
Функция WriteReg устанавливает текущее значение регистра с именем переменной variable_name в new_value для текущего цикла цикле и записывает это значение во внешнее устройство в начале следующего цикла. При опросе этого регистра в последующих циклах будет прочитано новое значение (если оно не изменится самим устройством). Возвращает 1 если произошла ошибка и 0 в случае успеха.
Параметры variable_name и connection_name работают так же как и в функции GetReg.
SendSMS(phone_number, message)
Функция SendSMS отправляет запрос на отправку SMS на номер phone_number с текстом message. Возвращает false если произошла ошибка и true в случае успеха. Успех не означает доставку сообщения, а только успех при создании запроса. Для работы этой функции необходимо наличие интернет-подключения и предоплаты за услуги SMS.
Формат phone_number — только цифры с указанием кода страны, без пробелов, скобок, знака плюс. Например, 380123456789.
SendTelegramMessage(chatId, message)
Функция SendTelegramMessage отправляет сообщение с текстом message в чат с Возвращает 1 если произошла ошибка и 0 в случае успеха. Успех не означает доставку сообщения, а только успех при создании запроса. Для работы этой функции необходимо наличие работающего интернет-подключения и доступа к серверу webhmicloud.com.
Для получения ChatId перейдите по ссылке http://telegram.me/webhmibot на мобильном телефоне (предварительно установив Telegram) и начните диалог с ботом webhmibot командой /start. В ответ вы получите сообщение с уникальным идентификатором чата ChatId.
SendViberMessage(chatId, message)
Функция SendViberMessage отправляет сообщение с текстом message в чат с Возвращает 1 если произошла ошибка и 0 в случае успеха. Успех не означает доставку сообщения, а только успех при создании запроса. Для работы этой функции необходимо наличие работающего интернет-подключения, учетной записи в системе Level2 и положительного баланса в этой системе. Отправка сообщений в Viber — платная услуга. Эта возможность доступна начиная с версии прошивки 2.4.4227.
Для получения ChatId перейдите по ссылке http://viber.com/webhmi на мобильном телефоне (предварительно установив Viber), нажмите кнопку Have a look.
Вы попадете в публичный аккаунт WebHMI. Перейдите в личные сообщения публичного аккаунта нажав кнопку справа вверху.
Напишите любой текст в чате. В ответ вы получите сообщение с уникальным идентификатором чата ChatId.
AddInfoMessage(message, userId)
Функция AddInfoMessage добавляет сообщение message с уровнем Info в журнал Messages. userId — это ID пользователя, от имени которого должно быть добавлено сообщение. Возвращает 1 если произошла ошибка и 0 в случае успеха.
AddWarningMessage(message, userId)
Функция AddWarningMessage добавляет сообщение message с уровнем Warning в журнал Messages. userId — это ID пользователя, от имени которого должно быть добавлено сообщение. Возвращает 1 если произошла ошибка и 0 в случае успеха.
AddAlertMessage(message, userId)
Функция AddAlertMessage добавляет сообщение message с уровнем Alert в журнал Messages. userId — это ID пользователя, от имени которого должно быть добавлено сообщение. Возвращает 1 если произошла ошибка и 0 в случае успеха.
ERROR(message)
Функция ERROR добавляет сообщение message уровня ERROR в Communication Log (Maintenance —> Communication Log). Возвращает 1 если произошла ошибка и 0 в случае успеха.
INFO(message)
Функция INFO добавляет сообщение message уровня INFO в Communication Log (Maintenance —> Communication Log). Возвращает 1 если произошла ошибка и 0 в случае успеха.
DEBUG(message)
Функция DEBUG добавляет сообщение message уровня DEBUG в Communication Log (Maintenance —> Communication Log). Возвращает 1 если произошла ошибка и 0 в случае успеха.
TRACE(message)
Функция TRACE добавляет сообщение message уровня TRACE в Communication Log (Maintenance —> Communication Log). Возвращает 1 если произошла ошибка и 0 в случае успеха.
ApplyRecipe(recipeId, userId)
Функция ApplyRecipe применяет рецепт с номером recipeId от имени пользователя с Если у данного пользователя нет прав доступа к этому рецепту то рецепт применен не будет. Применение рецепта заключается в записи в регистры, которые указаны в рецепте, соответствующих значений.
GetCurrentAlerts()
Функция GetCurrentAlerts возвращает список текущих аварий. Возвращаемое значение — таблица. Ключем является номер аварии, значением — таблица со свойствами аварии. Свойства аварии:
| Свойство | Описание | Тип данных |
| startTime | Время возникновения аварии | Number, UnixTime |
| regId | Номер регистра, в котором флаг аварии привел к этой аварии | Number |
| regAlias | Имя переменной регистра для программ | String |
| bit | Номер бита с флагом аварии | Number |
| title | Название аварии | String |
| connectionTitle | Название соединения | String |
| connectionId | ID соединения | Number |
| connectionAlias | Имя переменной соединения для программ | String |
| acknowledgedBy | Имя пользователя, который подтвердил аварию. Если авария не подтверждена — пустая строка. | String |
| acknowledgedTime | Время, когда авария был подтверждена. Если авария не подтверждена — 0. | Number, UnixTime |
| canBeAcknowledged | Флаг, обозначающий что данную аварию можно подтверждать. | Boolean |
Используя данную структура, можно реализовать, например, различные сценарии оповещения о неподтвержденных авариях.
Пример такой программы:
local notificationsSent = <>; function main (userId) local alerts = GetCurrentAlerts(); if (#alerts > 0) then for num,alert in pairs(alerts) do local now = os.time(); local canBeAcknowledged = alert[‘canBeAcknowledged’]; local acknowledgedTime = alert[‘acknowledgedTime’]; local startTime = alert[‘startTime’]; local waitSecondsBeforeEscalate = 300; — оповещать об авариях, которые неподтвержены более 5 минут local regId = alert[‘regId’]; local bit = alert[‘bit’]; if (canBeAcknowledged and acknowledgedTime == 0) then if (now — startTime > waitSecondsBeforeEscalate) then if (notificationsSent[regId] == nil or notificationsSent[regId][bit] ~= startTime) then —ERROR(«Alert» .. alert[‘title’] .. » was not acknowledged!»); SendSMS(«380501234567», «Не подтведжена авария: » .. alert[‘title’]); if (notificationsSent[regId] == nil) then notificationsSent[regId] = <>; end notificationsSent[regId][bit] = startTime; end end end end end end
Источник: www.akon.com.ru
Язык программирования Lua
Lua — это скриптовый язык программирования, на котором можно создавать проекты в Roblox Studio. Поэтому, если вы хотели разработать свою первую игру на этой платформе, советуем заранее познакомиться с ним. А чтобы помочь в этом, мы расскажем, что представляет из себя Lua и как работать с ним.
10 октября 2022
· Обновлено 7 августа 2023
В Roblox можно больше, чем просто играть
Научим детей и подростков программировать и создавать миры в Roblox

Что такое язык программирования
Для общения с людьми мы используем правила: соблюдаем грамматику, синтаксис, орфографию и т. д. Подобные правила есть и для коммуникации с компьютером. И каждый язык программирования сам для себя определяет их рамки.
Язык программирования — это система знаков, которую используют, чтобы создавать программы для компьютера.
Основная функция языка программирования — это разработка компьютерной программы, которая будет понятна исполнителю. Следуя алгоритму, исполнитель проводит вычисления, после которых будет выполнена определённая цель.
Алгоритм — совокупность команд, которая позволяет достигать поставленных целей через выполнение задач.
Язык программирования передаёт конкретные задачи, инструкции, которые нужно выполнить. Человек создаёт алгоритм для компьютера, а компьютер, в свою очередь, их выполняет. Вне зависимости от программного обеспечения. Язык программирования — это некоторое связующее звено для того, чтобы человек смог объяснить компьютеру, что нужно делать.
Языков программирования много, и чтобы поговорить обо всех, не хватит и серии статей. Сегодня мы остановимся на конкретном языке программирования — Lua: узнаем историю его создания, разберём плюсы и минусы, а ещё узнаем, где его применяют.
Стартуй в программировании прямо сейчас
Реши свою первую настоящую задачу на JavaScript и поделись крутым результатом с друзьями

История создания языка программирования Lua
Язык программирования Lua был создан в 1993 году членами группы технологий компьютерной графики, Tecgraf. Его создателями стали Роберто Иерусалимский, Луис Энрике де Фигейредо и Вальдемар Селессо.
Роберто Иерусалимский — бразильский ученый с докторской степенью в области компьютерных наук, приглашенный профессор в Стэнфордском университете в 2012 году и ведущий автор программирования на Lua.
Из-за политической позиции Бразилии члены общества не могли свободно пользоваться специальным программным обеспечением, прибывшим из других стран. Такое положение вынудило Tecgraf придумывать новые инструменты с самого начала.
Многие предшественники языка Lua не подходили по разным параметрам. Какой-то язык имел сложный, непривычный синтаксис, другой подходил только для определённых платформ, третий имел слабую поддержку описания данных. Тогда было принято решение создать собственный язык с незамысловатым синтаксисом и семантикой, который можно будет легко портировать на разное программное обеспечение.
Портирование — это процесс, при котором программу адаптируют для работы в другой среде так, чтобы она сохранила свои функции.
Далее узнаем, какие задачи стало решать проще с языком программирования Lua, а с какими трудностями пришлось столкнуться — обсудим преимущества и недостатки Lua в современном варианте.
Выберите идеального наставника по программированию
15 000+ проверенных преподавателей со средним рейтингом 4,8. Учтём ваш график и цель обучения

Достоинства языка Lua
Несмотря на свой возраст, Lua всё ещё популярен у программистов. В том числе благодаря многочисленным обновлениям, которые разработчики до сих пор выпускают и тем самым исправляют ошибки прошлых версий. Но это лишь одно из массы преимуществ Lua. Теперь рассмотрим остальные.
- Портируемость. Как мы уже писали, при разработке языка создатели ориентировались на то, чтобы его можно было легко портировать на множество платформ. И у них это отлично получилось. Портировать программу, написанную на Lua, можно на разное программное обеспечение и с полным сохранением функционала. То есть, Lua — легко интерпретируемый язык на различные операционные системы.
- Интегрирование с C/С++. Такая интеграция позволяет минимизировать недостатки C/C++ и приумножить их преимущества. Lua представляет собой продукт, который нейтрализует минусы C: низкую степень независимости от аппаратного обеспечения, отсутствие качественных динамических структур, слабую, сложную работу тестирования и отладки. Но при этом сохраняет главные преимущества C: высокое быстродействие, взаимодействие с различным программным обеспечением и низкоуровневые операции.
- Простота синтаксиса. Создавая этот язык, разработчики ориентировались на рядового пользователя, который сможет без особых проблем разобраться в синтаксисе и начать создавать программы. Знаний английского будет достаточно для того, чтобы примерно понять, для чего нужны элементы кода.
- Скорость. Lua нельзя назвать чрезмерно быстрым, но интеграция с С позволяет в некоторых тестах обгонять другие скриптовые языки программирования.
- Информация. Разработчики внимательно относятся к пользователям, которые кодят на Lua, поэтому на его официальном сайте можно найти ответы на популярные вопросы. А если не удастся, вам поможет развитое сообщество разработчиков.
- Библиотеки и их добавление. В Lua есть много библиотек, которые позволяют решать большинство задач пользователя. Но если и этого вам мало, можно добавлять свои библиотеки. Более того, они могут быть написаны на языке C, то есть знание языка C позволит расширить функционал Lua и уже полностью использовать его преимущества. Иными словами, Lua — расширяемый язык программирования: мы можем изменять семантику, чтобы создавать программы было проще.
Недостатки языка Lua
Конечно, как и любой язык программирования, Lua имеет свои недостатки. Но в этом случае их сравнительно меньше.
- Lua зависим от других языков. Это небольшой язык, поэтому он во многом зависит от того языка, вместе с которым используется. Например, с C или C++.
- Необходимо знать дополнительные языки, чтобы лучше ориентироваться в синтаксисе. Исходники Lua написаны на С. А значит, без опыта работы с языком C будет сложнее разобраться в Lua.
- Lua — небольшой язык. Работать с глобальными проектами на Lua достаточно затруднительно. Этот язык больше подходит для создания небольших проектов.
- Стиль программирования отличается от привычного. У Lua есть свои особенности, непривычные рядовому программисту. Например, нумерация таблиц начинается не с 0, как это принято в большинстве языков, а с 1.
Нельзя сказать, что эти недостатки незначительны, но преимущества их явно перевешивают. В зависимости от ваших задач, Lua может стать хорошим помощником в работе с ними.
В каких программах используют Lua
Может быть, язык Lua не так распространён, но есть много различных программ, где он используется. Например, он нужен, чтобы создавать игры, работать в графических программах, разрабатывать приложения.
К случаям частого использования Lua можно отнести моды в Minecraft и программу Roblox Studio, где этот язык помогает разрабатывать различные проекты. Например, в Майнкрафт благодаря модификациям ComputerCraft и ComputerCraftEdu добавляют специального робота, которого мы можем запрограммировать. Такой робот может многое делать по алгоритмам: копать шахту, строить дом, уничтожать монстров или строить големов. Мы сможем даже поиграть с нашим роботом в игру «Камень, ножницы, бумага»! И всё это благодаря языку программирования Lua.

Более того, этот мод добавляет специальные функции для взаимодействия с миром Майнкрафта. Интересно, что сначала можно запрограммировать робота с помощью блоков, а затем посмотреть, как это будет выглядеть на языке Lua.

Lua в Roblox Studio
Если эти модификации в Майнкрафт выполняют скорее ознакомительную функцию и позволяют поближе узнать язык Lua, то в случае с Roblox Studio всё работает по-другому. Благодаря этому языку здесь можно создавать полноценные плейсы, в которые будут играть тысячи игроков!
Что такое Roblox Studio
Roblox — это популярная платформа, где можно играть, общаться, создавать и публиковать свои проекты в разных жанрах. Казалось бы, что может быть лучше для детей и подростков? Но даже на этом Roblox не останавливается. Здесь действительно уникальна каждая игра, ведь их создают сами пользователи.
Разработчики Roblox предлагают специальный движок для создания игр — Roblox Studio, который подходит под любое программное обеспечение. Все проекты, которые создают на этом движке, можно будет опубликовать в самом Roblox, и тогда десятки тысяч игроков смогут оценить ваш проект. А в разработке вам поможет язык программирования Lua. Именно он позволит написать скрипты, чтобы создать ловушки, или, например, запрограммировать машину в игре.
Скрипт — набор строк кода, которые выполняют конкретную задачу
