Unityで覚えるデザインパターン 1 Compositeパターン
趣旨
Unityとは数あるゲームエンジンの中の1つです。
ここ数年、Unityという単語を目にしない日が無いくらいに世に浸透してきましたね。このUnityのおかげで、今までゲーム開発をしたことのなかった人でも、あるいはプログラミング自体未経験の人でも、気軽に挑戦できるようになりました。
そういった中で、私も二年前よりUnityを使うようになったのですが、その頃の私はクラス設計について大して学んだことが無く、仕事でも大変な思いをしました。元々プログラミングを独学で学んでいた上に、基礎をしっかり身につけずにやっていたのがいけなかったです。
Unityを使ってごく小規模なアプリを作りつつ、デザインパターンに関する私自身の備忘録代わりにするのが主軸になりそうですが、Unityをきっかけにプログラミングをはじめた人にもクラス設計を考える手助けになれば幸いです。
デザインパターンとは
オブジェクト指向での設計における定石をパターンとして一般化したものです。コードを再利用できる資産として残したり、仕様変更を容易にする上でとても大事な考え方です。
大抵は「Gofの23のデザインパターン」というのを指しますが、ここではそれに限らず、幅広く見ていきたいと思います。(とはいえ、最初は主にGofパターンとなるかと思います)
Composite パターン
初めてとなる本記事では、Compositeパターンについて触れたいと思います。
概要
構造に関するパターンの1つ。ディレクトリとファイルの関係のような、階層構造をなす再帰的なデータ構造を設計する際に用いられます。
ファイルはディレクトリの中に格納されますが、ディレクトリもまた別のディレクトリの中に格納できます。つまり、フィルとディレクトリはどちらもディレクトリの子要素になれるのです。このように、ディレクトリとファイルを「同一視」してデータ構造を扱うのがCompositeパターンです。
今回作るもの
簡易的なインベントリ。アイテムディレクトリがあって、その中に消費アイテムと装備アイテムが入っている構造を作ってみます。
作るクラス
- Entry.cs
- GameItemDirectory.cs
- GameItemFile.cs
- CompositePatternTest.cs
クラス説明
Entry.cs
アイテムとアイテムディレクトリの抽象クラスです。
GameItemDirectory.cs
アイテムディレクトリを表すクラスです。Entry.csを継承しています。ディレクトリには子要素が入りますのでそのためのListをフィールドに持っています。また、ディレクトリには要素を追加する機能が必要ですので、16行目にそのためのメソッドを実装しています。
GameItemFile.cs
アイテムを表すクラスです。Entry.csを継承しています。今回は特に機能をつけておりません。
CompositePatternTest.cs
動作確認用のクラスです。今回はただデータ構造のログを出すだけにとどまっています。
動作の確認
以上のクラスを作成後、Hierarchy上に空のGameObjectを作成しそこにCompositePatternTest.csをアタッチします。
これを実行すると以下の様なログが得られると思います。
最後に
今回、アイテムディレクトリとその中のアイテムを例にCompositeパターンについて紹介してみましたが、ではこれでゲームのインベントリが実装できるかといえばできます。しかし、その場合は更に他のデザイパターンを実装するのが良さそうです。それは「Visiterパターン」というものです。
特にゲームのインベントリというものは、大抵その構造は決まっていますので、このパターンが有用なのではないかと思っています。
このパターンは、データ構造とそれらに対する処理を分けて実装するというものです。これについては、また別の機会に紹介したいと思います。
注意事項
この記事の内容は、私が学習したことを自分なりに理解して実装したものです。そのため一部正確性に欠けるかもしれません。何かお気づきの点や気になる点がありましたら、コメントいただけると嬉しいです。
参考書籍
こちらの書籍は、Java言語でのデザインパターンの解説をされていますが、とてもわかり易くまとめられていますので、大変参考になりました。