Webゲームのアイテムにコンポーネントベースのシステムを実装する方法


7

コンポーネントベースのシステムを使用してアイテムを定義することに関する他のいくつかの質問と回答を読んで、PHPで記述されたWebゲームのアイテムとスペルに使用したい。実装にこだわっています。

このシリーズで提案されているDBスキーマを使用します(パート5ではスキーマについて説明します)。
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/

これは、一般的なアイテムプロパティを持つアイテムテーブル、アイテムのすべてのコンポーネントをリストするテーブル、そして最後に、アイテムを構成するために使用される各コンポーネントテーブルのレコードがあることを意味します。

最初の2つを1つのクエリで一緒に選択できると仮定すると、各コンポーネントタイプに対してNクエリを実行します。クエリを実行する前に、データをmemcacheにキャッシュして最初にチェックできるので、これで問題ありません。memcacheから取得した場合でも、実装がリーンサイドである必要があるため、使用されるすべてのリクエストでアイテムを構築する必要があります。

しかし、アイテムのコンポーネントシステムを実装することに自信を持っているのは、まさにそのためです。使用する各コンポーネントから属性と動作をコンテナに取り込む必要があると思います。それを効果的に行う方法がわからないだけで、各コンポーネントを処理するための特別なコードを大量に作成することにはなりません。

たとえば、AttackComponentは、バトルコンテキスト内のターゲットをフィルタリングする方法を知る必要があり、攻撃動作を提供する必要がある場合もあります。同じアイテムにUsableComponentを含めることもできます。これにより、アイテムを使用し、同じバトルコンテキストから別の方法でフィルターした別のターゲットセットに何らかのエフェクトを適用できます。次に、アイテムのすべてのパーツがアクティブなパーツであるとは限りません。AttributeBonusComponentは、アイテムが装備された状態にあるとき、またはアイテムの詳細ページを表示するときにのみ起動する必要がある場合があります。

最終的に、アイテムを武器として使用するときにターゲットの正しいリストを取得できるように、すべてのコンポーネントをコンテナにまとめるにはどうすればよいですか?武器をアイテムとして使用できる時期を知っていますか?または、アイテムが提供するボーナスをキャラクターオブジェクトに適用するには?

うさぎの穴の奥まで行きすぎたような気がして、目の前の簡単な解決策がつかめません。(それがまったく意味をなさない場合)。

同様に、ここからベストアンサーを実装すると、同じ質問がたくさんあるように感じます。
リレーショナルデータベース内の使用可能な在庫/オブジェクト/アイテム(カタナなど)の複数の「用途」(たとえば武器)をモデル化する方法

回答:


4

リレーショナルモデリングを使用しているようです。別の方法があります:プロパティ/プロトタイプモデリング。SteveYeggeが彼の "究極の拡張可能" MMORPG、Wyvernを作成するために使用しました。基本的に、各ゲームオブジェクトは単一のblob(オブジェクトごとに1つのクエリのみ)として格納され、取得後にプロパティリストに解析されます。プロパティリストの柔軟性により、必要に応じて、さまざまなゲームオブジェクトにさまざまなプロパティセットを含めることができます。

Yeggeのユニバーサルデザインパターンは、プロパティ/プロトタイプモデリングについて深く掘り下げています。スティーブのブログ投稿は非常に長くなる傾向があるため、関連するセクションを紹介し、質問に関連するポイントを要約します。

  1. Wyvernはプロパティパターンの実装を使用しています。ゲームオブジェクトは基本的に任意のプロパティのバッグです。どのオブジェクトも他のオブジェクトのプロトタイプとして機能できるため、驚くほど自由な柔軟性が得られます。
  2. 永続的なプロパティリスト。プロパティリストのシリアル化と保存には、さまざまな方法があります。Wyvernはデータベースを使用して、「XMLシリアル化されたプロパティリストをtext / clob列に押し込み、クエリに必要な20または30フィールドを非正規化して独自の列に入れます」。
  3. プロパティリストのデータストアには、クエリを実行するメソッドが必要になりました。スティーブはいくつかの提案をします。単純なテキストベースのクエリは、階層データには適していません。XMLデータベースまたはJavaScript / JSON + jQueryがこの問題の答えになる場合があります。

1
あなたがblobを提案するとき、私はほとんど読書を止めて、あなたの答えがMongoDBまたは他のいくつかのNoSQLソリューションを提案するつもりであると思った。代わりに、コンポーネントとは異なる方向を提供します。確かに、このアプローチはNoSQLでより効果的に機能する可能性がありますが、ここでは単に「NoSQLを使用する」という答えだけではありません。
Landstander

4

コンテナーにフックシステム(イベントが発生したときに、指定可能な関数へのコールバックをオブジェクトに追加したり、オブジェクトから削除したりできるメカニズム)を実装し、コンポーネントを追加すると適切なフックを設定し、削除するとそれらを破棄します。たとえば、AttributeBonusComponentはボーナスを追加および削除するためにatEquipatUnequipフックを使用し、AttackComponentは値pollForTargetspollForAttackBehaviorsフックを提供し、UsableComponentはと通信しpollForUseBehaviorsます。

