Clean ArchitectureのUnityへの落とし込み方についての考え
はじめに
Clean Architectureを読みましたが、私がメインで使っているのUnityへ落とし込むには色々な解釈がありそうでしたし、いまいちイメージが湧きませんでした。他のサイトを参考にし、どのように適用するかを簡単に調べてみます。
私が実務で適用した事例ではなく個人の考えのまとめです
前提
Clean Architecture(以降CA)の考えではCAはフレームワークに依存するべきではないとされています。あくまでUnityもデータを表示するためのツールとして扱い、仮に他のフレームワークに変更になったとしても(言語の都合上難しいことも多いが)インターフェイス部分の実装のみで済ませることが必要なようです。
1つ目
Unityを利用した大規模なゲーム開発にクリーンアーキテクチャを採用した話 - WonderPlanet Developers’ Blog
4層のクリーンアーキテクチャをイメージされています。
1層目にはゲームの特徴的な概念やロジックなどが記述
2層目にはビジネスロジックの実装とインターフェイスの定義
3層目には画像表示の処理とインタラクションなどの受付の実装
4層目にはUnityのMonoBehaviourを継承したクラス
となっています。
1層目と2層目でどちらに実装すべきクラスかの決定が難しそうにも感じます。実際、1層目の実装がスカスカになってしまい、2層目に処理が記述されることもあったようです。
4層目のみにUnity依存のスクリプトが集まり、1,2,3層目にはUnity依存のスクリプトはなくなるようになっているため、フレームワーク依存ではなくなっていると思えます。
1層目におくべきでないデータの処理(あるスコアに対応した文字表示の装飾)などは3,4層目で対応するようです。
また、各層をAssembly Definitionで区切ることで機械的に依存関係を構築できたようです。
2つ目
Clean Architecture for Unity | Unity Learning Materials (unity3d.jp)
こちらもおおよそ4層のクリーンアーキテクチャをイメージされています。
1層目には計算の処理
2層目にはEntityとの対話
3層目には4層目との窓口
4層目にはDBやUnityの画面表示部分
となっています。
2,3層目が同じ動きに見えますが、3層目はDB用の対話やUnityとの対話によってさらにクラス分けがされているようです。
1つ目のものに比べ、分かりやすく分割されているように思えますが、2,3層目で分けることが冗長に感じることも多くなりそうです。
軽く調査したぐらいだとこの2つぐらいでした。
おまけ
万能なアーキテクチャは存在しない Unityのプロジェクトにあわせたアーキテクチャの“育て方” - ログミーTech (logmi.jp)
こちらでは特に実装方法について話してはいませんが、クリーンアーキテクチャと言えばよく見る方のものです。
全体をクリーンアーキテクチャにするのではなく、一部分のみクリーンアーキテクチャを適用した形でも良いとしています。
UnityではなくただのC#ですが、実装について丁寧に書かれています。
(まだ読み切れていません。いつか読む)
全体を通して
CA導入のメリット、デメリットで共通していたものがありました。
メリット
テストやリファクタリングが容易(かなり大きい)
デメリット
依存関係が多いためDIコンテナが必要
インターフェイスやクラスなどの数がかなり増える
まとめ
感想
Unityを扱う上でUnityをフレームワークと認識し、依存されるように設計することは可能なようです。もちろんUnityが最下層に存在することもできるようでした。
今回の例では4層構造もののみでしたが、3層構造がよりシンプルで理解しやすい場合も多いケースもありそうです。
ただ、ここまで書いておいてクリーンアーキテクチャの概念に振り回されているような気もしています。もっとも重要なのは層を意識することではなく、SOLIDの原則に基づいて設計し、適切に境界を引くことなはず・・・。
実践を積みながら考えていく必要がありあそうです。
また、Assembly Definitionの配置はかなり効果がありそうに感じます。
いざ実装する場合
個人の裁量でいくらでも形は変わると思っていた方が良さそうです。基本的には上位の層に計算のロジック。中層に下層と上層との対話。下層にデータのやり取りなどの実装があることを意識すると良さそうでした。
各層で実装をどちらに置くかなどの曖昧さはどのプロジェクトでも存在するようなので、監督者となる人を置いておく必要があるようです。
小さなプロジェクトであれば練習がてら一部分のみ適用しても良さそうです。