エンティティ/コンポーネントシステムとUI「エンティティ」


14

エンティティ/コンポーネントシステムにはまだグリーンです。私はスプライト(またはスプライトシート)を描画し、入力(マウス/タッチクリック)を処理するための便利なコンポーネントを持っているので、当然これらを再利用してUIコンポーネント(レベル選択画面などのボタンなど)を作成したいと思います。

これは非常に奇妙に思えます。エンティティは、プレイヤー、敵、パワーアップなどの「ゲームモデル」として常に理解されていました。一方、コード再利用の観点からは、UIのコンポーネントを再利用することは理にかなっています。

UI / GUIの懸念はどのように(そしてどこで)エンティティ/コンポーネントシステムに適合しますか?

(注:この質問は、複数のプラットフォーム/言語に適用されるため、プラットフォームに依存しません)


3
あなたが2Dゲームを作っているからこそ、それはあなたにとって論理的だと思う。3Dゲーム(2D GUIを使用)を作成すると、レンダリングロジックはほとんど再利用できず、3Dワールド内の2D GUIコンポーネントはあまり意味がありません。コンポーネントシステムの上にGUIを構築する必要があります。GameplayScreenがコンポーネントを含むエンティティワールドを作成するように、コンポーネントの1つはレンダラーが描画する「キャンバス」を持つカメラになります。そして、そのキャンバスはその画面の背景になります。
鬼丸

1
@Kikaimaruには2Dについてのポイントがあります。多分MVCに夢中になっているかもしれませんが、「モデル」(ゲームエンティティ)とビュー/コントローラー(UIコンポーネント)が混在しているようです。確かに動作しますが、これは動作するはずの方法ですか?もっと良い方法はありますか?他の人はどのようにそれをしますか?
ashes999

@ ashes999あなたのコメントと最初の質問は私の心の奥からです:)
ナレク14

@アーメン私はこれに満足のいく答えを得ることはありませんでした。
ashes999 14

@ ashes999私に。どこでも、MVCとECSを混ぜてはいけないと言う人がいますが、なぜですか?素敵じゃない?異なるタスクのための異なる武器、あなたは同意しませんか?
ナレク14

回答:


4

いくつかのエンティティコンポーネントシステム、特にCraftyJSを使用した後、多かれ少なかれ私の質問に対する答えが得られました。はい、コンポーネント(特に2Dゲームのスプライトまたは画像およびマウスクリックハンドラー)をGUIに再利用できます。

多くの場合、あなたはECSにのみアクセスでき、基礎となるシステム(描画システムなど)にはアクセスできません。この場合、他に選択肢がないので、コンポーネントを使用してもかまいません。

基礎となるシステム(例:Cursesに直接アクセスするRubyローグライク)にアクセスできる場合、そのシステムで直接描画/レンダリングすることは、多くのコードを使用するよりも効果的です(コードが少なく、壊れにくく、自然です)エンティティとコンポーネント。


高度なUI要素のロジックはどこに配置しますか?すなわち。プレーヤーがヒットしたときとバーをどれだけ減らすかを知る必要があるヘルスバー。それは、特定のシステム、またはスクリプトまたは何か他のもの...必要がある場合、私は実現できない
エミールリマ

@EmirLimaはそのようなことをするために、ほとんどのUIロジックをヘルスバーに配置し(ヘルスバーのサイズを変更)、ヒットしたときにプレーヤーにイベントを生成させ、新しい/変更されたヘルス値を示します。(ヘルスバーはこのイベントをキャプチャし、適切に反応することができます。)
ashes999

しかし、そのアーキテクチャのヘルスバーオブジェクトとは何ですか?「ヘルスバー」コンポーネントを持つエンティティですか?エンティティを継承するクラス?更新呼び出しを伴う通常のオブジェクトはハードコーディングされていますか?
エミールリマ

1
@EmirLimaヘルスバーをエンティティとして、プレイヤーをエンティティとしてモデル化します。自分にとって意味のあることなら何でもできます。
-ashes999

1

2Dまたは3Dでは、エンティティコンポーネントシステム(ECS)は、少なくとも同じECSの一部でない場合、GUIシステムにアクセスできる必要があります。

個人的には、この2つを混ぜることはしません。GUIのコードの再利用性は、実際にはトップレベルでのみ発生します。マウス/キーボード、レンダリングなどへの応答。さまざまなボタンがとる機能、または特定のリストに表示される情報は、実際には、再利用できるほど汎用的にできるものではありません。

たとえば、GUIエンティティのコンポーネントはpositionrenderおよびのようなものになると思いguiます。GUIコンポーネントがGUIエンティティが実行するアクションのタイプを定義する場所。ただし、そのアクションは非常にユニークでコンテキスト固有のものになります。これにより、GUIコンポーネントを処理するシステムが非常に大きくなり、基本的に各GUI機能(ゲームのロード、ゲームの保存、サーバーの検索など)を処理するように設計されます。乱雑に聞こえます。

GUIの「画面」ごとに標準クラスファイルを作成したいと思います。その画面のすべての機能を1つの場所に(共通の機能クラスへの参照とともに)持っている。すっきりと管理しやすいです。

ただし、前述したように、ECSはGUIシステムにアクセスできる必要があります。システムのエンティティに基づいてGUIに情報を提供できる必要があります。たとえば、味方ユニットにカーソルを合わせると、そのユニットに関するすべての情報を含むGUIウィンドウがポップアップ表示されます。敵の団結の上にホバリングすると、情報が限られたGUIウィンドウがポップアップします。2つの違いを知るためにGUIをプログラミングしたくない場合、エンティティに情報を表示するように要求したい場合があります。

そのため、エンティティにはおそらく何らかのGUIコンポーネントがありますが、GUIエンティティではなく「ゲーム内」のエンティティになります。このコンポーネントは、外部GUIシステムを使用してGUIインターフェイスを作成します。


私が持っているシステムのような音は、あなたが説明したものとは全く異なります。TouchButtonスプライトシートとタッチクリックリスナーで構成されるエンティティクラスがあります。ユニットのポップアップについては、おそらくスプライトコンポーネントとマウスリスナーコンポーネントの組み合わせとして実装します。うーん。
ashes999
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.