2016年2月24日

Uppercut Games が語る 'Danger Dodgers' 開発ストーリー

作成 Andrew James

Uppercut Games は、元 Irrational Games Australia のデベロッパーのグループが 2011 年に設立した会社です。これまでに App Store で EPOCHEPOCH 2 をはじめとする多くのアンリアル エンジン 3 のモバイル タイトルをリリースし、昨年後半にはアンリアル エンジン 4 を用いた初のタイトルとなる Submerged を Steam、PS4、XBOX One でリリースしました。

アンリアル エンジン 4 による PC およびコンソール向けタイトルの出荷後、短時間でできる小ぶりな何かを作ってみようという話になり、モバイルに目を向けてみました。調べてみると、エンジンはバージョンが 4.9 になっていて、出荷に必要なものはすべてそろっていることがわかりました。結果、最近 App Store でリリースされたばかりの Danger Dogers が誕生しました。それでは、短期間で成し遂げた今回のモバイル プロジェクトの開発ストーリーを語らせて頂きます。

短期間の開発サイクル

Danger Dodgers の開発期間は 6 ヶ月でした。プロトタイピングに 2 ヶ月、開発に 3 ヶ月、バグ修正、調整、テストに最後に 1 ヶ月かかりました。開発は、フルタイム 4 名とパートタイム 2 名の合計 6 名のデベロッパーで行いました。

1 にも 2 にも、とにかくマテリアル!

UE3 と UE4 をモバイル開発で使う場合の大きな違いは自由度、つまり、マテリアルを使ってどこまでクリエイティブになる必要があるかという点だと思います。ただしこれは両刃の剣で、サポート対象の iOS デバイスのうち、新しいデバイスと旧いデバイスのパフォーマンスに大きな開きができてしまいます。古くは iPad2、最新では iPad Pro です。メタルとノンメタル デバイスの間で、パフォーマンスの差は最も顕著に現れます。

マテリアルにシンプルなノードを設置する

均一の色、ラフネス値、法線マップで作ったシンプルなシェーダー (上の画像) で、フレームレートを 10 fps 以下にしました (iPad 2 などの古いデバイス)。強調を全く必要としないほとんどのシェーダーは、「完全にラフにする」最適化メニューを使いました。クレイメーション的な美しさを求めていたので、非常によい結果となりました。

拡張性

Danger Dodgers の開発使用したエンジン バージョン 4.9 ではマテリアルの拡張に制限があり、 すべてのマテリアルを手作業で最適化し、マテリアル グラフ内でスイッチと LOD を作成する必要がありました。4.10 では iOS ES2 Quality Presets を使うことができました。

iOS ES2 の設定

iOS ES2 は、指定したデバイスに対してシェーダーの質を下げる必要があります。方法は至って簡単で、パワーを入れてデバイス プロファイルに 1 行追加するだけです。このシステムを、すべてのノンメタル デバイスに使いました。デバイスのパフォーマンスが瞬間的に 10 fps に上がると、利用不可能だったゲームがすぐにプレイ可能になりました。

デバイス プロファイルの管理編集用の新しい UI は、テキスト エディタではなく UI で .ini の編集が簡単にできるので、時間もかからず、入力エラーやタイポもなくなりました。

モバイルのテスティング

テスティングでの大きな進歩は、複数のデバイスへビルドを一度にデプロイできることでした。パワータイプの USB Hub を設定して 8 台のデバイスを接続すれば、ビルドを同時にデプロイすることができました。パフォーマンスとゲームプレイ テスティングのプロセスが、かなりすっきりしました。

すべての iOS デバイスのテスティング

Danger Dodgers を実行する必要があった iOS デバイス

頂点シェーダー

Danger Dodgers では、頂点シェーダーを使って、背景に活気をもたせています。デバイスのパフォーマンスにはほとんど影響を及ぼさずに、ゲームのインパクトを強くすることができます。

まず、"Squash and Stretch (つぶしと伸ばし)" 機能について紹介します。空中を落下中の隕石を引き延ばし、地上に落下した隕石を押しつぶしてゴムのような弾力のある外見にする機能です。こちらがマテリアルのノードです。

