「エンティティ・コンポーネント・システム」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
 
4行目: 4行目:
  
 
== 概要 ==
 
== 概要 ==
データと処理が分離しているので上層部の思いつきによる急な仕様変更に強いという特徴がある。
+
ECSは「データ」と「処理」が分離していることで「階層構造がない」という特徴がある。
 +
階層構造は「階層を大きく組み直したいとき」に依存関係が複雑すぎて「右を治したら左が壊れる」という状態に陥り破綻するという問題を抱えているが、ECSを使えばこの問題を回避できる。
 +
このことから「上層部の思いつきによる急な仕様変更に強い」と言われる。
  
ゲーム業界では非常に人気がある。
+
* 「[[階層化の有害性]]」も参照
 +
 
 +
いわゆる「[[オブジェクト指向]]」を全否定したものだが、一部の[[オブジェクト指向プログラミング言語]]との相性は悪くなく、[[インターフェイス]]と[[構造体]]と[[LINQ]]を搭載する[[C#]]との相性は非常に良い。
 +
 
 +
ECSはゲーム業界では非常に人気がある。
 
[[ゲームエンジン]]の[[Unity]]も独自のECSを採用している。
 
[[ゲームエンジン]]の[[Unity]]も独自のECSを採用している。
 
いわゆる「[[オブジェクト指向]]」を全否定したものだが、[[オブジェクト指向プログラミング言語]]との相性は悪くなく、[[インターフェイス]]と[[構造体]]と[[LINQ]]を搭載する[[C#]]との相性は非常に良い。
 
  
 
== 主な用語 ==
 
== 主な用語 ==

2022年12月7日 (水) 04:47時点における最新版

エンティティ・コンポーネント・システム(英語: Entity component system、通称:ECS)とは、「データ」と「処理」を完全に分離して考えるプログラミングの手法のひとつ。

コンポーネント指向」とはまったくの別物。

概要[編集 | ソースを編集]

ECSは「データ」と「処理」が分離していることで「階層構造がない」という特徴がある。 階層構造は「階層を大きく組み直したいとき」に依存関係が複雑すぎて「右を治したら左が壊れる」という状態に陥り破綻するという問題を抱えているが、ECSを使えばこの問題を回避できる。 このことから「上層部の思いつきによる急な仕様変更に強い」と言われる。

いわゆる「オブジェクト指向」を全否定したものだが、一部のオブジェクト指向プログラミング言語との相性は悪くなく、インターフェイス構造体LINQを搭載するC#との相性は非常に良い。

ECSはゲーム業界では非常に人気がある。 ゲームエンジンUnityも独自のECSを採用している。

主な用語[編集 | ソースを編集]

エンティティ[編集 | ソースを編集]

オブジェクト指向でいうオブジェクトに近いもの。オブジェクト指向でいう「メソッド」や「プロパティ」や「メンバ変数」などは一切持たず、エンティティの「識別子(ID)」と「コンポーネントの配列」だけを持つ。

class Entity {
    public List<IComponent> Components { get; private set;} = new List<IComponent>();
}

コンポーネント[編集 | ソースを編集]

エンティティが持つ要素のひとつ。いわゆる「データ」である。 構造体で実装することが多い。

interface IComponent {
}
struct DrawableComponent : IComponent {
}
struct HitpointComponent : IComponent {
    public int HitPoint;
}

システム[編集 | ソースを編集]

いわゆる「処理」である。エンティティの配列から特定のコンポーネントを持つものを抽出し、それらに対して処理を行う。

以下のような感じである。

  • コンポーネントAを持つエンティティに対する処理(システム)
  • コンポーネントAとコンポーネントBを併せ持つエンティティに対する処理(システム)