4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

オブジェクト指向はゲームづくりに向かない その5

Last updated at Posted at 2020-12-28

その1:https://qiita.com/mas-yo/items/43101d2e5ef073a1f3f5
その2:https://qiita.com/mas-yo/items/f802b5a6a6b3f47eed71
その3:https://qiita.com/mas-yo/items/cd0ddfebba3348a98b24
その4:https://qiita.com/mas-yo/items/c10ee3c8939ead6aec71

前回は、ECSで設計した見下ろし型アクションゲームの土台に、「空を飛ぶ敵」を追加で実装する、ということを想定して、設計を考えてみました。

ecs4.png

このように、MoveAttributeコンポーネントを追加することで、空を飛ぶ状態を表現したのでした。

さて、次に、「羽のアイテムを使うとプレイヤーは空を飛べるようにする」これを設計してみましょう。

UseItemコンポーネント、MoveAttributeシステム

まず新たなコンポーネントとして、アイテムの使用状態を持つUseItemコンポーネントを考えます。
アイテムを使う、というのは一般にプレイヤーの入力によって決まりますが、ここでは詳細は省略します。

今回の仕様では、UseItemに依存してMoveAttributeが変わればOK、ということになりますね。
よって、MoveAttributeシステムを追加し、UseItemを参照するようにします。

ecs5.png

MoveAttributeの更新は、MoveAttributeシステムが担当します。

前回(詳細は省きましたが)、MoveAttributeは何らかのマスターデータを参照して、敵が「空を飛ぶか、地面を歩くか」を決める、ということを想定していました。

今回は、それに加えて、UseItemが「羽アイテムを使う」という状態だったときに、MoveAttributeを「飛行」に設定します。

この様に、当初は静的な情報により決定される挙動が、動的なものに変えられたとしても、大きな影響なく、実装をすることができます。

オブジェクト指向による設計と比較すると、どうでしょうか。

その1で、オブジェクト指向で設計した際、「空を飛ぶ」かどうかは、クラスによって決まっていました。よって、後から動的に空を飛べるようになる機能が欲しくなった際に、困ってしまいましたね。

今回はECSの設計によって、それをうまく回避できています。

まとめ

以上、全5回に渡って、オブジェクト志向による設計の欠点と、それをECSによってどのように克服できるかについて、見てきました。
プログラミングを学ぶとき、多くの方は、手続き型から、オブジェクト指向と学んで来たと思います。

オブジェクト指向による設計は、現実世界に即して考えるのでわかりやすいですが、一度設計したクラスを後から簡単には変えられないため、常に仕様変更・機能追加を繰り返すゲームのプログラミングには、向かない面もあります。

そこに、データ志向設計(=Entity Component System)が注目されている理由もあります。
ECSによる柔軟でバグを生みにくいプログラム設計をして、みんなで幸せになりましょう。

ECSでゲームをつくるとどんな感じになるのか、
https://github.com/mas-yo/rust-ecs-game
こちらで実験しています。(言語はRustです)
興味のある方はご覧になってください。

4
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?