対象GKEntity /コンポーネントの更新サイクルのベストプラクティス
私の質問は、更新サイクルの部門うとしたときのほとんどは、被写体に典型的なパターンとの良好な慣行を尊重するために、Appleのフレームワークを組み合わせますドキュメンテーションとサンプルコードはまだSwiftに適応していません(少なくとも私はどこでも見つけることができません)。
GameplayKitの更新サイクルを管理する方法はたくさんあるので、何が良い組み合わせであるかはわかりません。
要素
まず第一に:エンティティ/コンポーネント内のすべてのクラス(GKComponent
とGKEntity
(サブ)クラス)を使用すると、フレーム毎の更新を実行するためにオーバーライドすることができupdate()
方法があります。これは現在の更新サイクルであるGKScene
/SKScene
から来ている必要があります。
次に、GKComponentSystem
を使用して、追加された特定のタイプのすべてのコンポーネントのupdate()
メソッドを呼び出すことができます。私はポイントを見て、それは非常に便利です。
しかし、私はまた、ステートマシンシステムを使いたいと思っていますし、それも独自のアップデートサイクルを持っています。
私の状況私は初期化時に作成されたGKStateMachine
のインスタンスでGKEntity
のサブクラスを持っている場合は
。ステートマシンは一瞬のために、いくつかの状態を(持っている:「スポーン」、「ノーマル」、「気絶」と「死」今
、私は大きな「クッキーカッター」を作成していますGKEntity
サブクラスを使用して、初期化時に使用するすべてのコンポーネントを作成します。すべてのエンティティのコンポーネントをループして、関連するGKComponentSystems
に追加します。シングルトンにはupdate()メソッドがあり、更新によってコールがGKComponentSystems
に渡されます。 nts私はフレームごとの更新が必要ないので、それらのためにはGKComponentSystem
が作成されていないので、必要に応じて手動で更新します。私はそれはだかどうかを確認、エンティティのステートマシンにアクセスする必要があるので、私は、私は一度にすべてを作成し、コンポーネントを更新するためにGKComponentSystems
を使用するので、私のコンポーネントの更新方法はguard
とif-let
文がロードされ、私のエンティティに戻ってくる場合
エンティティが移動して正常状態になり、そのことを実行したり、機能をエスケープできる状態。これは私の見解では効率的ではありません。移動コンポーネントは、それが産卵、気絶、または死にそうになったときに更新する必要はありません。
私の更新メソッドが空であるため、私はGKStateMachine
を完全に過剰使用しています。コンポーネントは、とにかくGKComponentSystem
によって更新されます。
私のアイデア
は(多分必要であれば、いくつかの点で異なるコレクションでそれらを並べ替え)とその
update()
メソッドを呼び出すすべての私のエンティティによるGKComponentSystems
完全かつ簡単にループをドロップします。ステートマシンにアップデートを送り、ステートマシンはそのステートに関係するコンポーネントを更新します。GKComponentSystems
のままにしておき、ノーマル状態に入るときと終了するときにコンポーネントシステムからMovementComponent
を追加したり削除したりするなどして、状態マシンを使用してコンポーネントを操作してください。
オプション1は簡単ですが、私の構造は、いくつかのコンポーネントが他の人の前に更新する必要がある可能性があり、より複雑なbecasueを取得するときに長期的に問題を引き起こす可能性があります。各エンティティが独自のコンポーネントを更新すると、更新プロセスが分散されます。
オプション2でも混乱を招くことがありますが、私の最大の関心事はコンポーネントの作成/削除です。私はそれらをGKComponentSystems
から取り出すだけですか、それとも完全にエンティティから取り除くのですか?それを行う最も効率的な方法は何ですか?
私のオプションの一つは最高だろう実際の質問
?それを行うためのより良い方法があります。
これは、SpriteKitとGameplayKitに関心がない5人のユーザーによって閉鎖されているSO.travestyです。この質問は、GameplayKitを使用しなくても、SpriteKitの使用に関する考慮事項に固有です。組み合わされて、これはFIRSTであり、その後の設計/アーキテクチャに関する質問は使用中に実行されています。 MarkBrownswordのような人たちと、客観的な概観だけでなく、具体的で正確で目標に合った勧告を提供するために、経験とニュアンスのある理解を持つ人々がいます。それは意見ではありません。彼らは専門家です。誰もこの質問に答えることができませんでした。 – Confused
したがって、これを終わらせるために投票したこれらの人々に直接迷惑をかけて、あなた自身を正当化してください。他には証明されていない限り、あなたは専門家ではない。 ECS、ゲームループ、ステートマシンの深く深い理解を実証できますか? SpriteKitとGameplayKitであなたの「ボード上で走っていますか?」あなたが5人がこの質問の適切性と特異性を理解していないということは、他の人がそうでないことを意味するものではありません。私はこの質問に答える洞察と知恵を持っていませんが、少なくとも固有の目的とそれに答えるために必要なものを理解しています...専門家。クロージャの推論をミュートします。 – Confused
@Confused:ありがとう。私は感謝します。 – BadgerBadger