コンポーネントベースのエンティティシステムAPIの命名の問題


7

私のエンジンはコンポーネントベースのエンティティシステムを内部で使用しており、スクリプト用にLuaにバインドしたいと考えています。

今、私はそれをタイピングするためのスクリプトを書く人々を救いたいと思います。C ++では、エンティティの位置を設定するには、次のようにします。

pEntity->GetComponent< CPoint >()->SetPos( Vector( X, Y ) );

つまり、Lua 1:1にバインドする場合は、次のことも行う必要があります。

ent:GetComponent( CP_POINT ):SetPos( 123, 456 )

しかし、正直に言って、エンティティの位置を設定するためだけに多くの文字を入力しますか?

私はそうは思わない、それが私がLuaからコンポーネントシステムを「隠した」理由です。

今、あなたがしていることは

ent:SetPos( 123, 456 )

コンポーネントのものは内部的に処理されます。ent:AddComponentやent:RemoveComponentなどを使用して、Luaのコンポーネントを手動で追加および削除することもできます。

今、これも完璧ではないようです:

  • エンティティメタテーブルは、すべてのコンポーネントのすべての機能を実行する必要があるため、乱雑になります

  • ネーミングの問題:ent:SetJointMotorEnabled()やはりちょっと悪いようです

スクリプトの快適性を危険にさらすことなく、コンポーネント関数のより良い命名体系をどのように見つけることができるかについてのアイデアはありますか?


あなたには選択肢がないと思います。あなたはそれを明示的に(あなたの最初の方法)または暗黙的に(2番目の方法)行うことができますが、私はあなたが中間点を見つけるつもりはないでしょう。なんらかのent:"Point":SetPos(...)方法がない限り、これはほぼ最初の方法です。一般的なコンポーネントには2番目の方法を使用するのでしょうか?
共産主義者アヒル

gamedev.stackexchange.com/questions/12529/で用途が見つかるかもしれません私は、命名に関して、システムをできるだけ使いやすく、コンパクトにする方法を見つけようとしていました:)
共産主義ダック

回答:


11

プロジェクトにも同様の状況があり、LUAメタテーブルにコンポーネント(関数ではない)を保存することで問題を解決しました。基本的に、LUA側でエンティティ(または、それらを呼び出すときにゲームオブジェクト)を作成する場合、コードは次のようになります。

function createShip()
    ...

    self.transform = registerToComponent("transform")
    self.sprite = registerToComponent("sprite")

    ...
end

今、私たちは簡単に使うことができます

entity.transform:setPosition(5.2, 4.8)
entity.sprite:setTexture("ship.png")

位置(およびテクスチャ)を設定します。そして私たちはこれに完全に満足しています!

(そして、実際には、これは、entity:setPositionとentity:setTextureだけよりも優れていると思います。なぜなら、コンポーネントがたくさんある場合、結果のエンティティAPIは大きな混乱になるからです。)


4

ここでの基本的な問題は、コンポーネントシステムをAPIに公開したことです。インターフェイスの背後にあるものをカプセル化する必要があります。


0

私はしばらくLuaを操作していませんが、コンポーネント自体にLuaラッパーを介してエンティティインターフェイスを変更させないでください(ゲームでLuaを最後に使用したのは2005年でしたが、ラッパーはそれ以降進化しているはずです)。

コンポーネントレベルに配置することで、位置コンポーネントに、コンポーネントを直接呼び出すエンティティの「SetPos」関数を登録させ、JointMotorコンポーネントに「SetEnabled」関数を使用してエンティティのオブジェクトを登録させることができます。駆動」し、ent:SetPos(123、456)とent:JointMotor:SetEnabled()の両方をサポートしますか?

サブオブジェクトと関数の登録が名前の衝突がないことを検証する限り、問題はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.