こんにちは! ベルリンの inbetweengames の共同設立者であり、テクニカル ディレクターを務めている Isaac Ashdown です。我々は以前、YAGER で開発に従事した経験がある (Spec Ops:The Line、 Dead Island 2) 3 名から成る小規模チームです。現在、 All Walls Must Fall の Kickstarter キャンペーンを行っています。本作は、2089 年のベルリンのナイトクラブを舞台にしたテク ノワールな戦術ゲームです。本作で重要な部分を占めるプロシージャルにミックスした音楽とサウンド エフェクトをアンリアル エンジンを使っていかに作り上げていったかについて説明します。
All Walls Must Fall では、あらゆることが音楽のビートにのって起こります。プレイヤーはタイムトラベルするスパイをコントロールし、スパイはベルリンのナイトクラブの悪の世界でミッションを遂行していきます。戦術ゲームとして、スパイはプレイヤーの指示に従いアクションを実行しますが、こうしたアクションはビートをベースにして持続し、サウンド エフェクトを同期させて音楽にパーカッション要素を加えます。サウンドスケープにさらにライティングやアニメーションといったビジュアル要素をビートに同期させています。共感覚エフェクト (例、音に色や形を感じるなど) を生み出すことがねらいです。ゲーム内のあらゆるオーディオやグラフィックスによって躍動感あふれるクラブ体験に引き込むのです。
ゲーム音楽を制作するために、電子音楽の作曲方法からインスピレーションを得ました。プレイしながら様々なループをレイヤー化するインゲームのプロシージャルなシーケンサーを作りました。これにより、ゲームプレイ中に何が起こっているかを考慮して楽器を取り入れ、変化をつけ必要に応じて強度を調整します。その結果、プレイヤーが戦略的決断を下す際に緊張感が高まります。各トラックにはデータ テーブルがあり、それぞれのメタデータと共にすべてのループをリスト化します。例えば、楽器の種類、音の強さ、どのゲームプレイ モードに対応するかなどです。
これはとても複雑なシステムで、いくつかのゲーム プレイ システムに基づきループ (ステム) が動的に追加され、取り除かれます。幸い、アンリアル エンジンの UMG システムを使ってライブ ビジュアライザーを迅速にまとめることができました。いつでも呼び出してどの音楽システムが動いているかを目で見ることができます。いくつかのシステムのパラメータをブループリントに公開するだけで、単純な UMG ウィジェットを使ってビジュアライザーを作ることができます。ビジュアライザーでは現在演奏中のループ、設定されているゲームプレイ タグを示し、さらにいくつかのドロップダウンを使ってパラメータを変更することで、システムとインタラクションすることもできます。これはシステム全体を直観的なものにするメリットがあり、多くの作曲家と一緒に作業することもできます。作曲家たちがこのシステムのために音楽を作り、思い描いていたとおりにインゲームで音楽が流れるようにするのです。
オーディオ システム全体がアンリアル エンジンの標準 Audio コンポーネントを使用して実際にサウンドを再生しています。こうすることで、Sound Cue を使って再生しながらサウンドを修正することができます。我々のオーディオ デザイナーの Almut Schwacke が未来的な銃声音を作りました。Random ノードを使って異なるコンポーネントをプロシージャルにレイヤー化しました。Random ノードは各レイヤーのバリアント セットから選択してから、Modulator ノードが最終的なピッチとボリュームの変化を加えて、Mixer ノードがまとめます。その結果、小さなソース オーディオのセットを使って膨大な数のバリエーションを作ることができます。
Sound Cue フレームワークはすぐに使えてパワフルなだけでなく、カスタムの Sound Node を作成すればとても簡単に拡張することもできます。USoundNode から新規 C++ クラスを派生させ、いくつかの関数をオーバーライドするだけで全く新しい機能を追加してサウンドにカスタム エフェクトを加えることができます。クラブの音楽を厚い壁の外側から聴いている音、ダンスフロアーにいるときは、その場の音を聴いているようなエフェクトにしたいと思いました。ですから、シンプルな Global Club FX ノードを作りました。このノードはゲーム ワールド内のプレイヤーの位置を使って動的にパラメータを調整します。例えば、ロー パス フィルタで音楽を修正し、こうしたエフェクトを実現します。
オーディオ システムはこの数か月開発してきましたが、成果に満足しています。ベルリンはテクノと電子音楽の本場です。様々な作曲家やプロデューサーを探して多様なサウンドトラックを作ることを計画しています。しかし、我々のシステムでは各トラックが個々の wav ファイルのセットとしてゲームに追加されます。各ループにつきひとつの wav ファイルが各ループのメタデータ セット全体とあわせてゲームに追加されます。複雑なトラックでは 70 以上のループを持つものもあります。こうしたデータはアンリアル エンジンのデータテーブル システムを使って入力します。このシステムは柔軟性がありますが、この量のデータを追加するのはとても時間がかかり、作曲家の方々にはトラックをイタレーションするために値を自ら微調整してほしいと考えました。ここで Automation System の出番です。Asset Registry API に対するいくつかのシンプルな呼び出しを使って、ワークフローを構築しました。アセット ブラウザにユーザーが WAV ファイルをドロップして、自動化タスクを実行しエディタがそうしたすべての WAV ファイルを使ってデータテーブルを自動的に埋めます。単純なファイル名のパースも行い、ファイル内にあるメタデータを抽出します。
ビートにのせて起こるのはアクションや銃の発砲だけではありません。背景の要素もそうです。音楽に合わせて踊る客たち、ライトの動き、リズムに合わせて光が点滅するダンスフロアーなどがあります。その多くはタイムラインを使ってブループリントでセットアップしています。柔軟性を最大限高めるため、どのタイムラインやカーブでも使えるようにしてリズムに合わせてティックさせるようにします。タイムラインの長さやトラックの速度は関係ありません。これを行うには、トラック開始時にタイムラインの自然な長さを決まったビート数に変換する乗数を計算し、Set Play Rate ノードを使って適宜タイムラインをスピードアップしたり、スローダウンします。次にトラック開始時に任意のタイムラインを再生します。このとき、その出力を使って、ライトの明るさ、マテリアルのパラメータ、リズムに合わせた動きなどを操作します。
前職の AAA スタジオ時代から長年アンリアル エンジンを使ってきたので、初のインディー プロジェクトでアンリアル エンジンを使うのは当然の選択でした。とはいえ小規模チームで少ない予算でもその拡張性とパワーによって自分たちの実力以上の大きな力を発揮することができたのは本当に驚きです。私は今回のプロジェクト開始前にオーディオのコーディングやサウンド デザインを少しかじっただけでしたが、ツールチェーンに馴染みがあったことや基本システムに拡張性があったため、インディー ゲーム向けのオーディオを制作するうえで斬新なアプローチをとることができました。それが功を奏したのです。
これまで 1 年以上にわたり、 All Walls Must Fall の制作に従事してきました。現在、Kickstarter キャンペーン で今年 5 月に開始予定のクローズド Alpha Access の資金を集めています。Alpha Access にご興味がある方は、是非 Kickstarter をチェックしてみてください。