mikan_daisuki’s blog

IT系サラリーマンの日記。前職ではスマホゲームを、現在はアプリを作ってます。



Entity Component Systemについてまとめてみる

自分は、Unityが初めてのクライアントアプリだったので、

 

「こういう風に作るのか〜」

 

程度の感想しかなかったですが、どうやらゲーム開発に向いたアーキテクチャーで、

Entity Component System(以下、ECS)と呼ぶらしいです。

といっても、UnityはECS風であり、ECSそのものではない様子。

 

エンティティ・コンポーネント・システム - Wikipedia

 

とはいえ、初心者にとっては、厳密さより根っこの理解が大事に思えるので、

初学者に向けてまとめてみます。

 

プロダクトが複雑になればなるほど、継承よりも委譲に頼っていく方が筋が良いという話

オブジェクト指向を意識して開発を進めていくと、継承を使う機会がちょいちょい出てきます。

でも、継承を使って開発していくと、以下のようなときにハマります。

qiita.com

※ Effective JavaJava知らなくても勉強になるのでオススメ

 

つまり、「継承は、親クラスの実装詳細を把握してないと書けない」ということです。

オブジェクト指向の特徴に「カプセル化(情報隠蔽)」という言葉がありますが、

継承したときの、子クラスから見た親クラスは、カプセル化(隠蔽)されてないわけで、オブジェクト指向の特徴とは矛盾してしまっています。

 

オブジェクト指向 - Wikipedia

 

そりゃそうか、と言ってしまうとそこまでな話ですが、

割と重要な事実ではないでしょうか。

これは、委譲であればそんなことはないのです。

以下のブログは、そのことをとてもわかりやすくまとめています。

 

qiita.com

 

上記のブログで、コンポジションと言っているのが委譲です。

このような思想をコンポーネント指向と言ったりもするようです。

 

ソフトウェアコンポーネント - Wikipedia

 

コンポーネント指向がオブジェクト指向と違うのは、

 

オブジェクト指向は、1つのクラスが人に例えられる(擬人)けど、コンポーネント指向は、1つのクラスが部品になり、部品の集合がオブジェクトと見なされる」

 

というところです。

例えば、「銃を打てる人」を表すときに、以下のように構成が変わってきます。

直感的にも、継承ツリーを意識せずに実装できるのは、メリットと感じられるのではないでしょうか。

 

ここまで説明すると、UnityがECSの思想に基づいて作られていることがなんとなくイメージできるかと思います。

  • ゲームオブジェクト: Entity
  • ゲームオブジェクトに紐づくスクリプト達: Component

という位置付けになります。

 

じゃあどう実装するのか

具体的にどう実装してるのか、というのは、以下が参考になるので

こちらを参照ください。

www.slideshare.net

 

以下はUnity特化です。非公式ですが、わかりやすいです。

Unity - コンポーネントの使い方

 

そもそもどうやってSceneを作っていくべきか、大いに参考になると思います。

 

おまけ

UnityのECSって微妙じゃね?という議論を垣間見れます。(英語読めればw)

gamedev.stackexchange.com

 

上記ブログで触れられた Artemis Entity Component System

Artemis Entity System Framework - Entity Systems Wiki

 

ちなみに、Unityの上に動く自作ECSも公開されたりしてます笑

github.com

 

動画もあり、熱量を感じられます。

www.youtube.com

 

ぼくもこの程度の知識しかないですが、参考になればうれしいです。