エンティティコンポーネントシステム

シンプルなエンティティ - コンポーネント - システム レイアウト。

エンティティ・コンポーネント・システムECS)は、ビデオゲーム開発においてゲーム世界のオブジェクトを表現するために使用されるソフトウェアアーキテクチャパターンです。ECSは、データコンポーネントで構成されるエンティティと、それらのコンポーネントを操作するシステムで構成されます。

ECSは継承よりも構成を優先します。すべてのエンティティは型階層ではなく、それに関連付けられたコンポーネントによって定義されます。システムは、必要なコンポーネントを持つすべてのエンティティに対してグローバルに動作します。

英語の曖昧さから、ECSという名称は、エンティティとコンポーネントから構成されるシステムであると解釈されることがあります。2002年のGDCでの講演[ 1 ] [ 2 ]で、スコット・バイラス氏はC++のオブジェクトシステムと彼が開発したカスタムコンポーネントシステムを比較しました。これは、Common Lispオブジェクトシステム型システムを例に挙げ、一般的なシステムエンジニアリングにおけるシステム用語の伝統的な用法と一致しています。

ECSは主にビデオゲーム開発で使用されていますが、 [ 3 ] Gazeboのようなロボットシミュレータなど、他の分野でも役立ちます。[ 4 ]

特徴

ECSは、一般的なコンピュータサイエンスプログラミング言語理論における、直交的で確立された概念を融合しています。例えば、コンポーネントは様々なプログラミング言語におけるミックスイン表現として捉えることができますコンポーネントは、一般的な委任アプローチとメタオブジェクトプロトコルの下での特殊なケースです。つまり、あらゆる完全なコンポーネントオブジェクトシステムは、オーランド条約[ 5 ]に基づくオブジェクト指向プログラミングのビジョンにおけるテンプレート共感モデルを用いて表現できるのです。

実在物
エンティティは汎用オブジェクトを表します。例えば、ゲームエンジンのコンテキストでは、あらゆる粗いゲームオブジェクトがエンティティとして表現されます。通常、エンティティは一意のIDのみで構成されます。実装では、このIDとして単純な整数が使用されるのが一般的です。[ 6 ]
成分
コンポーネントは、エンティティが特定の側面を持つように特徴付け、その側面をモデル化するために必要なデータを保持します。例えば、ダメージを受ける可能性のあるすべてのゲームオブジェクトには、そのエンティティに関連付けられたHealthコンポーネントが存在します。実装には通常、構造体クラス、または連想配列が使用されます。[ 6 ]
システム
システムとは、必要なコンポーネントを持つすべてのエンティティに作用するプロセスです。例えば、物理演算システムは、質量、速度、位置といったコンポーネントを持つエンティティをクエリし、その結果を反復処理し、それらのコンポーネントセットを用いて各エンティティの物理演算を実行します。

エンティティの動作は、コンポーネントを追加、削除、または変更するシステムによって実行時に変更できます。これにより、オブジェクト指向プログラミング手法によく見られる、理解、保守、拡張が困難な深く広い継承階層による曖昧性の問題が解決されます。一般的なECSアプローチは、データ指向設計手法との互換性が高く、しばしば組み合わせて使用​​されます。コンポーネントのすべてのインスタンスのデータは物理メモリに連続して保存されるため、多数のエンティティを操作するシステムで効率的なメモリアクセスが可能になります。

歴史

1963年、アイヴァン・サザーランドスケッチパッドは、初期のECSを用いて描画の視覚要素を保存した。点を異なるオブジェクト(線、円、四角形など)にカプセル化するのではなく、点はリングバッファに保存され、視覚要素はそれらを参照するだけだった。これにより、点を移動すると、それを用いてすべての形状と拘束を更新することが可能になった。[ 7 ]

1998年、『Thief: The Dark Project』はECSの先駆けとなった。[ 8 ]このエンジンは後に続編や『System Shock 2』にも使用された。

2002年、Gas Powered Games(ダンジョンシージ)のスコット・バイラス氏がECSに関する重要な講演を行いました。[ 1 ]この講演は、その後の多くの有名な実装に影響を与えました。

2007年1月初旬、トニー・ホークシリーズに携わったミック・ウェスト氏が、ネバーソフトでのECS導入のプロセスについて自身の経験を共有した。[ 9 ]

