KDOC 529: 状態を示すComponentはどう表現するのがよいか

この文書のステータス

  • 作成
    • <署名>
  • レビュー
    • <署名>

概要

ECS(Entity Component System)において、状態を示すコンポーネントをどのように設計するかを考える。

まず、その状態ごとにコンポーネントとするパターン。

type Components struct {
	ItemLocationInBackpack *ecs.Component
	ItemLocationEquipped   *ecs.Component
	ItemLocationOnField    *ecs.Component
}
  • バックパックのアイテム一覧を取得したいときは多くある。コンポーネントで直接クエリできるとわかりやすく、早い
  • 必ずいずれか1つの状態になるケースで、不整合が起きる可能性がある。誤って矛盾した状態を付与してしまわないように、ヘルパーを通して変更するなどのルール化が必要になる

つぎに、1コンポーネントにいずれかの状態をするパターン。

type Components struct {
	ItemLocationType *ecs.Component
}
  • 状態遷移が明確で矛盾がない
  • 状態でのクエリができない
  • セーブ・ロードが複雑化する

つまりおおまかにいって、状態ごとにコンポーネントを作る方式は読み込みに有利で、いずれかの状態で1コンポーネントにする方式は書き込みに有利だといえる。アイテムの状態遷移はわりと頻繁にあるといっても、コードでは読み込みのほうがはるかに多いので、読み込みを重視したほうがいいように見える。


結局セーブ・ロードがうまくできなかったので状態ごとにコンポーネントを作る方式にした。運用して考えていく。

関連