Lua と LuaJIT を自分のゲーム エンジンに非常に簡単に統合できることを試してみた結果、これこそが自分が使いたいスクリプト言語だと確信しました。AI、ユニットの説明、マップトリガーなどに使用したいと思います。(本当に可能な限り)。この質問は gamedev だけに適用されるものではありません。外部スクリプトをロードできるスクリプト可能なエディターまたはウィンドウ マネージャーを作成することを想像できます (適切な例: Python とパッケージ コントロールを使用した崇高なテキスト)。
しかし、ここで難問があります。LuaJIT FFIが提供するエンジンへのバインドの使いやすさには本当に感謝していますが、たとえばマップ作成者に FFI の自由な統治を提供したくありません。FFI を介した lua-to-c 呼び出しの驚異的な速度 (JITted の場合) も、私が本当に望んでいるものです。
理想的には、FFI を使用してエンジンにバインドする独自のラッパー Lua ファイルを作成し、マップの作成者や改造者が使用するための優れたモジュールをエクスポートします。これに代わる方法は、バニラの lua モジュールを作成することです。これは可能ですが、はるかに面倒で遅くなります。
明らかに自分で使用したいので、luajit をコンパイルするときに FFI を無効にすることはできませんが、FFI をスクリプトごとまたはモジュールごとに制限する方法がわかりません。明らかに、モジュールをロードする lua_State で FFI をアクティブにする必要があります (その後、ユーザーが変更したスクリプトのロードを開始できません)。それで、私は何をしますか?それは可能ですか?
編集:私の考えでは、理想的なワークフローは次のようになります。
- ルア状態を開く
- すべてのモジュールをロードします (luaL_openlibs())。FFI もプリロードされます。
- FFI を使用する .lua モジュールをロードします (これはエンジン バインディングです。信頼できるファイルであるため、FFI を使用できます)。
- ネイティブ モジュールと関数の選択を無効にします: os、ffi、... (これは欠落しているステップです)
- ユーザー提供のスクリプトを実行します (これらは信頼できないため、FFI にアクセスさせたくありません)
- オプション: 高速編集サイクルのために lua モジュールをリロードする方法を探します。これには、FFI およびその他のモジュールを再度有効にすることが含まれます。(これを行う方法もわかりません)
注: Mike Pall がいくつかのメールで既に指摘しているように、これがまだ完全ではない (または良いサンドボックスでさえない) ことは承知していますが、マップの作成者に FFI へのアクセスを許可したくありません。