また2007年には、 Operation Flashpoint: Dragon Risingに取り組んでいたチームが、Bilas/ Dungeon Siegeに触発されたものも含めたECS設計の実験を行い、Adam Martinは後にECS設計の詳細な説明を書き、中核となる用語と概念の定義を含めました。[ 10 ] [ 11 ]特に、Martinの研究は、システムを第一級要素、エンティティを識別子、コンポーネントを生データ、コードをコンポーネントやエンティティではなくシステムに格納するという考え方を普及させました。

2015年にApple社は、 ECSの実装を含むiOSmacOStvOSゲーム開発用のAPIフレームワークであるGameplayKitを導入しました。 [ 12 ]

2018年10月[ 13 ]、 Unity社はECS上に構築された技術スタックを活用したメガシティデモをリリースしました。UnityのECSはDOTSと呼ばれる強力な最適化アーキテクチャ上で動作し、「クリエイターが高性能な方法で処理をスケールできるようにする」ものです。

バリエーション

異なる ECS のデータ レイアウトは、コンポーネントの定義、コンポーネントとエンティティの関係、システムがエンティティのコンポーネントにアクセスする方法など、異なる場合があります。

マーティンのECS

アダム・マーティンはブログシリーズで、エンティティ・コンポーネント・システムとは何かを定義しています。[ 11 ]

エンティティは、コンポーネントにアクセスするためのIDのみで構成されます。各エンティティに一意のIDを使用するのが一般的です。これは必須ではありませんが、いくつかの利点があります。

  • エンティティは、ポインタではなくIDを使って参照できます。これにより、エンティティを破棄してもダングリングポインタを残さずに済むため、より堅牢になります。
  • また、状態を外部に保存するのにも役立ち、状態が再度ロードされるときにポインタを再構築する必要がありません。
  • ポインタが適切に調整されている限り、データは必要に応じてメモリ内でシャッフルできます。
  • エンティティ ID は、ネットワーク経由で通信するときにエンティティを一意に識別するために使用できます。

これらの利点のいくつかは、スマート ポインターを使用することで実現することもできます。

コンポーネントにはゲームコード(動作)は含まれていません。コンポーネントはエンティティと物理的に同じ場所に配置する必要はありませんが、エンティティから簡単に見つけてアクセスできる必要があります。

「各システムは継続的に実行され(各システムが独自のプライベート スレッドを持っているかのように)、そのシステムのクエリに一致するコンポーネントを持つすべてのエンティティに対してグローバル アクションを実行します。」

Unityゲームエンジン

Unityのレイアウトにはテーブルがあり、各テーブルにはコンポーネントの列があります。このシステムでは、エンティティタイプは保持するコンポーネントに基づいて決定されます。すべてのエンティティタイプには、エンティティで使用されるコンポーネントに対応するコンポーネントの列を保持するテーブル(アーキタイプと呼ばれます)があります。特定のエンティティにアクセスするには、適切なアーキタイプ(テーブル)を見つけ、各列にインデックスを付けて、そのエンティティに対応するコンポーネントを取得する必要があります。

ECSの使用における一般的なパターン

システム間でデータを転送する一般的な方法は、データをコンポーネントに保存し、各システムがそのコンポーネントに順番にアクセスさせることです。例えば、オブジェクトの位置は定期的に更新されます。この位置は他のシステムで使用されます。頻度の低い様々なイベントが多数発生する場合、1つまたは複数のコンポーネントに多くのフラグが必要になります。システムはこれらのフラグを毎回監視する必要があり、非効率になる可能性があります。解決策として、オブザーバーパターンを使用する方法があります。イベントに依存するすべてのシステムがそのイベントをサブスクライブします。これにより、イベントからのアクションは発生時に一度だけ実行され、ポーリングは不要になります。

