この記事は、Unreal Engine のサウンド デザイン プロセスや実装の面に関心のある方を対象としています。私が Epic Games に依頼されたのは、Epic Games Launcher からインストールできる「シューター ゲーム」プロジェクトのオーディオの全面的見直しでした。これは Epic が提供するスターター テンプレートのなかでダウンロード回数が最も多いものです。まだ手に入れていない場合はぜひチェックしてみてください。
私はオーディオ アセットのデザインをすべてやり直しただけでなく、スケーラブルなブループリント ロジックを追加し、全体的に明快でわかりやすい表現を心がけました。同時に、サウンド デザイナーの皆さんが興味を持つであろう、便利なパラメータ、システム、変数、コンポーネントをいくつか取り入れました。私が設定したものは単なるデザイン案であり、Unreal Engine でオーディオの実装に使用できるたくさんの方法の 1 つに過ぎません。ゲーム オーディオ コミュニティ内では 1 つ誤解があるようで、「次世代のサウンド」(それが何を意味するとしても) を実現するには Unreal Engine のプロジェクトにミドルウェアを組み込む必要があると思われているようですが、これは正しくありません。
私の願いは、ゲーム オーディオの世界で、より多くの方々に、テクノロジーに精通したコンテンツ クリエイターになる価値をわかっていただくことです。Epic のプログラミング チームや QA チームがこの数年間に実装、テスト、修正してきた Unreal Engine のネイティブなツールや機能が大きく改善されているのは間違いありません。また、この先のロードマップも意欲的で期待できるものになっています。私は、プロのサウンド デザイナーは、こうしたツールやテクノロジーを駆使し、ゲーム デザイナーとしての能力も伸ばす必要があると考えています。特に、ブループリント時代の幕開けを迎えていることを考えると、単純なものであることも多い実装の作業について、プログラマーに依存するべきではありません。
2012 年から Unreal Engine の信奉者となり、サウンド デザインと実装の技術に夢中になっている者として、このプロジェクトに採用されたことに恐縮しました。あらゆること (サウンド デザイン、実装、発見、バグ修正、プレイテスト、会議、同期など) を考慮に入れ、所要期間を 15 ~ 20 日と見積もりました。プロジェクトと同期したとき、オーディオのサブレベルにあるアクタをすべて選択し、削除するのは、正直気持ちのいいものでした。私の体験を簡単に振り返り、心に留めておいたいくつかのポイントをお伝えします。
プロジェクトの目標
このプロジェクトの主な目標は、サウンドスケープをアップデートして、現代風かつダイナミックにすることでした。以前のアセットは過剰に圧縮され、ミックスには十分に気が配られておらず、アセットのサウンドは古臭くなっていました。また、ある音楽トラックは重々しく、周波数と音量の面で耳への負担になっていました。こうした点が、個々のゲーム イベントを味わうチャンスを奪い、最終的にゲームプレイの楽しみを減らしていました。特に問題があったものをいくつか挙げると、武器はパンチに欠けていて、環境音はもっと空間や質感を伝える必要があり、足音は重く大き過ぎていて、ピックアップを拾った時の音はほとんど爆発音のようになっていました。個々のアセットについて語り続けることもできますが、時間節約のためにやめておくことにして、要するにすべてのアセットの更新が必要だと感じました。ゲーム内のすべてのサウンドを削除し、最初からやり直しました。私がオーディオ サブレベルのすべてを満足げに削除する様子
サウンドの (再) 設計
「シューター ゲーム」のオーディオは、センスが古く、ミックスのバランスが取れていませんでした。「シューター ゲーム」は今でも、新しいライセンシーや Unreal Engine を初めて試す人々が最もよくダウンロードするサンプル プロジェクトの 1 つであるため、このままではネイティブのオーディオ エンジンで可能なことについて、間違った印象を与えかねません。それだけでなく、古臭いサウンドと、統一性のない実装方法が重なって、プレイの楽しみを減らしていました。オーディオのアセットと実装は、サウンドの主要なクラスの間でバランスを欠いていました。たとえば、武器と足音とピックアップの間でバランスが取れていませんでした。.wav アセットはダイナミック レンジが限られ、同じ周波数帯で互いに競合していました。また、没個性的で、明瞭なものになっていませんでした。サウンドスケープは味気ないものになっていて、その結果、ゲームの体験と感情的なつながりを得られなくなっていました。感情的なつながりを生み出すことは、おそらくどのようなメディアでもオーディオの最も重要な役割であるはずです。サウンド デザイナーは、ビデオ ゲーム内のあらゆる原因と結果に、目的に応じた意味あるオーディオ デザインを用意し、包括的なゲーム デザインとストーリーを支えたいと考えているものです。こうした問題から、全面的な見直しが必要であると考えました。私はマイクとフィールド レコーダーを身につけ、数日間かけて、サンディエゴのいくつかのエリアを回り、かなりの量の音素材を録音しました。環境音から、さまざまな素材の上を歩く足音まで、あらゆる音を収集しました。また、自分のスタジオで、金属の衝撃音やその他の質感の音など、独自の効果音も録音しました。さまざまなシンセサイザーを使った優れた素材も手に入れ、各種の奇妙なものに FX チェーンを適用して、ミステリアスな未来の sci-fi の世界をイメージできるようにしました。 当初は、ほとんどの時間を、実装と、これまでプロジェクトに存在していたレガシー システムの理解にかけることになると想定していました。レガシー システムの一部は今も使用されています。また、実装プロセスの取り組み方や、必要となる新しいシステムについての構想にも時間をかけました。このプロジェクトが快適であった点の 1 つは、Epic のリード オーディオ プログラマーの Aaron McLeran 氏とテクニカル サウンド デザイナーの Dan Reynolds 氏が、私の好きにさせてくれたことです。それでは詳しい説明に入りましょう。
実装
このプロジェクトでは、一部のゲームプレイ システムはプロジェクト レベルの C++ コードでハードコーディングされていました。その他のケースでは、既存の実装をそのまま残し、サウンド キューとソース ファイルを新しいサウンド コンテンツに置き換えました。たとえば、武器の発射システムはハードコーティングされたループ サウンド システムを使用します。このシステムは、「シューター ゲーム」にのみ存在するカスタムのサウンド キュー ノードを参照します。それは「Sound Node Local Player」というもので、一人称モードか三人称モードかに応じてアセットを切り替えます。McLeran 氏と Reynolds 氏は、これは通常は、サウンド キューではなく、もっと高いレベルのゲームプレイ コードで行うと教えてくれました。ただし、「シューター ゲーム」では、エンジニアリングの優先度の関係で、ローカル プレイヤーとローカル プレイヤー以外のサウンドの違いに関する実装を変えることは選択肢にありませんでした。今回の再設計は、新機能やコードに関する作業をプログラマーに依頼することなく進める必要があったので、引き続きこの実装方法を使用する必要がありました。衝撃テンプレート、スティンガー、ピックアップなど、その他の実装については、サウンド フックをそのままにし、サウンドと、対応するキューだけを置き換えました。その他の実装作業については、主に 3 つの領域に取り組めば、ほとんどの人々にとって役立つと考えました。その領域は次のとおりです。
- オーバーラップ イベント:オーバーラップ イベントに応じて環境音やワンショット サウンドを変更
- アクタ ブループリント:再利用とカスタマイズのためのカスタム ユーティリティを作成
- マテリアル ベースの足音:サーフェス タイプのヒット結果に応じて、足音 (またはその他) のサウンドを変更
オーバーラップ イベント:個人的には、オーバーラップ イベントは Unreal Engine における実装の基礎と考えています。レベルに配置できるものからブループリント イベントを作成できます。ブループリント内では、サウンド デザイナーが、どのようなサウンド システムをデザインしても、そのシステムをさまざまな面で制御できます。
図 1. ブラシ アクタを配置して、レベル内でオーディオの挙動をカスタムのものにしたいエリアでオーバーラップ イベントをトリガー
上の図 1 では、部屋のレイアウトに合わせて、カスタム ボリューム (リバーブ用) とトリガー (環境音用) を置いています。プレイヤーがレベル内でこれらの不可視のブラシ ボリュームとオーバーラップしたときに、次の一部またはいずれかを行うことができます。
- 空間で再生されるルーム トーン (背景音) を変更
- その空間にいる間、プレイヤーのワールド位置の周りでランダムにトリガーされる独自のワンショット サウンドに切り替え
- その空間内の任意のサウンドのリバーブを変更
- ボリュームの内外でサウンドのオンとオフを切り替え
- このボリューム内またはボリューム外で再生されているサウンドに HPF と LPF を使用
図 2. 環境音を制御するロジックをオーバーラップ イベントが実行
図 2 には、オーバーラップ イベントが発生したときに実行される、簡単なブループリント スクリプトを示しています。最初に、オーバーラップ イベントを発生させたアクタとコントロール対象のポーンが同じであることを確認します。次に、ワールドにあるオーディオ コンポーネントを参照によって取得し、フェードインしたら完了です。簡単です。適切なアクタがボリュームをトリガーしていることをチェックする必要がある理由は、NPC (またはネットワーク接続を介して別のプレイヤーが操作しているキャラクター) が、そのアクションによってローカル クライアントの環境音を変える可能性があるからです。そうなると混乱が生じます。
図 3. プレイヤーのワールド位置周りのランダムなベクトル座標でワンショット サウンドをスポーンするオーディオ ロジック
図 3 のオーディオ ロジックでは、オーバーラップ イベントと、プレイヤーの位置の周りでランダムのワンショット サウンドを定期的にスポーンする Timer By Function を使用しています。こうしたサウンドがスポーンされる距離と頻度は、パブリックの float 変数を使って完全にユーザーが定義します。これらの変数は、PIE でさまざまなサウンドを試す際に容易に繰り返し微調整を加えることができます。これは、キュー内におけるピッチと音量の標準の変化に付け加えられるものです。
図 4. 「BP_Audio_Spline」ブループリントのオーディオ ロジック
アクタ ブループリント
まだブループリントの有効性を確認されていないのであれば、私を信じてください。ブループリントは極めて有効で、オーディオの機能やカスタマイズの可能性を大きく広げます。たとえば、図 4 には、リスナーに最も近いスプラインのポイントでサウンドを再生するロジックを処理するユーティリティ スクリプトを示しています。下の図 5 は、サウンドが移動するスプライン パスの例を示しています。図 5. 高層階でバルコニーの淵に沿ったスプライン。ループする風のサウンドは、スプライン上でプレイヤーの位置に最も近いポイントから発せられる
このような設定の一般的な使用例には、パイプを流れる水や、曲がりくねった川や小川の水のループする音などが考えられます。この方法を使うことで、1 つのポイントまたは一連のポイントを音源とするのではなく、大きく、分散された音源を表現できます。
図 6. オーディオがプレイヤーの位置を追い、スプライン上でプレイヤーに最も近い位置から発せられる様子の視覚的な表現
このプロジェクトでは、この方法をいくつかのエリアで使っています。図 6 は、バルコニーの淵に沿ってこの方法を使っている 1 つの例を示しています。単にスプライン パスを作成し、オーディオがそれに沿って動くようにしました。また、屋外で風が吹くループ サウンドをそのパス上で再生するようにしました。その結果、淵に近づくほど、たくさんの風の音が聞こえるように感じられます。ただし、音量が上下するのではありません (一連のワンショット サウンドが聞こえます)。
マテリアル ベースの足音
図 7. ライン トレースのヒット結果に応じて足音を変えるブループリント スクリプト
Unreal Engine では一般に、キャラクターが上を歩いていたり触っていたりする物理マテリアルに応じて足音やその他の効果音を変えるために、コードのサポートは必要ありません。図 7 は、足音とジャンプランド (キャラクターがジャンプ後に着地したときのサウンド) 用の私のロジックを示しています。このようなスクリプトは、ライン トレースを使用し、何に接触したかに関する情報を入手し、その結果に応じてサウンドを変えたいあらゆる場面に使用できます。
図 8. サウンド再生通知がサウンドをトリガーし、アニメーション通知がアニメーション ブループリントのグラフ イベントをトリガー
図 8 では、このアニメーション ブループリント内のイベントが、個々のアニメーション通知イベントによってトリガーされています。このイベントは、さまざまな走行、スプリントのアニメーションに設定し、「Footstep」と名付けたものです。
この方法を利用するには、その前に、プロジェクト内ですべての物理マテリアルが各サーフェスで設定されている必要があります。物理マテリアルのタイプは、プロジェクト設定で定義します。このサンプル プロジェクトでは、タイル、草、金属の各マテリアルのみを使用しています。ターミネーターの映画に出てきた「液体金属」のような独自のマテリアルがプロジェクトにある場合は、プロジェクトの設定で定義します。設定が完了したら、そのサーフェス タイプを、レベル上に配置された物理マテリアルやメッシュに割り当てることができます。こうした設定は、通常は背景アーティストがグラフィックのためにすでに行っているため、サウンド デザイナーは何があるかを確認し、使用するだけです。
図 9. 「マップ」変数を使った物理マテリアル タイプとサウンド キューの関連付け
図 9 では、変数タイプ マップを作成し、ライン トレースのヒット結果を関連付け、ヒットしたサーフェスに応じて異なるサウンドを再生しています。このブループリント スクリプトは次の論理シーケンスを実行します。
- アニメーション通知がイベントをトリガー
- Pawn Owner を取得し、Player Pawn ブループリントにキャスト
- ワールド位置を取得 (開始ベクトル位置として)
- 100 ユニットを差し引く (終了ベクトル位置として使用)
- この座標を使ってライン トレースを実行
- ライン トレースでサーフェスに接触した場合、それが何かを通知
- ヒットした物理マテリアルを返し、マップ変数を使って、設定したサウンドの参照を検索
- マップ変数で見つかった結果を使ってサウンド変数「Sound To Play」を設定
- 最後に、プレイヤー ポーン上のメッシュを参照し、メッシュに関連付けられている足音をスポーン
おわりに
一般に、1 つのアイデアやシステムを Unreal Engine で実装する方法は複数あります。通常、正しい方法や間違った方法があるわけではありませんが、効率のいい方法はあります。チームで作業している場合は、ご自身のブループリント ロジックをプログラマーやデザイナーに定期的に確認、評価してもらうことをベスト プラクティスとして推奨します。自主的に学び、オーディオ以外のシステムについても理解できると、デザイン プロセスにより深く関われるようになり、その結果、Unreal Engine を使用するほかのゲーム デザイナーやデベロッパーと対等な立場を築けます。それはとてもすばらしいことです。Unreal Engine のオーディオについてもっと学びたい方は、私の Facebook グループ「Unreal Engine Audio Tips & Tricks」に参加したり、Udemy で Unreal Engine のコースをチェックしたり、Unreal Engine のフォーラムに参加したり、Mathew Wadstein 氏の WTF Is シリーズのような YouTube チャンネルをご覧になったりすることをおすすめします。また、Epic が最近立ち上げたオンライン ラーニング コースもチェックしてみてください。私個人の LinkedIn アカウントではいつでもお問い合わせを受け付けています。Web サイト Craftmediagroup.com もご覧ください。
最後までお読みいただき、ありがとうございました。