今回の内容
Unityでオニオンアーキテクチャを採用して開発をするための第一歩として、
スクリプトの構成のルールや導入したライブラリ等をまとめたものになります。
本記事の対象読者
1.ドメイン駆動設計の概要を理解している方
2.オニオンアーキテクチャの概要を理解している方
3.Unityの「Assembly Definition File」の概要を理解している方
4.Unityでアーキテクチャ設計を実践してみたいと考えている方
目次
1.ドメイン駆動設計とは
2.オニオンアーキテクチャとは
3.Assembly Definition Fileとは
4.フォルダレイアウト
5.asmdefの設定の例
6.その他
7.まとめ
ドメイン駆動設計とは
ドメイン駆動設計(Domain-Driven Design, DDD)は、複雑なビジネスドメインを効果的にモデリングし、ソフトウェア開発においてビジネスロジックを中心に据える設計手法です。DDDの主な目的は、ビジネスの要件を正確に反映し、柔軟で保守性の高いシステムを構築することです。
ドメイン駆動について詳しく知りたい方向け
書籍
ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本
エリック・エヴァンスのドメイン駆動設計
記事
ドメイン駆動設計とは何か?その基本概念と重要性について
ドメイン駆動設計とは?目的やメリットなどをわかりやすく解説
オニオンアーキテクチャの概要
オニオンアーキテクチャとは、DDDの原則に基づいて設計されたソフトウェアアーキテクチャです。
このアーキテクチャは、システムを4つの層に分割し、外から中心に向かって依存をします。
1.ドメイン層
アプリケーションのビジネスルールとエンティティ(モデル)を定義します。
2.アプリケーション層
ドメイン層のビジネスロジックを使用して、具体的なユースケースを実現します。
※インターフェースのみ配置する場合もあります。
3.インフラストラクチャ層
インフラストラクチャリソース(データベース、メッセージキュー、APIクライアントなど)を提供します。
4.プレゼンテーション層(UI層)
ユーザーがシステムとやり取りを行う。UnityにおけるMonoBehaviourとの連携を行う。
オニオンアーキテクチャについて詳しく知りたい方向け
その他、設計について参考になる書籍
良いコード/悪いコードで学ぶ設計入門
Clean Architecture 達人に学ぶソフトウェアの構造と設計
Adaptive Code C#実践開発手法 第2版
Assembly Definition Fileとは
.asmdef拡張子を持つアセンブリ定義のプロパティが定義されたファイルで、Unityが提供している機能です。
以下、Assembly Definition Fileをasmdefとします。
asmdefファイルを追加する目的
各レイヤ(オニオンアーキテクチャのレイヤ)ごとに、モジュール化することで依存関係を明確にするためです。
asmdefファイルは、どのDLLに依存するかを設定できるため、アーキテクチャのルールを強制することができます。(例:ドメイン層はインフラ層に依存しないなど)
また、Unity Test Runnerを使ったユニットテストも特定のレイヤのみをテストすることできるので、テストの効率が向上し、コードの保守性を高めることができます。
フォルダレイアウト
Unityでオニオンアーキテクチャを実践する際は、各層の責務を明確に分けることが重要です。
以下は、私が個人で開発するにあたって採用したフォルダレイアウトになります。
Assets
└─ Scripts
└─ Domain
└─ UserInfo // モジュール化
└─ Application
└─ UserInfoServices // モジュール化
└─ Infrastructure
└─ UserInfoRepository // モジュール化
└─ Presentation
└─ Title // モジュール化
├─ Models
├─ Presenters
└─ Views
└─ Home // モジュール化
├─ Models
├─ Presenters
└─ Views
└─ Profile // モジュール化
├─ Models
├─ Presenters
└─ Views
※ モジュール化 (DLLを分割する単位)
モジュール化する単位について
ドメイン層、アプリケーション層、インフラ層
- 分割単位: 機能単位
- 利点: 各層が独立して動作し、変更の影響範囲を最小限に抑えることができます
プレゼンテーション層
- 分割単位: 画面単位
- 利点: UIの変更や追加が容易になります
モジュールの依存関係を示すダイアグラム
asmdefの設定の例
各レイヤーの共通項目
RootNamespace とアセンブリ名を同じ文字列にする
Auto Referenced のチェックを外す。(Assembly-Csharpから参照をさせない)
ドメイン層
- No Engine References にチェックを入れ、UnityEngineへの依存を切る
- その他ライブラリの参照もできるだけ避ける。ただし、UniTask や R3 が必要になる場合は、これらのライブラリを参照してもよい
アプリケーション層、インフラ層、プレゼンテーション層
- 基本方針は上記と変わらない
- Assembly Definition References に参照するアセンブリを設定する。このとき、アーキテクチャのルールに従う
- MonoBehaviourを継承するのは、プレゼンテーション層のみ する
その他
DI Container の利用が必須になります。
下記のブログで紹介されている ScrrenSystem は、
必要なライブラリ等も揃っているので、かなりとっつきやすいと思います。
まとめ
Unityのゲーム開発でオニオンアーキテクチャを実践するにあたって、私が実践したフォルダレイアウトやモジュール化の単位、必要なルールについて記載しました。
これにより、保守性が高く、将来の変更や追加に対応しやすいシステムを構築するための重要なステップを踏むことができます。
この記事が皆さんの開発に少しでも役立てば嬉しいです。
ぜひ、参考にして、実際に試してみてください!