2015年4月19日(日)

『メビウスFF』とユニティちゃんがコラボ! Unityでの大規模開発の効率を高める心得も公開

文:広田稔

 『メビウス ファイナルファンタジー』は、スクウェア・エニックスが 2015年春に配信予定のiOS/Android向けRPGだ。

 現在、まさに開発中となっているわけだが、同タイトルを作るにあたって技術者は何に苦労しているのだろうか? 4月13日~14日に開催したUnity開発者向けイベント“Unite 2015 Tokyo”の講演で語られた内容をまとめていこう。

“Unite 2015 Tokyo”
▲ワールドワイドで展開するため、ローマ字表記が“MEVIUS FINAL FANTASY”から“MOBIUS FINAL FANTASY”に変更されたという。
“Unite 2015 Tokyo”
▲登壇したのは、スクウェア・エニックス 第1ビジネス・ディビジョン リードプログラマーの浜口直樹氏。
“Unite 2015 Tokyo”

 『メビウスFF』のコンセプトは、“スマホで動くHDクオリティのゲームをより多くの人に体感してほしい”というもの。その目標を満たすために、『ファイナルファンタジー』のナンバリングタイトルを手がけた精鋭が集まっている。

■『メビウスFF』の開発で使用されているUnityとは?

 “Unity”はPCや家庭用ゲーム機、スマートフォンなど、20以上のプラットフォームに向けてソフトを書き出せる開発エンジンだ。

 その特徴は、編集画面からアクセスできる“Asset Store”にて、3Dキャラやスクリプトなどソフトに関するさまざまな素材が入手できてしまう点。

 また、あまりプログラムを書かなくてもソフトが作れるので、非プログラマーやゲーム開発初心者にもハードルが低い。

 日本ではiPhoneの普及とともにユーザー数を増やし、近年ではゲーム以外の開発にもよく利用されている。

 3月には“Unity 4”から“Unity 5”にメジャーバージョンアップし、グラフィックの表現手法などがさらに充実した。話が非常に長くなったが、『メビウス ファイナルファンタジー』はこの最新の“Unity 5”を使って開発されている。

“Unite 2015 Tokyo”
▲“Unity”のマスコットキャラ“ユニティちゃん”とのコラボも発表された。左右にチョコボとモーグリのブースターがあしらわれてる。

 ちなみに開発のご縁で、“Unity”のキャラクターである“ユニティちゃん”が『メビウスFF』で無償提供されるとのこと。コラボ内容はまだ秘密とのこと。

■大規模開発で“Unity”を使う時の心得

 浜口氏によれば、『メビウスFF』には、コンソールの『FF』と変わらないぐらいの人員が投入されているとのこと。「Unityの開発で、ここまで大規模なのはあまり例がないのでは」というぐらいに力を入れているとか。

 しかし開発を始めてみると、“Unity”は複数人でのコラボワークが苦手なツールということが判明。そこでデータの扱い方を工夫し、独自の管理ソフトを導入してなるべく自動化することで、クリエイターに負荷の少ない制作環境を実現している。

“Unite 2015 Tokyo”
▲グラフィックやサウンド、モーション、エフェクトといったように、さまざまな専門家が参加している。分業でよくあるのが、ファイルを同時に扱うケースだ。
“Unite 2015 Tokyo”
▲主人公がジャンプ斬りするアニメーションでも、モーション/プランナー/サウンド/エフェクトという4つの部門がかかわっている。各クリエイターが作ったデータは、全員から集めないときちんと意図したように動いているか確認できない。

 ちょっとややこしいが、各クリエイターは、“Prefab”(プレファブ)という再利用できるオブジェクトを作っている。

 これはテンプレートのようなもので、例えば同じモンスターで少しパラメーターを変えたものをいくつも配置したい時に利用すれば、後から変更がかかっても一気に直すことが可能だ。

 また、階層構造を作って、1つのプレファブに複数のプレファブを含めることもできる。先ほどの攻撃アニメーションでいうと、“アタック”というプレファブに、モーション/プランナー/サウンド/エフェクトの4つのプレファブが入れ込まれた形だ。

 ただし、この階層構造を使ってしまうと、プレファブを登録した時点のデータがコピーされてしまい、動的に最新の状態が反映されない。そこで階層構造ではなく、1ファイルごとにアセットとして扱って参照設定をつけることにした。