したがって、コンテナは、要求できる情報の種類とそれがどのように相互作用することができるかについての抽象的な理解しか持たず、コンポーネントはそれらとのインターフェース方法を定義する責任があります。


2

この種のエンティティシステムの要点を見逃しているようです。「毎回すべてのコンポーネントをロードする」場合は、ほとんどメリットがありません。

特定のクラスの操作(たとえば、「攻撃の解決」)に必要なすべてのデータが単一のコンポーネントにバンドルされるように設定する必要があります。

基本的に、ゲームの一部のメインコードを記述し、主要な特殊なケースを完了し、そのコードの最初から最後まで必要なデータを指定する必要があることを想像してください。これは1つのコンポーネントです(一部のパーツが後で他のコードによって(再)使用されるために必要な場合にのみ、それをより小さなコンポーネントに分割できます)。

次に、特別なケースがある場合は、メインコンポーネントを編集するか(通常:しないでください)、既存のすべてのエンティティが機能し続け、既存のすべてのコードが変更されずに機能し続けるようにする追加のコンポーネントを発明します。


コンポーネントシステムを理解するふりはしません。私の混乱の一部は、ステートレス環境でそれを使用しようとすることであり、私はまだ、物理学、レンダリング、および記事でしばしば言及される入力コンポーネントの間の関係を考えたり構築したりして、フレームワークまたはスクリプトの一部にしています。
ランドスタンダー、2011

1

最適化のルールを覚えておいてください

  1. しないでください。
  2. まだしないでください(専門家のみ)。

たとえば、AttackComponentは、バトルコンテキスト内のターゲットをフィルタリングする方法を知る必要があり、攻撃動作を提供する必要がある場合もあります。同じアイテムにUsableComponentを含めることもできます。これにより、アイテムを使用し、同じバトルコンテキストから別の方法でフィルターした別のターゲットセットに何らかのエフェクトを適用できます。次に、アイテムのすべてのパーツがアクティブなパーツであるとは限りません。AttributeBonusComponentは、アイテムが装備された状態にあるとき、またはアイテムの詳細ページを表示するときにのみ起動する必要がある場合があります。

1つを除くすべてのコンポーネントが未使用になった場合でも、すべてのコンポーネント(AttackComponent、UsableComponent、AttributeBonusComponent)をロードすると、本当に問題がありますか?


もっとはっきりしていたはずです。アイテムが必要になるたびにすべてのコンポーネントをロードするつもりです。属性修飾子は、一部のデータが与えられたときにアイテムがターゲットのリストを返すようにするのではなく、アイテムが装備されているときにいくつかの数値を適用するだけのアクティブなパーツではありません。もちろん、私はそれもすべて間違っていると考えているかもしれません。
Landstander

1

「うさぎの穴まで行きすぎたような気がする」

はい、正確に。コンポーネントベースのシステムはまだ「流行」段階にあり、それらをどのように使用するのが最善かについての合意はありません。知識が豊富で有能な人々が、それらの使用を提案する記事を投稿していますが、それぞれがあなたがそれらをどのように組み立てるか、どのように通信するかなどについて意見が異なる傾向があります。

私の個人的な見解では、リンクしたリレーショナルモデルは、日常的に使用するにはあまりにも抽象的すぎるとのことです。

代わりに、私はあなた自身の設計をより詳しく見て、互換性のあるコンポーネントを形成するために機能のどの共通の側面を除外できるかを見ます。それはおそらく、コンポーネントがどうあるべきかという先入観の概念にゲームを割り込ませるよりもはるかに実り多いでしょう。


どの実装スタイルが次のスタイルより有利であるかについては合意が得られていないことに同意しますが、コンポーネントシステムを使用する非常に成功したエンジンの数を考えると、「Fad」とは言えません。
Kynth、2011年

そのようなシステムを使用しているエンジンはそれほど多くありません。確かに、それらを作成することに関心のある人々の量を正当化するのに十分ではありません。(私が今考えることができるのはUnityだけです。)これはアプローチに対する批判ではなく、実際にこのトピックを実際に使用している実際のソフトウェアの量と比較した、このトピックへの不釣り合いな関心の反映です。
Kylotan 2011年

0

Entity Systemsで参照されている一連の記事を理解しているので、「アイテム」にはコンポーネントがロードされています。そして、コンポーネントは参照のリストです。あなたの例に従ってください:AttackComponentには、「アイテム」が攻撃する方法への参照が含まれます。AttackTargetComponentには、ターゲットのリストを取得するメカニズムへの参照が含まれます。等々。したがって、「アイテム」が1つまたは複数のターゲットを攻撃する場合、AttackComponentとAttackTargetComponentを使用するか、アイテム(およびそのコンポーネント)に基づいて外部メソッドをトリガーします。これらの記事を共有していただきありがとうございます。

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