Entity Component Systemについてまとめてみる
自分は、Unityが初めてのクライアントアプリだったので、
「こういう風に作るのか〜」
程度の感想しかなかったですが、どうやらゲーム開発に向いたアーキテクチャーで、
Entity Component System(以下、ECS)と呼ぶらしいです。
といっても、UnityはECS風であり、ECSそのものではない様子。
エンティティ・コンポーネント・システム - Wikipedia
とはいえ、初心者にとっては、厳密さより根っこの理解が大事に思えるので、
初学者に向けてまとめてみます。
プロダクトが複雑になればなるほど、継承よりも委譲に頼っていく方が筋が良いという話
オブジェクト指向を意識して開発を進めていくと、継承を使う機会がちょいちょい出てきます。
でも、継承を使って開発していくと、以下のようなときにハマります。
※ Effective JavaはJava知らなくても勉強になるのでオススメ
つまり、「継承は、親クラスの実装詳細を把握してないと書けない」ということです。
オブジェクト指向の特徴に「カプセル化(情報隠蔽)」という言葉がありますが、
継承したときの、子クラスから見た親クラスは、カプセル化(隠蔽)されてないわけで、オブジェクト指向の特徴とは矛盾してしまっています。
そりゃそうか、と言ってしまうとそこまでな話ですが、
割と重要な事実ではないでしょうか。
これは、委譲であればそんなことはないのです。
以下のブログは、そのことをとてもわかりやすくまとめています。
上記のブログで、コンポジションと言っているのが委譲です。
このような思想をコンポーネント指向と言ったりもするようです。
「オブジェクト指向は、1つのクラスが人に例えられる(擬人)けど、コンポーネント指向は、1つのクラスが部品になり、部品の集合がオブジェクトと見なされる」
というところです。
例えば、「銃を打てる人」を表すときに、以下のように構成が変わってきます。
直感的にも、継承ツリーを意識せずに実装できるのは、メリットと感じられるのではないでしょうか。
ここまで説明すると、UnityがECSの思想に基づいて作られていることがなんとなくイメージできるかと思います。
- ゲームオブジェクト: Entity
- ゲームオブジェクトに紐づくスクリプト達: Component
という位置付けになります。
じゃあどう実装するのか
具体的にどう実装してるのか、というのは、以下が参考になるので
こちらを参照ください。
以下はUnity特化です。非公式ですが、わかりやすいです。
そもそもどうやってSceneを作っていくべきか、大いに参考になると思います。
おまけ
UnityのECSって微妙じゃね?という議論を垣間見れます。(英語読めればw)
上記ブログで触れられた Artemis Entity Component System
Artemis Entity System Framework - Entity Systems Wiki
ちなみに、Unityの上に動く自作ECSも公開されたりしてます笑
動画もあり、熱量を感じられます。
ぼくもこの程度の知識しかないですが、参考になればうれしいです。