私は自分の C++ ゲーム エンジンに Lua スクリプト エンジンを実装しています。多くのシーン ノードがあり、それぞれに独自のスクリプトを割り当てることができます。その特定のスクリプトのすべてのフレームでlauL_dofile(...)を呼び出すことは実行可能なオプションですか、それともより良い方法がありますか? たとえば、既に解析されたスクリプトを保存する方法はありますか? luaL_loadfileとlua_pcallを見ていました。最初のスクリプトでスクリプトをロードし、必要に応じて 2 番目のスクリプトで呼び出すと思っていましたが、lua_pcall はパラメーターとして一意の ID を持っていないようです。実行するスクリプトをどのように知る必要がありますか?
2 に答える
Lua API を使用する場合は、Lua スタックに慣れる必要があります。そして、学習できる最も重要なことの 1 つは、Lua API ドキュメントの読み方を理解することです。すべての関数について、それがスタックにどのように影響するか (スタックを変更する場合) について、右側に表記があります。
luaL_loadfile
ファイルをロードし、そのファイルを Lua 関数としてスタックにプッシュします。lua_pcall
スタック上で関数を実行します。しかし、それがどのように機能するかについて、いくつかの注意点があります。
Lua を介して関数を呼び出す方法は、スタックに関しては単純です。呼び出したい関数をプッシュします。次に、最初から最後まで、すべての引数を順番にプッシュします。次に、その関数の呼び出しを発行します。lua_pcall
このように動作します。これは、実行する関数の位置が常に nargs + 1
、スタックの一番上からの相対位置であることを意味します。ここで、nargs
は関数に渡す引数の数です。
スタックから関数を(すべての引数と共に)ポップするlua_pcall
ことに注意してください。ファイルをロードしたばかりの場合、これがLua のその関数への唯一の参照になります。したがって、ファイルを再度実行することはできません。引数をスタックにプッシュする前に、 を使用して関数をコピーする必要があります。値が保持されるように、おそらくテーブルなどに貼り付ける必要があります。lua_pushvalue
LUA_REGISTRYINDEX
私がコメントしたように、通常はluaL_loadfile
初期化時に呼び出します。ロードされたファイルは通常、Lua 関数としていくつかの [グローバル] 名を定義します (またはグローバル テーブルのいくつかのスロットを埋めます)。lua 5.2のドキュメントには、lua_call
それらの 1 つを呼び出す方法の例 (§4 ) が示されています。Lua スタックに適切なものをプッシュすることにより、アプリケーションの適切な場所でそのような呼び出し (おそらくlua_pcall
またはを使用) を行います。lua_call