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コンポーネントにする方式は書き込みに有利だといえる。アイテムの状態遷移はわりと頻繁にあるといっても、コードでは読み込みのほうがはるかに多いので、読み込みを重視したほうがいいように見える。
結局セーブ・ロードがうまくできなかったので状態ごとにコンポーネントを作る方式にした。運用して考えていく。
関連
- 動機: KDOC 59: ECSを使ってRPGを作る。で考えた