エンティティIDシステムを使用する利点は何ですか?


12

現在、Programming Game AI By Exampleという本を読んでいます。

この本では、ゲーム内の各エンティティに一意のID番号を割り当てることに言及しています。場合エンティティしばしばAのニーズコンタクトエンティティにBAが参照なるBを送信することによってBへのID番号をEntityDatabaseのクラス。このクラスはID番号を受け取り、エンティティへの参照を返します。

一部のエンティティのID番号は、一部のエンティティ(メインのゲームキャラクター)のIDを含むファイルから取得することもできます。

私の質問は次のとおりです。なぜこれを行うのでしょうか?参照を直接操作できないのはなぜですか?直接参照を取得するのは難しいですか?IDシステムの使用は一般的なアプローチですか?IDを使用しないゲームはありますか?

ゲーム開発は初めてです。エンティティIDシステムを使用する利点を説明してください。長所と短所。具体的な例は素晴らしいでしょう。ありがとう

回答:


18

参照は多くの状況でうまく機能します。ただし、参照がうまく機能しない3つの重要な状況があります。

  • ネットワーキング。エンティティの状態の同期に関する情報をネットワーク経由で送信する場合、参照は使用できません。何らかの方法でエンティティを識別する必要があるため、リモートマシンはあなたが話している相手を認識します。
  • 保存/読み込み中。ゲームの状態をディスクに保存するとき、オブジェクト参照はそれと一緒に行くことができません。つまり、状態を読み込むときに、参照によってターゲットにされたエンティティBを持つエンティティAは、誰をターゲットにするかを認識できなくなります。メモリの場所は異なり、オブジェクトは異なります。

  • メモリ管理。参照を格納する中心的な場所があるということは、エンティティを削除するときに、すべてのエンティティを調べて、参照を削除してメモリをクリーンアップする必要がないことを意味します。参照は必要な場合にのみ使用し、他のエンティティでは削除する必要があります。参照カウントを減らすと、最後にやり取りしたものまたは他のエンティティによってのみ参照されるゾンビエンティティがなくなります。これは、エンティティがまだ存在するかどうかをテストする標準化された方法で、null参照を回避するのにも役立ちます。


2
最後の段落は、独自の箇条書きにする必要があります(メモリ管理)。あるクラスが別のエンティティへの参照をしばらく必要とする場合がありますが、エンティティの参照は無効になる可能性があります(つまり、発射体のターゲットエンティティが死んだ)。IDによってエンティティを要求するときにNULLを返すことにより、各クラスは、エンティティ参照が無効になったときに(クラッシュするのではなく)正しいことを行う責任を負います。
LearnCocos2D

回答ありがとうございます。明確にする質問。一般的に:エンティティAがエンティティBへの参照を取得する必要がある場合(攻撃する、メッセージを送信する、衝突をチェックする、またはその他の理由で)-IDシステムを使用してそれを取得しますか、それとも参照を直接取得しても大丈夫ですか?意味:エンティティAは、エンティティBのID(エンティティ参照とID番号を相互参照する)を送信することで、常にEntityManagerから参照を取得し、EntityManagerからの参照を使用してエンティティBにのみコンタクトする必要がありますか?常にIDシステムを使用する必要がありますか?
テルアビブコーン

または、参照を直接取得しても大丈夫ですか?つまり、エンティティAはいつEntityManagerを使用してその内部に格納されている参照を取得する必要があり、エンティティAはどのような手段でBへの参照をフェッチできますか?
アビブコーン14

それに対する本当の正しい答えはありません。個人的には、ゲームロジックから独立したエンティティシステムを設計します。これは、ゲームロジックが直接エンティティ参照にアクセスすることさえできないことを意味します。基本的に、現在のメソッドのローカルスコープを超えてエンティティへの参照を維持することは避けます。つまり、エンティティのコンポーネントを操作する前に毎回EntityManagerを使用します。
マイケルハウス

そうですか。例を使用して、私があなたの意味を理解しているかどうかを確認しましょう。均一なグリッドを使用して衝突検出を行っているとしましょう。グリッドは2D配列です。各エンティティは、グリッド内の同じ「セル」内のエンティティとのみ衝突がチェックされます。「通常の」アプローチを使用すると、各セルは、それが表す領域内のGameEntityオブジェクトへの参照を保持します。「IDシステム」アプローチを使用すると、各セルはエンティティのID番号を保持します。これらの番号はEntityManagerに送信され、衝突検出を行うための具体的な参照を受け取ります。これは良い理解ですか?
アビブコーン14

2

最後の1つは、オブジェクトプールパターンを使用している場合、クリーチャーが死亡(たとえば)してどこかで再スポーンされたためにエンティティがリセットされた場合、参照は同じエンティティ(障害)を指し、IDは残りません有効。

ID 5067はアドレス0x8765クリーチャーがポイントし、別のスポーンが新しいクリーチャーIDを7073にリセットします。誰かがID 5067をチェックし、0x8765をポイントします。通知すると、到達しようとしたクリーチャーはアクティブではなくなります。

それとByte56が言及したすべての素晴らしい理由は、参照を直接使用しないようにするのが良い設計である理由です。

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