はじめに
Component-Based Architecture というものについて、色々調べてみた時のメモ的なやつ。
ざっくりしたまとめなので詳しく知りたい方は末尾の参考ページなどをあたってください。
概要
Component-Based Architectureとは
1999~2003年付近で活発に議論された、ゲーム制作で多く採用されているプログラムの設計指針。ゲームオブジェクトが持つ機能を「コンポーネント」に分けて持たせる(合成)。再利用性が高く、フレキシブル。
継承が持つ問題
・OOPにおける継承はis-a関係を持つ木構造を作るのが好ましい(リスコフの置換原則)
・ただし、複雑なモデルの場合これではコードの重複を無くすことができないケースがある
・特にゲームは多種多様なオブジェクトが存在する
- 継承関係だけで重複無く木構造を構成するのが難しいことがある
- 例えば、継承関係では遠い親戚だが、部分的に同じ機能を持つようなケース
- 継承関係が深く複雑になるほど、重複を無くすのは困難になる
- 階層が深くなり重複が増えると、どこに何があるかを把握するのも難しくなる -> 破綻
・重複を無くすために基底クラスの役割を重くしすぎるのも良くない
- is-a関係をやぶるかも
- 1つのクラスが様々な役割(ドメイン)を持ち、それらが密に結合する
- 再利用性・メンテナンス性の低いコードになりがち
・継承はハードコーディング
- コードを変えない限り変えられない、強い結びつき。
- 特に継承が深くなると、必要に応じて組み替えるのが難しい。
・しかし、ゲームは触ってみないとわからない所も多い
- 仕様変更や微調整の頻度が比較的高い
- 触って初めて見えてくる色々なアイディア
- 制作開始時にはわからないことだらけ
-> もっと変更に強く、再利用性が高く、フレキシブルなアプローチにしたい
Component-Based Architectureのアプローチ
##「継承よりも合成を」
・それぞれの機能をコンポーネント化し、ゲームオブジェクトに持たせる
- ゲームオブジェクトは基本的にゲーム内のあらゆるもの(ボタンやゲージなども含む)
・さまざまなコンポーネントの組み合わせでオブジェクトの機能を表現する.
- 移動、飛行、体力、攻撃、防御...などなど
- 更新処理(update)、描画処理(render)、入力処理などもコンポーネント化
- グラフィックが必要でないオブジェクトもコンポーネント
実装方法は数え切れないほどあるが、基本的なコンセプトとしてはトレイトのように「実装」を部品化してゲーム内のオブジェクトに貼り付けていくイメージ?
・機能をつけたり外したりするのが簡単
再利用性が高い
・継承で表すと遠い関係にあるオブジェクトでも同じコンポーネントを付けられる
継承を組み替える必要なし!
種々の問題
##コンポーネント間のやりとりをどうするか?
必ずしも全てのコンポーネントを独立にできるわけではない。
ただし、コンポーネント間の結合は疎にしたい。実装方法は無数(zillion way)。例えば...
- コンポーネントのコンテナを作り、全てのコンポーネントにブロードキャストする方法
- コンポーネントはデータのみを持ち、処理は「システム」としてまとめる方法
システムは自身が必要とするコンポーネントを持つゲームオブジェクトのみ処理する
##ゲームオブジェクトはどう生成するか?
・コンポーネントはゲームオブジェクト内部で生成するよりも、外部で生成して注入したほうが便利。
ファクトリクラスを作るなどするとより便利。
・ゲームオブジェクトとコンポーネントの依存関係をXMLなどの外部ファイルにまとめられる
- データドリブン的な
- ちょっとした調整のたびにビルドしなくてよい
- プログラムを触らなくても調整できるので、デザイナーやプロデューサーもゲームデザインに参加できる
まとめ
・継承を多用して階層を深くすると、ちょっとした変更に弱い構成になりがち
・Component-Based Architectureを採用すると、機能をコンポーネント化して自由にON/OFFできる
・変更に強く再利用しやすい、フレキシブルなゲーム制作
・ゲーム設計は奥が深い
・zillion ってかっこいい響き
あとあれ、もしかしてGameSaladそのものか?と思った。
参考ページ
http://www.slideshare.net/DADA246/component-basedgameenginedesign-23304862
http://gameprogrammingpatterns.com/component.html
(日本語訳: http://ameblo.jp/longwaylife/entry-11835997010.html)
http://www.raywenderlich.com/24878/introduction-to-component-based-architecture-in-games