“Unite 2015 Tokyo”
▲“Unity”は、複数人で同時にデータ編集するのが苦手。
“Unite 2015 Tokyo”
▲左側が階層構造。“attack.prefab”の下に、動きの“motion.prefab”やヒット判定の“plan.prefab”といったプレファブがぶら下がっている。右下が変更後のattack.prefabのインスペクタで、スクリプトを書いたうえ、ほかのプレファブを割り当てている。
“Unite 2015 Tokyo”
▲アセットとして依存関係を結ぶケースでは、誰かが大元のプレファブ(ここではattack.prefab)を更新する必要がある。そこでバージョン管理ツールを導入。各部門からデータが届くと、監視サーバーが検知して自動で更新するようにした。
“Unite 2015 Tokyo”
▲ただし、この方法にも問題があって、Unityエディタ上ではインスペクタを開かないと依存関係が見えないので視認性が落ちてしまう。
“Unite 2015 Tokyo”
▲Unityだけで解決するのは難しかったので、各担当のプレファブを集めて、一覧/編集/保存できる専用のタイムラインツールを自作した。
“Unite 2015 Tokyo”
▲ちなみに『メビウスFF』で使ってるツール群はこんな感じ。Excelをデータのコンバーターとして使っているのがおもしろい。

 アプリ本体とは別に、ゲーム開始後に追加ダウンロードする“アセットバンドル”というデータも自動で作成している。

 クリエイターは手元のデータをバージョン管理ツールに投げるだけで、サーバーが定期的に各種ファイルを収集して2、3時間ほどかけてアセットバンドルができあがる。

 このサーバーを1日中まわしておくことで、数時間待てばスマホの実機で確認できるというテスト環境ができあがった。

“Unite 2015 Tokyo”
▲データフローはこんな感じ。アセットバンドルの生成用に10台以上のサーバーを割り当てているものの、今の『メビウス ファイナルファンタジー』ではアセットバンドルの依存関係が複雑なので、一度の書き出しが完了するのに2、3時間ほどかかってしまうという。

■モバイル端末でHDクオリティのゲーム制作をするための心得

 続けては、モバイルでもHD画質をキープしつつ、快適な動作環境を実現するという工夫について。今のスマホはかなり性能があがってきたとはいえ、それでもPCに比べればCPUもメモリーもストレージも非力だ。

 そこでメビウス ファイナルファンタジーでは、各スマートフォンの特性をきちんと理解したうえで、GPUに合わせて画像を最適化することでできる限りの高画質を実現している。

“Unite 2015 Tokyo”
▲開発者の中には「Unityは遅い」という人もいるが、それはC#の特性を知らないだけ。IKや揺れもののシミュレーションなどはC#で書くと負荷が高いためネイティブコードに置き換えるなど、最適化をしていくことで、Unityでも“ヌルサク”は実現できる。

 まずは敵を知るところからということで、各スマホでアプリがどれくらいメモリを使えるかをチェックしたそうだ。

 プラットフォーマーや端末会社から情報が出ていなかったので自分たちで実測して、iOSだと350~600MB、Androidは400~1100MBの範囲だという結果となった。ちなみに使えるメモリが500MBだとすると、コンソールでいえばPS3やXboxに近いとのこと。

“Unite 2015 Tokyo”
▲端末ごとでアプリが使えるメモリの実測値。
“Unite 2015 Tokyo”
▲追加ダウンロードの容量も気にしている。標準版はiOSで350MB、Androidで500MBとなっているが、なるべくきれいなグラフィックで遊びたいという人に向けて、ファイルサイズが2倍の高画質版も選べるようにした。
“Unite 2015 Tokyo”
▲この限られた容量に納めるために、テクスチャ形式を使い分けて画像のファイルサイズを軽くしている。iOSでは“RGB PVRTC 4bit”、Androidでは不透明テクスチャは“RGB ETC 4bit”、半透明テクスチャは“RGB ETC2 8bit”といった具合だ。
“Unite 2015 Tokyo”
▲さらに『メビウス ファイナルファンタジー』ではもう一方踏み込んで、Androidの端末で異なるGPUも最適なフォーマットで書き出すようにした。
“Unite 2015 Tokyo”
▲ただ、5種類のフォーマットをデザイナーがいちいち書き出して管理するのは面倒。
“Unite 2015 Tokyo”
▲というわけで先ほども出てきたアセットバンドルを生成するサーバーに任せて、GPUごとに異なる内容のアセットバンドルを作ることに。
“Unite 2015 Tokyo”
▲シェーダーのまとめ方もポイントだ。映像にこだわるとシェーダーの種類も増えるが、各アセットバンドルに分けておさめてしまうと、そのつど実行されて処理速度が遅くなったりする。基本的に1つのパッケージにまとめて、他のアセットバンドルから参照する関係を作る形で対応したとのこと。

 ……といった感じが、最新のUnity 5を使った大規模開発のコツになる。インディーゲームのクリエイターや、これからゲーム業界に入りたい人などは、上記の知識を踏まえて「こうやって動いてるのか!」と確認してみては?

“Unite 2015 Tokyo”

関連サイト