2017-01-15 4 views
1

私はゲームエンティティシステムの周りを包み込み、GamePlayKitを使用しています。 私は次のシナリオに苦しんだ:GKEntityには、コンポーネントの機能にアクセスするためのプロパティまたはメソッドが必要ですか?

  • RenderComponentが私のエンティティを表示するSKSpriteNode参照GKComponentです。私はGKEntityから派生CharacterEntityを持って

(...、MapY、私の場合には、これはMapXなどのプロパティが含まれますように)

  • MetaDataComponentは、エンティティに関する情報の様々なビットを保持している別のコンポーネントです。

    エンティティを初期化するために、スプライトに使用するテクスチャの名前を渡します。これにより私はRenderComponentを作成することができます。

    MetaDataComponentを初期化するには3つのオプションがあり、そのうちの1つがベストプラクティスと考えられているのだろうか?私のコンポーネント内のすべてのプロパティのために

    • init()
    • にパラメータを追加
    • コンポーネントのプロパティを更新しますCharacterクラスのプロパティを公開します。
    • モデルオブジェクトをエンティティに渡し、それからコンポーネントを初期化します。

    私の考え:

    • 番号1:私のエンティティが持っているより多くのコンポーネント、私が得るより多くのparams ...これは本当に私の好みではありません。
    • 番号2:エンティティは「愚か」で、データは持ちません。それは純粋な形で、エンティティは単なる数字です。そこに小道具を加えることは間違っていると感じます。
    • 番号3:モデルオブジェクト内ののデータにデータが含まれているため、私にはMetaDataのようなモデルオブジェクトを持っていると気分が良くて冗長です。おそらく、コンポーネントのプロパティではなく、モデルオブジェクトをコンポーネントに格納させることがありますか?

    エンティティにRenderComponentがあると予想される場合、そのコンポーネントをクエリして使用できます。あるいは、エンティティ自体にメソッドを追加することができます。例えば、setRenderPositionのように、必要なコンポーネントの存在をチェックし、それを更新します。もう一度疑問があります、これを行う際にここに間違いがあるかどうかです。

  • +0

    優秀な質問です。これはAppleのゲームWIPの「忘れられた」フレームワークで、CAKeyFrameAnimationはAppleプラットフォームでの忘れられない手段のようなものです。 – Confused

    答えて

    1

    あなたは純粋なEntity Component Systemを探しているなら、デザインは、3つの部分から構成されています

    Entity:あなたが言うように、ちょうど数です。他に何もない。

    Component:これは単なるデータです。他に何もない。

    System:忘れた部分。これはロジックが座っている場所です。 GKComponentSystem<GKComponent>から継承して、SpriteKitで独自のシステムを作成することができます。

    このarticleとそのsupporting codeは、私に多くの理解を助けたECSです。 DemoBots exampleは、spriteKit指向の実装を調べるもう1つの方法です。

    SpriteKitはECSなどの独自の実装を備えているため、いくつかの妥協が必要です。ノードをレンダリングする必要があるので、SpriteComponentが必要な場合は、ノードをSpriteComponetに埋め込むか、何か他のことを行う必要があります.SpriteComponentを持たない方がよいでしょう。GKEntityから継承するVisualEntityを作成しました。私は、update実行ループに依存する動作を持つコンポーネントに焦点を当てることを好みます。

    エンティティのプロパティに関する質問に答えるには、アクセスする必要のあるコンポーネントのエンティティにクエリを実行できるため、必要ではないようです。

    guard let spriteComponent = entity?.component(ofType: SpriteComponent.self) else { 
        return 
    } 
    

    重要なことは、柔軟性があり、SpriteKitに適合し、作成している妥協点に気づくことです。

    +0

    Appleのデモを見ると、コンポーネントに機能があり、特定の順序でコンポーネントを更新するためにシステムが使用されています。私にとって、これは彼らのアプローチが伝統的または「純粋な」方法ではないことを意味します。同意しますか? ECSについての知識があれば、http://gamedev.stackexchange.com/questions/135259/how-to-add-the-concept-of-entities-and-components-into-an-isometricをご覧くださいタイルマップも? – Krumelur

    0

    考慮するオプションは、拡張子がGKEntityであることです。

    import SpriteKit 
    import GameplayKit 
    
    extension GKEntity { 
        var isSelected: Bool { 
         guard let component = self.component(ofType: SelectionComponent.self) else { 
          return false 
         } 
    
         return component.selectionLocation != nil 
        } 
    } 
    

    これにより、すべてのエンティティで機能が使用可能になります。

    if self.someEntity.isSelected { 
        // Handle 
    } 
    
    関連する問題