開発基盤センターの伊藤です。XRフレームワークの開発に取り組んでいます。

先日XRチームのメンバ6名(都内から4名、会津若松から2名)と喜多方でワーケーションしてきました。喜多方ワーケーションHUB「醸し場(かもしば)」という蔵を改装した素敵なワークスペースを拠点にして日中はお仕事、都合が付く人は市内観光、夜はみんなで地元の酒屋さんへといった感じで喜多方の魅力を肌で感じて街並みや雰囲気、人柄に癒された3日間でした。すっかり喜多方のファンになってます!夢心酒造の社長さんと私の2ショットです。二人とも楽しさが溢れ出ていませんか?ぜひ喜多方に足を運んでみてください。

本題に入ります。今回はBURALITなどのXRのサービス開発で実際に使っているUnityアプリのアプリケーションアーキテクチャについてお話しします。アプリケーションアーキテクチャは長いので以降では単にアーキテクチャと書きます。Unityアプリのアーキテクチャは探してもあまり情報が出てこないのでこれからUnityでアプリを作る人の参考になればと思い書きました。

アーキテクチャへのこだわり

Unityアプリは自由度が高く意識しないとすぐにスパゲティコードやゴッドクラスが生まれます。小規模なアプリや個人開発であれば良いのですがチームを組んで開発するようなサービス開発では頻繁に機能追加や改修を何度も実施するのでメンテナンスしやすいことが重要になってきます。XRチームでは初期の頃からアーキテクチャを意識して開発を行いアーキテクチャの見直しを数回行って今のかたちにたどり着いています。

アーキテクチャの紹介

XRのUnityアプリはGUIだけでなく走り回る空間なども含まれるため画面と空間で構成します。例えば、バーチャル空間に集まって何かするようなアプリケーションであれば、タイトル画面→アバター選択画面→空間選択画面→バーチャル空間といった構成になります。入力制御のように複数の画面に共通する機能やボイスチャットのように特定の空間でのみ使う機能が存在します。こういった機能を自由に組み合わせて画面や空間を作れると機能の再利用性が高まりメンテナンスしやすくなります。

これを実現するため、Unityの1つのシーンで1つの機能や画面、空間を作成し、複数のシーンを組み合わせて画面や空間を実現します。

複数のシーンを組み合わせた画面や空間の作成や切り替えにはUniduxを使っています。複数のシーンを組み合わせた画面や空間をUniduxではページと呼びます。

1つのシーンで作る機能や画面、空間はMV(R)Pパターンを使って作ります。MV(R)Pパターンについては【Unity】Model-View-(Reactive)Presenterパターンとは何なのかを参照ください。

MV(R)Pパターンに必要なイベント通知にはUniRxを使います。MVPの各オブジェクトの生成や参照関係の構築にはExtenjectを使います。

例えばテキストチャット機能の実現イメージは次の通りです。

アプリケーションの要件に合わせてUIとMVPを作成し、ModelからVivoxを使ってテキストチャットを実現します。

MV(R)Pパターンを採用している理由はデザイナーとエンジニアの分業をやりやすくするためです。

View/UIと簡単なPresenterをデザイナーが作成しPresenterとModelをエンジニアが仕上げて1つの機能が出来上がります。明確な境界が合わるわけではないですし、目指しているのは開発効率を上げることなので実際は状況に合わせて臨機応変に対応しています。

さいごに

アーキテクチャを導入すると長期的にはメンテナンス性が高くなりますがアプリの構造や実装方法を習得する必要があり初期学習コストが高くなります。Unityの開発経験があってもアーキテクチャの使用経験がない人だと2週間ぐらいの学習時間を要しています。もっと短期間でアーキテクチャを使いこなせるように今後何か対策を考えたいと思います。

今回は現時点のUnityアプリのアーキテクチャを紹介しました。これからUnityでアプリを作る人の参考になれば幸いです。