1 и 2 - это просто разные стороны одной медали, более или менее. Это просто вопрос, куда уходит объект. В типе 1 объект является явной частью сценария Lua. Это означает, что скрипт решает, как он хочет настроить свои объекты.
В типе 2 объектом является среда. Это все еще таблица Lua, но созданная для нее внешним кодом. Сценарий не может вырваться за пределы этого объекта, кроме как способами, которые допускает внешний код.
Для меня проще всего реализовать тип 1 с помощью Luabind . У меня был бы объект AI в виде класса C ++, из которого Lua могла бы получить производные. Запуск «основного сценария» для этого ИИ создаст экземпляр этого класса. Вы должны передать параметры скрипта, такие как имя объекта, которым он управляет, может быть, ссылка, которую он может использовать для управления им и т. Д.
Тип 2 довольно прост. Сначала вы создаете новую среду, создавая пустую таблицу и заполняя ее глобальными переменными, к которым у пользователя должен быть доступ. Это могут быть такие вещи, как разговор с игровым состоянием (поиск других объектов на сцене и т. Д.), Способы перемещения рассматриваемой сущности и т. Д. Существуют метатические приемы, которые вы можете использовать, чтобы сделать эти значения неизменными и постоянными, чтобы пользователь не мог изменить их позже.
Затем вы загружаете скрипт с помощью lua_loadstring
или lua_loadfile
. Это помещает функцию в стек Lua, которая представляет этот скрипт Lua. Затем вы применяете эту таблицу в качестве среды этой функции сценария с lua_setfenv
. Затем вы можете запустить этот скрипт, передавая любые переменные, которые вы пожелаете (имя объекта и т. Д.).