Привет всем!
Есть желание - иметь бизнес-логику для каждого GameObject'а из Unity на Lua. Кто-нибудь делал?
Как лучше - создавать для каждого MonoBehaviour - виртуальную машину и проксировать вызовы (Update/LateUpdate/FixedUpdate) в Lua? Или лучше иметь одну LuaVM, писать там компонентную систему, и создавать GameObject'ы для рендера и физики?
Апдейт:
Проблема - поддержка модов в игре. Т.е. вся логика - создание мира, управление персонажем, загрузка текстур - должна быть в юзерспейсе, а не вкомпилирована в бинарник. Соответственно подключить Lua проблем нет, вопрос скорее архитектуры, варианта два:
1) Создаем виртуальную Lua машину на каждый объект, и все просто. Проблема в диком оверхеде, и просадках производительности при GC.Collect, создании объектов (загрузки скриптов).
2) Другой вариант?
Скрипты для скриптов - это конечно оригинально, но лучше не тратить на это время.
Не надо, там есть C# для этого.
Прикрути лучше RoR, будет смешнее.
Сарказм непонятен. Я на C# не смогу в рантайме писать, а на RoR неудобно :).
Если это Lua/Another-Scripting-Language, то бизнес-логика лежит отдельно от игры и загружается по мере. Решает проблему модов в частности.
Вот здесь как раз статейка есть на тему http://habrahabr.ru/post/211576/
Гугл по запросу LuaSharp много чего выдает, дерзай.
spdd: Там статья, как прикрутить 1-10-100 скриптов. У меня же немного другое, скорее вопрос архитектуры. Апдейтнул пост.
gms: Спасибо, но проблема скорее архитектурная, а не "как прикрутить Lua к шарпу".
Если найдёте способ - напишете?
Алсо, если почитать камменты к статье на хабре, то там они рассказывают, как наши игроделы прикручивают C# к C# (минус - не работает в веб-плеере): http://www.unity3d.ru/distribution/viewtopic.php?f=18&t=6536#p52430
А писать в рантайме на C# в игре самом деле можно, вот пример: https://github.com/keyword/CSharp-Interpreter-for-Unity-3D
Но там каждый вызов интерпретатора - это отдельная сборка (т.е. лаги при загрузки и неограниченная утечка памяти), так что пример, скорее, академический.
Skyblade:
Хорошо, отпишусь, если получится, пока пробую сделать как в посте вариант (1), просто с кучей оптимизаций.
Про CS-Script читал, но как-то сразу не стал смотреть, т.к. он менее популярен чем Lua, соответственно с позиции модов, второй предпочтительней.
Хотя сейчас прошел по вашей ссылке, похоже с ним таких проблем не будет, буду проверять.
Спасибо за ответ.
> Если найдёте способ - напишете?
В Lua реализована компонентная система, с интерфейсами - http://pastebin.com/8mYwnTHK
В Unity - запускается одна вм, и скрипт в ней, который создает выше указанные Entities
Уже в них, создаются или загружаются из бандлов GameObject'ы и на них сразу навешивается LuaMapper (компонент в юнити, который проксирует все вызовы FixedUpdate/Update/Awake/.. в родительскую Entity)
Таким образом получается вся физика, апдейт цикл, рендер и прочее идет в юнити, а вся логика в LUA.
Подводные камни:
Очень медленно и дорого по памяти (и по сборке) использовать шарповые структуры, поэтому векторы, и прочая математика реализована в LUA
Из верхнего пункта, и в целом следует - кэширование всех функций, или, если они требуют плотной работы с движком - вынесение в утилитные классы, что-то вроде RaycastUtils.ScanMouse(), и т.п.
Выключение LuaMapper'а и остального, для всех невидимых объектов (OnBecameInvisible), у нас с таймаутом.
Если все аккуратно сделать, оверхеда по производительности и памяти немного (у нас over 20k gameobject'ов на сцене), зато вся игровая логика (генерация, аи, управление, вообще все) идет в userspace. Соответственно моды - просто написание новых луа скриптов, и если нужно бандлов с модельками.
Тема в архиве.