「エンティティ・コンポーネント・システム」の版間の差分
Administrator (トーク | 投稿記録) ページの作成:「'''エンティティ・コンポーネント・システム'''(英語: Entity component system、通称:ECS)とは、データと処理を完全に分離して考…」 |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| (同じ利用者による、間の5版が非表示) | |||
| 1行目: | 1行目: | ||
'''エンティティ・コンポーネント・システム'''(英語: Entity component | '''エンティティ・コンポーネント・システム'''(英語: Entity component system、通称:ECS)とは、「[[データ]]」と「処理」を完全に分離して考える[[プログラミング]]の手法のひとつ。 | ||
「[[コンポーネント指向]]」とはまったくの別物。 | |||
== 概要 == | |||
ECSは「データ」と「処理」が分離していることで「階層構造がない」という特徴がある。 | |||
階層構造は「階層を大きく組み直したいとき」に依存関係が複雑すぎて「右を治したら左が壊れる」という状態に陥り破綻するという問題を抱えているが、ECSを使えばこの問題を回避できる。 | |||
このことから「上層部の思いつきによる急な仕様変更に強い」と言われる。 | |||
* 「[[階層化の有害性]]」も参照 | |||
いわゆる「[[オブジェクト指向]]」を全否定したものだが、一部の[[オブジェクト指向プログラミング言語]]との相性は悪くなく、[[インターフェイス]]と[[構造体]]と[[LINQ]]を搭載する[[C#]]との相性は非常に良い。 | |||
ECSはゲーム業界では非常に人気がある。 | |||
[[ゲームエンジン]]の[[Unity]]も独自のECSを採用している。 | |||
== 主な用語 == | == 主な用語 == | ||
=== エンティティ === | === エンティティ === | ||
オブジェクト指向でいうオブジェクトに近いもの。オブジェクト指向でいう「メソッド」や「プロパティ」や「メンバ変数」などは一切持たず、エンティティの「識別子(ID)」と「コンポーネントの配列」だけを持つ。 | |||
<source lang="csharp"> | |||
class Entity { | |||
public List<IComponent> Components { get; private set;} = new List<IComponent>(); | |||
} | |||
</source> | |||
=== コンポーネント === | === コンポーネント === | ||
エンティティが持つ要素のひとつ。いわゆる「[[データ]]」である。 | |||
[[構造体]]で実装することが多い。 | |||
<source lang="csharp"> | |||
interface IComponent { | |||
} | |||
struct DrawableComponent : IComponent { | |||
} | |||
struct HitpointComponent : IComponent { | |||
public int HitPoint; | |||
} | |||
</source> | |||
=== システム === | === システム === | ||
| 18行目: | 44行目: | ||
* コンポーネントAを持つエンティティに対する処理(システム) | * コンポーネントAを持つエンティティに対する処理(システム) | ||
* コンポーネントAとコンポーネントBを併せ持つエンティティに対する処理(システム) | * コンポーネントAとコンポーネントBを併せ持つエンティティに対する処理(システム) | ||
[[category: プログラミング]] | |||
2025年3月5日 (水) 05: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を併せ持つエンティティに対する処理(システム)