2017-01-15 5 views
3

対象GKEntity /コンポーネントの更新サイクルのベストプラクティス

私の質問は、更新サイクルの部門うとしたときのほとんどは、被写体に典型的なパターンとの良好な慣行を尊重するために、Appleのフレームワークを組み合わせますドキュメンテーションとサンプルコードはまだSwiftに適応していません(少なくとも私はどこでも見つけることができません)。

GameplayKitの更新サイクルを管理する方法はたくさんあるので、何が良い組み合わせであるかはわかりません。

要素

まず第一に:エンティティ/コンポーネント内のすべてのクラス(GKComponentGKEntity(サブ)クラス)を使用すると、フレーム毎の更新を実行するためにオーバーライドすることができupdate()方法があります。これは現在の更新サイクルであるGKScene/SKSceneから来ている必要があります。

次に、GKComponentSystemを使用して、追加された特定のタイプのすべてのコンポーネントのupdate()メソッドを呼び出すことができます。私はポイントを見て、それは非常に便利です。

しかし、私はまた、ステートマシンシステムを使いたいと思っていますし、それも独自のアップデートサイクルを持っています。

私の状況私は初期化時に作成されたGKStateMachineのインスタンスでGKEntityのサブクラスを持っている場合は

。ステートマシンは一瞬のために、いくつかの状態を(持っている:「スポーン」、「ノーマル」、「気絶」と「死」今State cycle

、私は大きな「クッキーカッター」を作成していますGKEntityサブクラスを使用して、初期化時に使用するすべてのコンポーネントを作成します。すべてのエンティティのコンポーネントをループして、関連するGKComponentSystemsに追加します。シングルトンにはupdate()メソッドがあり、更新によってコールがGKComponentSystemsに渡されます。 nts私はフレームごとの更新が必要ないので、それらのためにはGKComponentSystemが作成されていないので、必要に応じて手動で更新します。私はそれはだかどうかを確認、エンティティのステートマシンにアクセスする必要があるので、私は、私は一度にすべてを作成し、コンポーネントを更新するためにGKComponentSystemsを使用するので、私のコンポーネントの更新方法はguardif-let文がロードされ、私のエンティティに戻ってくる場合

エンティティが移動して正常状態になり、そのことを実行したり、機能をエスケープできる状態。これは私の見解では効率的ではありません。移動コンポーネントは、それが産卵、気絶、または死にそうになったときに更新する必要はありません。

私の更新メソッドが空であるため、私はGKStateMachineを完全に過剰使用しています。コンポーネントは、とにかくGKComponentSystemによって更新されます。

私のアイデア

  1. は(多分必要であれば、いくつかの点で異なるコレクションでそれらを並べ替え)とそのupdate()メソッドを呼び出すすべての私のエンティティによるGKComponentSystems完全かつ簡単にループをドロップします。ステートマシンにアップデートを送り、ステートマシンはそのステートに関係するコンポーネントを更新します。

  2. GKComponentSystemsのままにしておき、ノーマル状態に入るときと終了するときにコンポーネントシステムからMovementComponentを追加したり削除したりするなどして、状態マシンを使用してコンポーネントを操作してください。

オプション1は簡単ですが、私の構造は、いくつかのコンポーネントが他の人の前に更新する必要がある可能性があり、より複雑なbecasueを取得するときに長期的に問題を引き起こす可能性があります。各エンティティが独自のコンポーネントを更新すると、更新プロセスが分散されます。

オプション2でも混乱を招くことがありますが、私の最大の関心事はコンポーネントの作成/削除です。私はそれらをGKComponentSystemsから取り出すだけですか、それとも完全にエンティティから取り除くのですか?それを行う最も効率的な方法は何ですか?

私のオプションの一つは最高だろう実際の質問

?それを行うためのより良い方法があります。

+0

これは、SpriteKitとGameplayKitに関心がない5人のユーザーによって閉鎖されているSO.travestyです。この質問は、GameplayKitを使用しなくても、SpriteKitの使用に関する考慮事項に固有です。組み合わされて、これはFIRSTであり、その後の設計/アーキテクチャに関する質問は使用中に実行されています。 MarkBrownswordのような人たちと、客観的な概観だけでなく、具体的で正確で目標に合った勧告を提供するために、経験とニュアンスのある理解を持つ人々がいます。それは意見ではありません。彼らは専門家です。誰もこの質問に答えることができませんでした。 – Confused

+1

したがって、これを終わらせるために投票したこれらの人々に直接迷惑をかけて、あなた自身を正当化してください。他には証明されていない限り、あなたは専門家ではない。 ECS、ゲームループ、ステートマシンの深く深い理解を実証できますか? SpriteKitとGameplayKitであなたの「ボード上で走っていますか?」あなたが5人がこの質問の適切性と特異性を理解していないということは、他の人がそうでないことを意味するものではありません。私はこの質問に答える洞察と知恵を持っていませんが、少なくとも固有の目的とそれに答えるために必要なものを理解しています...専門家。クロージャの推論をミュートします。 – Confused

+0

@Confused:ありがとう。私は感謝します。 – BadgerBadger

答えて

1

GKComponentSystemを使用して更新を実行している場合、私はそれだけで行くつもりです。私は、コンポーネントが1フレームにつき1回だけ更新されるべきだと思う。

それはあなたがStateMachinesで何をする必要があるか、あなたの質問から明らかではないが、直接あなたのGKEntityまたはDemoBots IntelligenceComponentなどのGKComponent内に含まれるいずれかの彼らが関与していない理由はありません。

+0

質問の下にある私の暴言を見てください。GameplayKitを選択して使用するプロセスに、このような素晴らしい問題が関心のない人にはうんざりしていることに気をつけてください。 SOの "デザイン"の明確な虚構。 – Confused

+0

@お寄​​せいただきありがとうございます。うれしい私はそれを考えている唯一の人ではありません! –

+0

@ MarkBrownsword:もう一度見ても大丈夫なら質問を編集しました。私はDemoBotsを掘り下げ、アップルの参考文献に載っているパズルの部分をまとめて置くだけではなく、より良い画像を得ようとします。 – BadgerBadger

関連する問題