この記事の3行まとめ
- ミラティブが実際の開発で用いたアウトゲーム設計を紹介
- MVPをベースに各OSSと連携した設計になっている
- 記事中の設計方針に基づいて開発されたサンプルプロジェクトが公開中
2023年9月22日、ミラティブの技術ブログ「Mirrativ Tech Blog」にて、『ミラティブでのアウトゲーム設計の紹介』と題した記事が公開されました。
同記事は、ミラティブのUnityエンジニア 菅谷氏(@tetsujp84)によって執筆され、同社が開発する運営型ゲームにおけるアウトゲームのクラス設計について解説しています。
ゲームはインゲームとアウトゲームに分割できるという思想は広く知られています。記事中では、ゲーム体験のコアであるキャラクターの操作などをインゲームの例に、キャラクターの強化やガチャ、ショップなどをアウトゲームの例に挙げています。
アウトゲームの例。キャラクター一覧画面(左)→キャラクター詳細画面(中央)→キャラクター強化画面(右)と、多数の画面と遷移から構成されるのが特徴であるとのこと(画像は公式ブログより引用)
設計方針が人によって異なるとプロジェクト構造が複雑化してしまうため、特にチームでのアウトゲーム制作においてクラス設計やルール決めは重要であるとのこと。そこで、ミラティブでは開発前に設計方針について議論したそうです。
設計方針を決めるにあたっては、MVP(Model-View-Presenter)(※)を設計のベースとしたうえで、OSS(オープンソースソフトウェア)との連携が念頭に置かれました。
※ GUI関連の実装で用いられるデザインパターン。Model、View、Presenterの3つのレイヤーに役割を分けることで、データ構造の複雑化を緩和できる
また、クリーンアーキテクチャ(※)などのソフトウェアアーキテクチャを参考にしつつ、使いやすさと複雑さを減らすことが目標に掲げられているとのこと。
※ ソフトウェアアーキテクチャのひとつ。各クラスがより低レベルのクラスに依存しないようにすることで、低レベルのクラスでの変更が高レベルのクラスに影響しなくなる
同記事では、各クラスの役割や方針、実装のポイントなどがコードとともに紹介されています。
アウトゲーム設計のクラス図(画像は公式ブログより引用)
なお、実装には以下に示すOSSが使用されています。
- VContainer
- DI(※)フレームワークでクラスやオブジェクトの依存関係を管理
※ Dependency Injection。依存関係を外部から注入することで、具象クラスへの依存を断つ方法
- プロジェクトがDIを使用していたため、アウトゲームでも採用している
- UnityScreenNavigator
- 画面をページとモジュールの単位で分割し切り替えることで画面遷移を行う
- ScreenSystem
- UnityScreenNavigatorとの連携に特化したライブラリを作成
- 型付きでパラメータを渡しつつ画面遷移をできるようにしたり、DI Containerに対応させている
- UniTask
- Taskを簡単に扱うためのOSSで通信や画面遷移など幅広く使用
- UniRx
- 主にViewのイベントをPresenterに通知し、MVPを実現するために使用
- UniRxのほうがUniTaskより使い慣れていたことから採用
- MessagePipe
- メッセージングライブラリで、同時に存在する別の画面に更新内容を届けたい場合に使用
- DI(※)フレームワークでクラスやオブジェクトの依存関係を管理
※ Dependency Injection。依存関係を外部から注入することで、具象クラスへの依存を断つ方法 - プロジェクトがDIを使用していたため、アウトゲームでも採用している
- 画面をページとモジュールの単位で分割し切り替えることで画面遷移を行う
- UnityScreenNavigatorとの連携に特化したライブラリを作成
- 型付きでパラメータを渡しつつ画面遷移をできるようにしたり、DI Containerに対応させている
- Taskを簡単に扱うためのOSSで通信や画面遷移など幅広く使用
- 主にViewのイベントをPresenterに通知し、MVPを実現するために使用
- UniRxのほうがUniTaskより使い慣れていたことから採用
- メッセージングライブラリで、同時に存在する別の画面に更新内容を届けたい場合に使用
あわせて、アウトゲーム設計のサンプルプロジェクトがGitHubにて公開中。プロジェクトは、記事で解説されたクラス設計ルールに基づいて開発されています。
詳細は、Mirrativ Tech Blog『ミラティブでのアウトゲーム設計の紹介』をご覧ください。
ミラティブでのアウトゲーム設計の紹介|Mirrativ Tech Blogmr-imada / OutgameSample|GitHub