Bitfighterでロボット プレイヤーの Lua スクリプトを処理する方法の改善に取り組んでいます。現在、各ロボットは独自の L インスタンスを取得しており、環境テーブルを交換することで、すべてのロボットが 1 つを共有できるようにしようとしています。ボットは完全に異なるスクリプトである可能性があることに注意してください。
このメソッドは Lua 5.2 で非推奨になっていることは認識していますが、現在はまだ Lua 5.1 を使用している lua-vec を使用しています。ゲームは C++ で書かれています。
そう...
最初に環境を作成し、それを呼び出します:
// Create a table with room for 0 array and 1 non-array elements
lua_createtable(L, 0, 1); // -- tab
// Set the globals table to handle any requests that the
// script's environment can't
lua_pushstring(L, "__index"); // -- tab, "__index"
lua_pushvalue(L, LUA_GLOBALSINDEX); // -- tab, "__index", _G
// Set table["__index"] = _G, pops top two items from stack
lua_settable(L, -3); // -- tab
// Store the new table in the retistry for future use
lua_setfield(L, LUA_REGISTRYINDEX, name); // -- <<empty stack>>
その後、いくつかの Lua コードをロードし、環境テーブルを呼び出します。
luaL_loadfile(L, "luascripts.lua");
lua_getfield(L, LUA_REGISTRYINDEX, name); // -- function, table
lua_setfenv(L, -2); // -- function
次に、ロードされたコードを実行します。
lua_pcall(L, 0, 0, 0);
読み込まれた Lua が印刷などの基本的な機能を使用しようとすると、次のエラーで失敗します。
attempt to call global 'print' (a nil value)
ただし、スクリプトは次のことを実行できます。
__index["print"](12)
では、なぜ印刷に直接アクセスできないのでしょうか。何が欠けていますか?または、同じ Lua インスタンスで複数のスクリプトを実行する根本的に優れた方法はありますか?