ECSは、オブジェクト指向プログラミングでよく見られる依存関係の問題をうまく処理します。これは、コンポーネントが単純なデータバケットであり、依存関係を持たないためです。各システムは通常、エンティティがシステムを操作する上で必要なコンポーネントセットを照会します。例えば、レンダリングシステムは、モデル、変換、描画可能なコンポーネントを登録します。システムは実行時に、これらのコンポーネントをすべて備えたエンティティに対してロジックを実行します。他のエンティティは単純にスキップされるため、複雑な依存関係ツリーは必要ありません。ただし、コンポーネントを介してあるシステムから別のシステムに値を伝播させるとデバッグが困難になる場合があり、バグが潜む可能性があります。ECSは、結合されていないデータを特定の有効期間にバインドする必要がある場合に使用できます。

ECSは継承ツリーではなくコンポジションを使用します。エンティティは通常、IDとそれに関連付けられたコンポーネントのリストで構成されます。適切なコンポーネントをエンティティに追加することで、あらゆるゲームオブジェクトを作成できます。これにより、開発者は依存関係の問題を回避しながら、エンティティに簡単に機能を追加できます。例えば、プレイヤーエンティティに弾丸コンポーネントを追加すると、 bulletHandlerシステムによる操作要件を満たし、弾丸が他のオブジェクトに衝突してダメージを与えるようになります。

ゲームの状態を保存するためにECSを使用するメリットは、アダム・マーティンをはじめとする多くのゲーム開発者によって提唱されています。リチャード・ロードのブログ記事はその好例であり、ECS設計のゲームデータストレージシステムのメリットと、その有用性について論じています。[ 14 ]

参照

注記

参考文献

  1. ^ a b Bilas, Scott. 「データ駆動型ゲームオブジェクトシステム」(PDF)。2013年9月18日時点のオリジナルよりアーカイブ(PDF) 。 2013年12月25日閲覧
  2. ^ Bilas, Scott. 「データ駆動型ゲームオブジェクトシステムオーディオ」2025年4月18日時点のオリジナルよりアーカイブ。 2025年4月18日閲覧
  3. ^ Romeo, Vittorio. (2016):エンティティエンコーディング技術の分析、マルチスレッドコンパイル時Entity-Component-System C++14ライブラリの設計と実装10.13140/RG.2.1.1307.4165. ( https://www.researchgate.net/publication/305730566_Analysis_of_entity_encoding_techniques_design_and_implementation_of_a_multithreaded_compile-time_Entity-Component-System_C14_library )
  4. ^ Open Robotics. 「Gazebo Sim APIリファレンス:チュートリアル:用語集」 . 2025年9月10日閲覧
  5. ^リン・アンドレア・スタイン、ヘンリー・リバーマン、デイヴィッド・ウンガー:「共有の共有観:オーランド条約」ウォン・キム、フレデリック・H・ロホフスキー編『オブジェクト指向の概念、データベース、アプリケーション』 ACM Press、ニューヨーク、1989年、第3章、31~48ページISBN 0-201-14410-7オンラインアーカイブ2016年10月7日Wayback Machine
  6. ^ a b「Entity Systems Wiki」2019年12月31日時点のオリジナルよりアーカイブ2019年12月31日閲覧。
  7. ^サザーランド、アイヴァン・エドワード(1963年1月)「スケッチパッド:マンマシン・グラフィカル・コミュニケーション・システム(ケンブリッジ大学コンピュータ研究所、UCAM-CL-TR-574、2003年9月提供)」マサチューセッツ工科大学。 2006年12月26日閲覧
  8. ^ 「知られざるデザインパターン」。2021年3月11日。
  9. ^ 「階層を進化させよう」 2007年1月5日。
  10. ^ Martin, Adam. 「エンティティシステムはMMOG開発の未来」 2013年12月26日時点のオリジナルよりアーカイブ。 2013年12月25日閲覧
  11. ^ a b Martin, Adam. 「エンティティシステムはMMOG開発の未来:パート2」2013年12月26日時点のオリジナルよりアーカイブ。 2013年12月25日閲覧
  12. ^ 「GameplayKitの紹介 - WWDC 2015 - ビデオ」2017年10月6日時点のオリジナルよりアーカイブ2017年10月6日閲覧。
  13. ^ 「UnityがMegacityデモを公開 ― 巨大なサイバーパンクの世界に数百万ものオブジェクト」 MCV /DEVELOP 2018年10月24日. 2021年6月24日閲覧
  14. ^ 「ゲーム開発にEntity Component Systemアーキテクチャを使用する理由」 www.richardlord.net 2021年11月18日閲覧