2

私は現在ゲーム プロジェクトに参加しており、Lua をゲーム エンジンに統合して、ゲーム オブジェクトとコンポーネントのインターフェイスをスクリプト ユーザーに公開する必要があります。

C++ クラス オブジェクトを Lua にバインドする方法を調査しようとしましたが、ほとんどのドキュメントで userdata 型を使用してバインドする方法が説明されていることがわかりました。

しかし、私たちのプロジェクトは自分たちでゲーム オブジェクトを管理しています (つまり、いつゲーム オブジェクトを削除したり、作成したりするかを決定します)、Lua のガベージ コレクションを無効にできないかどうか。具体的には__gc、メタテーブルを nil または何もしない関数に置き換えてみることはできますか?

私の代償は、ライトユーザーデータ(このポインター)と「このポインター」を取得してメンバー関数を手動で呼び出す静的関数を含むテーブルを使用することでした。ただし、プログラマーがラッパーの静的関数を手動で作成する必要があるため、すぐに汚れて管理が難しくなります。

適切な使用法や同様の問題に対する解決策に関する優れたドキュメントへのリンクを入手できますか?

4

2 に答える 2

3

ゲーム オブジェクトがゲーム エンジンによって管理されている場合は、Lua のユーザーデータ オブジェクトをゲーム オブジェクトへの単純なポインターにします。そうすれば、Lua の GC はそれらのみを収集し、実際のオブジェクトは収集しません。

また、オブジェクトの有効期間を Lua と C++ の両方で管理したい場合は、たとえばstd::shared_ptrオブジェクトに s を使用し、Lua ユーザーデータにもそのようなスマート ポインターを保持させることができます。これにより、両方の世界が同じ参照カウンターで動作します。 Lua が管理するポインターの場合、追加の「何か」が行われている場合でも。

于 2013-10-15T18:35:42.500 に答える
0

LuaBridgeのドキュメントは、あなたの問題を解決する方法を同時に説明し、すぐに使えるソリューションである LuaBridge を提供します。自分で巻く必要はありません。他にも考慮できるバインディング ライブラリがいくつかあります。

于 2013-10-18T19:02:12.797 に答える