PixPhys: Unity и Lua
Прошло больше месяца с моей первой статьи на DTF, а это значит, что можно написать ещё одну. Хочу сказать большое спасибо за то, что так тепло приняли мою предыдущую работу.
Проблема
В нашей инженерной песочнице PixPhys реализована система визуального программирования основанная на нодах (от англ. node — узел). Главной проблемой этой фичи является неудобность ориентирования в ней при большом количестве узлов.
Так же ограничения нашей системы не дают нам возможность адекватно реализовать массивы, циклы, работу с графикой, по этому появилась потребность создать ноду, которую можно было бы самому запрограммировать.
Пути решения
Поскольку у нас в игре уже есть возможность создавать модификации с помощью C#, изначально была идея сделать функцию создать свои ноды на этой же основе, но если вы когда-то пытались реализовать Real-Time компиляцию в Unity, то вы знаете, что это танцы с бубнами. Вторая проблема использования C# — требование знаний об ООП, а всякие классы (Особенно школьные) ломают психику неокрепших умов.
Какие у нас есть альтернативы? На самом деле их не много, но мой взгляд упал на Lua. Почему он? А потому, что это полностью интерпретируемый язык, а это значит, что он не требует компиляции — то что нам нужно. Тем более, что целевая аудитория игры — игроки, которые скорее всего имеют в своей библиотеке такие игры как: Garry’s Mod, Stormworks — игры в которых уже используется Lua.
Земля стоит на слонах и черепахе
После того, как мы определились с ЯП (Язык программирования) нам надо подвязать его к Unity, но как это сделать?
Благо, что я не первый, кто решил использовать Lua поверх C# (А если учитывать, что Unity — это C++, то выходит, что мы используем Lua поверх C#, который лежит поверх C++, вам это не напоминает землю, которая стоит на слонах, которые стоят на черепахе?), а соответственно существуют уже библиотеки, которые делают всё за нас. Конкретно для PixPhys я взял MoonSharp, которая на первый взгляд выглядит достаточно громоздкой, но на деле ей вполне удобно пользоваться.
Пример программы на Lua, которая исполняется в C#:
Реализация в игре
В игре представлено 2 варианта использования Lua:
- Процессор
- Дисплей
Разница в этих предметах лишь в том, что один используется только для обсчёта и имеет выход данных, а другой используется только для отрисовки, а соответственно не имеет выхода (Если не считать возможность пищать с помощью команды Beep).
Код для них можно писать во встроенном редакторе (фото было выше), а так же в Visual Studio Code. Понятно, что для каждого подобного девайса должно быть API и документация к нему.
Спасибо за прочтение <3. Планирую в ближайшее время написать статью о совместных бандлах в Steam, интересно будет почитать?
О, пополнение в blueprintsFromHell
Было круто иметь возможность рисования графики в игровом мире, а не только на маленьком экране
С привязкой к камере можно свой HUD сделать :)
А ведь не плохая идея, надо записать)
мы используем Lua поверх C#, который лежит поверх C++Боже, какой ужас)
В свободное время тыкался в Retro Gadgets Demo, у них там тоже в качестве ЯП используется Lua. Ощущения от него странные, честно говоря.
Полностью поддерживаю, что это ужас.
Так же данное решение оказалось достаточно медленным, что вызывало падение кадров с 200 до 40, по этому пришлось приделывать выполнение Lua в отдельном потоке. :(
Возникли ли какие-нибудь сложности с выполнением в отдельном потоке?
используйте luajit, в чем проблема?