Я работаю над сценарием Lua в игре, чтобы пользователи могли писать собственный сценарий Lua и загружать его.
Я уже сделал с реализацией и функциями
L = luaL_newstate()
luaL_openlibs()
lua_register(L, cFunction, "luaFunction")
lua_register(L, cFunction2, "luaFunction2")
lua_register(L, cFunctionN, "luaFunctionN")
Что я сейчас пытаюсь? Возможность выполнить / убить скрипт при нажатии кнопки, рисунок ниже для большей ясности: https://i.stack.imgur.com/eJQzg.png
Все скрипты из скрипта должны иметь доступ к Lib.lua, поэтому я делаю:
luaL_loadfile(L, "Lib.lua")
lua_pcall(L, 0, 0, 0)
Затем, чтобы загрузить скрипт, я мог бы использовать то же самое, и все в порядке, пока пользователь не захочет убить / выгрузить скрипт.
luaL_loadfile(L, "script.lua")
lua_pcall(L, 0, 0, 0)
Я копаюсь во многих темах о Lua API, и в настоящее время нет хорошего ответа на эту проблему.
Люди говорят о lua_newthread, который я уже пытался реализовать, но безуспешно.
T = lua_newthread(L)
luaL_loadfile(L, "script.lua")
lua_pcall(L, 0, 0, 0)
Return >> Attempt to call a nill value. Look like new thread has no access to Lib.lua
Также есть другая проблема, когда я регистрирую функцию, которую я использую:
lua_register(L, cFunction, "luaFunction")
Тогда даже я могу создать функции потока из luaL_newstate * L, необходимые для передачи дескриптора L для работы, в то время как дескриптор потока равен T.
Пример перехода C-функции в lua:
static int add (lua_State *L) {
double a = lua_tonumber(L, -1); /* get argument 1 */
double b = lua_tonumber(L, -2); /* get argument 2 */
lua_pushnumber(L, a+b); /* push result */
return 1; /* number of results */
}
Любой король России ценится.
С уважением, Ascer





nvm решил это :) Я создал один luaL_state для каждого скрипта и зарегистрировал все функции, а затем создал массив для хранения всего реестра. Чтобы закрыть, просто используйте lua_close (scriptHandle)