Войти
ПрограммированиеФорумОбщее

Как лучше прикрутить Lua к Unity

#0
12:22, 11 апр. 2014

Привет всем!

Есть желание - иметь бизнес-логику для каждого GameObject'а из Unity на Lua. Кто-нибудь делал?
Как лучше - создавать для каждого MonoBehaviour - виртуальную машину и проксировать вызовы (Update/LateUpdate/FixedUpdate) в Lua? Или лучше иметь одну LuaVM, писать там компонентную систему, и создавать GameObject'ы для рендера и физики?

Апдейт:

Проблема - поддержка модов в игре. Т.е. вся логика - создание мира, управление персонажем, загрузка текстур - должна быть в юзерспейсе, а не вкомпилирована в бинарник. Соответственно подключить Lua проблем нет, вопрос скорее архитектуры, варианта два:

1) Создаем виртуальную Lua машину на каждый объект, и все просто. Проблема в диком оверхеде, и просадках производительности при GC.Collect, создании объектов (загрузки скриптов).
2) Другой вариант?


#1
12:27, 11 апр. 2014

Скрипты для скриптов - это конечно оригинально, но лучше не тратить на это время.

#2
12:33, 11 апр. 2014

Не надо, там есть C# для этого.

#3
12:36, 11 апр. 2014

Прикрути лучше RoR, будет смешнее.

#4
12:46, 11 апр. 2014

Сарказм непонятен. Я на C# не смогу в рантайме писать, а на RoR неудобно :).

Если это Lua/Another-Scripting-Language, то бизнес-логика лежит отдельно от игры и загружается по мере. Решает проблему модов в частности.

#5
12:50, 11 апр. 2014

Вот здесь как раз статейка есть на тему http://habrahabr.ru/post/211576/

#6
12:52, 11 апр. 2014

Гугл по запросу LuaSharp много чего выдает, дерзай.

#7
12:58, 11 апр. 2014

spdd: Там статья, как прикрутить 1-10-100 скриптов. У меня же немного другое, скорее вопрос архитектуры. Апдейтнул пост.

#8
13:01, 11 апр. 2014

gms: Спасибо, но проблема скорее архитектурная, а не "как прикрутить Lua к шарпу".

#9
14:06, 11 апр. 2014

Если найдёте способ - напишете?
Алсо, если почитать камменты к статье на хабре, то там они рассказывают, как наши игроделы прикручивают C# к C# (минус - не работает в веб-плеере): http://www.unity3d.ru/distribution/viewtopic.php?f=18&t=6536#p52430

А писать в рантайме на C# в игре самом деле можно, вот пример: https://github.com/keyword/CSharp-Interpreter-for-Unity-3D
Но там каждый вызов интерпретатора - это отдельная сборка (т.е. лаги при загрузки и неограниченная утечка памяти), так что пример, скорее, академический.

#10
14:28, 11 апр. 2014

Skyblade:

Хорошо, отпишусь, если получится, пока пробую сделать как в посте вариант (1), просто с кучей оптимизаций.

Про CS-Script читал, но как-то сразу не стал смотреть, т.к. он менее популярен чем Lua, соответственно с позиции модов, второй предпочтительней.

Хотя сейчас прошел по вашей ссылке, похоже с ним таких проблем не будет, буду проверять.

Спасибо за ответ.

#11
16:25, 20 июня 2014

> Если найдёте способ - напишете?

В Lua реализована компонентная система, с интерфейсами - http://pastebin.com/8mYwnTHK
В Unity - запускается одна вм, и скрипт в ней, который создает выше указанные Entities
Уже в них, создаются или загружаются из бандлов GameObject'ы и на них сразу навешивается LuaMapper (компонент в юнити, который проксирует все вызовы FixedUpdate/Update/Awake/.. в родительскую Entity)

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

Подводные камни:

Очень медленно и дорого по памяти (и по сборке) использовать шарповые структуры, поэтому векторы, и прочая математика реализована в LUA
Из верхнего пункта, и в целом следует - кэширование всех функций, или, если они требуют плотной работы с движком - вынесение в утилитные классы, что-то вроде RaycastUtils.ScanMouse(),  и т.п.
Выключение LuaMapper'а и остального, для всех невидимых объектов (OnBecameInvisible), у нас с таймаутом.

Если все аккуратно сделать, оверхеда по производительности и памяти немного (у нас over 20k gameobject'ов на сцене), зато вся игровая логика (генерация, аи, управление, вообще все) идет в userspace. Соответственно моды - просто написание новых луа скриптов, и если нужно бандлов с модельками.

ПрограммированиеФорумОбщее

Тема в архиве.