Squash and Stretch ノードの設定

実は、たまたま運の良かったことがありました。伸ばし/つぶしの対象物の形状は丸を想定していましたが、丸の隕石を使うことになったので、本当にラッキーでした!さらに、オブジェクトのピボットは中央を想定していましたが、これもその通りになりました!この 2 つの想定にもとづいて、グラフの前半部分では隕石の中心からの各頂点の距離を計算します。Z コンポーネントを使えば、隕石の X-Y 平面から各頂点の位置が分かります。それをオブジェクトの半径で割ると -1 から 1 の間の値が出るので、伸ばしたい数を乗算し、その値で頂点 Z をオフセットします。基本的には、X-Y 平面から遠ざかるほどど、頂点は平面に対して、長く伸びたり、激しくつぶれたりします。

変形幅を制御するために、それぞれの隕石にはスポーン時に動的なマテリアル インスタンスを適用します。そして、ティックごとに FallingObjectStretch 値を設定します。隕石の空中落下時に FallingObjectStretch 値が最高になるように設定されているので、隕石は落下中に長く伸びます。そして地上に落下したら、伸縮イージング機能を実行して隕石をゴムまりのようにつぶしたり伸ばしたりする前に、最大に伸びている状態を緩めます。ここで言っている「イーズアウト」や「伸縮イージング機能」とは、Robert Penner 氏のイージング機能のことです。詳細は こちら でご覧いただけます。

では実際の動きを見てみましょう。


別の頂点エフェクトも使いました。実際は別々の 2 つのエフェクトを滑らかに 1 つのマテリアルにするエフェクトで、レベル内のほとんどのオブジェクトに適用しました。特に大きな隕石が地上に落下すると、周囲のオブジェクトは空中に飛び出して、元の位置に戻ります。マテリアルがバウンス (Bounce) する部分は、このようになっています。

Bounce Material ノードの設定

Bounce ノードは、Squash and Stretch ノードのようにオブジェクトの変形はしません。衝撃位置に対するアクタの位置に基づいて、Z オフセットを設定するだけです。球状マスクによって、衝撃位置から見事なフォールオフが作成されます。ここで再び、LandedObjectForce をイージング機能によってコードで制御します。ですが、このエフェクトの場合はオブジェクトごとではありません。すべてのオブジェクトは Material Parameter Collection オブジェクトによって同じフォース値を受け取ります (基本的にはグローバル シェーダー パラメータ)。このエフェクトには、一度にバウンスさせることができる隕石はたったひとつという制限があります。大きい隕石だけに適用したので、落下した隕石がバウンスしていないことはあまり気にならないと思います。

Danger Dodgers には、爆発するとプレイヤーをその場から遠ざける特別なタイプの隕石があります。大きな隕石にこの爆発が起こると、「さざ波のような」歪みがワールド全体に広がります。さざ波エフェクト (Ripple) が起きた部分はこうなっています。

Ripple Material ノードの設定

基本的な考えは、球状マスクをワールド全体に移動させることです。ExplosionRadius を経過時間と共に大きくして、その半径に球状のマスクを配置して、ExplosionLocation の相対位置に合わせて頂点をマスクします。ExplosionRadius が拡大すると球状マスクが頂点の間を通過してそれらを押し上げ、通り過ぎると元の位置へ戻ります。種明かしをすると、このような感じです。大きな隕石が落下して爆発した時の揺れとそのさざ波エフェクトを、こちらの動画でご覧いただけます。

さざ波エフェクトには制限があり、ワールドにさざ波エフェクトを発生させられるのは一回につきひとつの隕石の爆発だけです。

これらのノード グラフのそれぞれは Add ノードでまとめられるので、さざ波エフェクトはバウンスしているオブジェクトの間を通り抜けます。

既にこのような情報に詳しい方にとっても、初めて耳にする方にとっても、私達の Danger Dodgers の開発ストーリーを楽しんで頂けましたでしょうか。

Danger Dodgers は現在 App Store からダウンロードできます。 皆さんからのご意見、ご感想をお待ちしています!

Andrew @UppercutAJ | Ryan @Luachunk | Uppercut Games