PixPhys: Unity и Lua

PixPhys: Unity и Lua

Прошло больше месяца с моей первой статьи на DTF, а это значит, что можно написать ещё одну. Хочу сказать большое спасибо за то, что так тепло приняли мою предыдущую работу.

Проблема

В нашей инженерной песочнице PixPhys реализована система визуального программирования основанная на нодах (от англ. node — узел). Главной проблемой этой фичи является неудобность ориентирования в ней при большом количестве узлов.

Паутина из узлов.
Паутина из узлов.

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

Пути решения

Внутриигровой редактор кода Lua.
Внутриигровой редактор кода Lua.

Поскольку у нас в игре уже есть возможность создавать модификации с помощью C#, изначально была идея сделать функцию создать свои ноды на этой же основе, но если вы когда-то пытались реализовать Real-Time компиляцию в Unity, то вы знаете, что это танцы с бубнами. Вторая проблема использования C# — требование знаний об ООП, а всякие классы (Особенно школьные) ломают психику неокрепших умов.

Какие у нас есть альтернативы? На самом деле их не много, но мой взгляд упал на Lua. Почему он? А потому, что это полностью интерпретируемый язык, а это значит, что он не требует компиляции — то что нам нужно. Тем более, что целевая аудитория игры — игроки, которые скорее всего имеют в своей библиотеке такие игры как: Garry’s Mod, Stormworks — игры в которых уже используется Lua.

Земля стоит на слонах и черепахе

PixPhys: Unity и Lua

После того, как мы определились с ЯП (Язык программирования) нам надо подвязать его к Unity, но как это сделать?

Благо, что я не первый, кто решил использовать Lua поверх C# (А если учитывать, что Unity — это C++, то выходит, что мы используем Lua поверх C#, который лежит поверх C++, вам это не напоминает землю, которая стоит на слонах, которые стоят на черепахе?), а соответственно существуют уже библиотеки, которые делают всё за нас. Конкретно для PixPhys я взял MoonSharp, которая на первый взгляд выглядит достаточно громоздкой, но на деле ей вполне удобно пользоваться.

Пример программы на Lua, которая исполняется в C#:

string script = @" -- defines a factorial function function fact (n) if (n == 0) then return 1 else return n*fact(n - 1) end end return fact(5)"; DynValue res = Script.RunString(script); return res.Number;

Реализация в игре

Серверная стойка слева - <b>процессор</b>, а <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fru.wikipedia.org%2Fwiki%2FPong_%28%25D0%25B8%25D0%25B3%25D1%2580%25D0%25B0%29&postId=1398209" rel="nofollow noreferrer noopener" target="_blank">Pong</a> справа - <b>дисплей</b>.
Серверная стойка слева - процессор, а Pong справа - дисплей.

В игре представлено 2 варианта использования Lua:

  • Процессор
  • Дисплей

Разница в этих предметах лишь в том, что один используется только для обсчёта и имеет выход данных, а другой используется только для отрисовки, а соответственно не имеет выхода (Если не считать возможность пищать с помощью команды Beep).

Встроенная документация по Lua.
Встроенная документация по Lua.

Код для них можно писать во встроенном редакторе (фото было выше), а так же в Visual Studio Code. Понятно, что для каждого подобного девайса должно быть API и документация к нему.

Тут вы можете посмотреть результат ковыряния игроков.

Спасибо за прочтение <3. Планирую в ближайшее время написать статью о совместных бандлах в Steam, интересно будет почитать?

3232
9 комментариев

О, пополнение в blueprintsFromHell

3
Ответить

Было круто иметь возможность рисования графики в игровом мире, а не только на маленьком экране
С привязкой к камере можно свой HUD сделать :)

1
Ответить

А ведь не плохая идея, надо записать)

Ответить

мы используем Lua поверх C#, который лежит поверх C++Боже, какой ужас)
В свободное время тыкался в Retro Gadgets Demo, у них там тоже в качестве ЯП используется Lua. Ощущения от него странные, честно говоря.

1
Ответить

Полностью поддерживаю, что это ужас.
Так же данное решение оказалось достаточно медленным, что вызывало падение кадров с 200 до 40, по этому пришлось приделывать выполнение Lua в отдельном потоке. :(

Ответить

Возникли ли какие-нибудь сложности с выполнением в отдельном потоке?

Ответить

используйте luajit, в чем проблема?

Ответить