そうしたことから、この機能の動作方法について、多くのユーザーが直感的に捉えた理解と、実際の動作や必要な挙動が正反対であるということがわかりました。驚くほど多くの関心をお寄せいただき、このトピックに関してゲーム オーディオ コミュニティから「もっと詳しく知りたい」という意見があったため、このデベロッパー向け技術ブログで Unreal Engine の分割画面オーディオの基本的な仕組みをご説明したいと思います。
分割画面ゲームの背景
ゲーム業界において、最近は分割画面ゲームの復活が見られます。分割画面ゲームは、コンソール向けのネットワーク サポートが登場する以前、マルチプレイヤー ゲームの初期では分割画面が全盛でした。私が 10 代のころの最も良い思い出にも、友達とピザを持ち寄って Goldeneye や Halo のような分割画面ゲームを夜通し遊んだ、というものがあります。しかしその後、コンソールがブロードバンド インターネット サポートを提供し始めると、分割画面は徐々にサポートされなくなりました。そして今、その数はゆっくりと回復しています。ユーザーは友達と一緒に *かつ* 個別に、オンラインでプレイするのを好むからです。幸いなことに Unreal Engine は最大で 4 分割画面をサポートしており、多くのゲームは同じソファーに座って行う対戦と、リモート ネットワークでのマルチプレイヤーをサポートしています。フォートナイトはこのように作られており、友達を連れてきて同じコンソールを共有したり、飛び入り参加で世界中の友達と遊んだりできます。
Unreal Engine で分割画面を有効化するには、[Project Settings (プロジェクト設定)] の [Local Multiplayer] 設定タブでオプションを有効にし、必要な分割画面モードを選択するだけです。C++ API を使用するとカスタマイズやより詳細に設定することもできます。
分割画面ゲームの課題
結局のところ、分割画面の有効化は、ゲーム プロジェクトのオプションを切り替えるだけで最高の結果が得られるといった単純なものではありません。ワールドにさらに視点を追加すると、レンダリングが必要なオブジェクトは増え、カリングの機会は減ります。つまりこれは、同時に使用するもの、ロードするもの、ガベージ コレクターが参照するものが増えるということでもあります。そして、この追加作業をすべて行うと、ゲーム エンジンのほぼすべてのサブシステムに多大な負担がかかってしまいます。オーディオに関しては 興味深いことが起こります。
直感が常に正しいとは限らない
同僚のデベロッパーと話した結果わかったのは、「分割したパースペクティブのオーディオが各プレイヤー (つまり「リスナー」) に聞こえるすべてのオーディオをレンダリングする必要があると、大抵の人が直感的に考えるだろう」ということです。これを実際の状況で説明すると、銃が発砲され、プレイヤー 1 がその銃のある場所の隣にいた場合、その銃声は同プレイヤーの近くから聞こえるべきです。ただ、プレイヤー 2 がそこから離れた場所にいる場合、同プレイヤーからはそれが遠くで発せられた銃声に聞こえるべきです。つまり結局のところ、聞こえる音を分割することはできないのです。しかしながら、両方のパースペクティブからオーディオをすべて出力する必要があるかというと、そうではありません。オーディオをレンダリングすると CPU の負担が (2 分割画面の場合) 2 倍になるということを脇においたとしても、このやり方では単に音響的に悲惨な結果をもたらすだけでしょう。つまりこれは、すべてのプレイヤーが聞こえる範囲で発生する画面上のすべてのイベントが、2 分割画面では 2 倍になるということです。3 分割や 4 分割した画面では 4 倍になり、たった 1 つの足音でも、まるでグループで行進しているかのような音になってしまいます。その足音が各リスナーで同時に発せられ(この場合、そうなります)、音のバリエーションが同じである場合、全く同じ音がすべて同じタイミングで重なってしまうことから、非常に大きな音が突然出力されることになります。そのため、クリッピングが発生することもあります。すべての銃声がレンダリングされ、すべてのパースペクティブから一度に聞こえるような入り乱れた戦場を想像すれば、これがどれだけおかしな状況であるかがわかると思います。
それでは、こういった場合は どうするのが正しいのでしょうか?答えは簡単です。最も近いリスナーを基準にしてサウンドを一度だけレンダリングします。
Unreal Engine の画面分割処理方法
Unreal Engine では、とても洗練された方法が用いられています。この方法は、私が 5 年前 Epic に入社した時より前に実装されたものですが、入社した時は感銘を受けました。原理的には別のソフトで見られる方法と似ていますが、UE4 では特に洗練されていました。Unreal Engine が行うのは、基本的にすべてのサウンド エミッタの位置を、最も近いリスナーのローカル空間トランスフォームに変換するだけです。これにより、無数にある下位レベルの詳細を単純化するだけでなく、下位レベルのオーディオ レンダラにとって実際に必要となるリスナーの変換が 1 つだけになります。実際、これだけ単純なことから、新しいマルチ プラットフォーム オーディオ レンダラである オーディオ ミキサー はリスナー ジオメトリ表現を必要としません。すべてのサウンド エミッタは常にオーディオ レンダラに送られる前にローカル空間変換に変換されるため、すべてのサウンドを単純に単位行列に対して空間化し、レンダリングします。また、これだけ単純なことから、空間化コードがより簡素になり、よりわくわくする次世代の空間化機能の開発をもシンプルにします。
欠点
直感には反していますが、サウンドのレンダリング対象を最も近いリスナーに限定することは、非常に理にかなっています。しかし次に示すような欠点もあります。- プレイヤーによる音的位置関係の把握あまり役に立たない
当然ながら、分割スクリーンのプレイヤーの 1 人の近くで発砲があった場合でも、その発砲が最も近いリスナーではなく、最も遠くにいる分割スクリーン プレイヤーを狙っている場合もあります。そのような状況では、より遠くのプレイヤーを基準にした音の再生を優先した方が良いと思うかもしれません。ところが問題は、そのような音は撃たれるプレイヤーを混乱させてしまう可能性があるということです。しかし先程説明したとおり、代替案にはもっと問題があります。
- パースペクティブ間を移動するサウンド
長い音やループする音は、あるリスナーのパースペクティブから別のパースペクティブに切り替わるのに十分な長さで再生される場合があります。そして、この切り替わりの音が耳障りに聞こえる場合があります。私たちが入念にテストした最悪のシナリオは、同じ方向を向いた互いにかなり離れた 2 人のプレイヤー / リスナーで、音が 1 人のプレイヤーから別のプレイヤーに伝わる場合です。中間地点で、この音は 1 人のプレイヤーの前から聞こえるような音から、他のプレイヤーの後ろから聞こえるような音に変化します。そのため、前から来る音が後ろから来る音に突然変化することになりますが、これでは不自然となります。
- サウンドをより多くレンダリングすると、ミックスと優先順位のバランスが変化する場合がある
サウンド デザイナーなら誰でも、バランスの取れたゲーム ミックスを得るのが難しいことを知っています。そして、単一画面と分割画面の両方で機能するバランスの取れたゲーム ミックスを得るとなれば、これははるかに困難になります。
- 追加のサウンドと CPU コスト
オーディオを (最も近いリスナーを基準に) 1 回だけレンダリングする方が、リスナーごとに個別にオーディオをレンダリングするよりはるかに低負荷ですが、それでも CPU の負荷は増えます。なぜなら、「範囲内」にある考慮すべき音が 2 つに増え、単純にその範囲内にあるレンダリングされる音の数が増えるからです。頻繁に上限まで CPU とメモリを使用するフォートナイトのようなゲームの場合、これは簡単に解決できる問題ではありません。
複数のエンドポイント
知識のある方なら、異なるオーディオ エンドポイントに対するオーディオ レンダリングについての質問をしたいと思うかもしれません。つまり、異なるスピーカー セットや異なるコントローラーなど、さまざまなハードウェア出力についてです。これは一部のコンソールがサポートしており、PC ではオーディオを異なるエンドポイントにレンダリングできます。ここで考えるのは、分割画面のそれぞれのパースペクティブのオーディオを実際にレンダリングして、プレイヤーがヘッドフォンで聞く時など、それを異なるハードウェア出力にルーティングする場合です。
現状、4.24 の時点で、これは UE のオーディオ エンジンでサポートされていません (この記事の執筆時点では 4.25 でサポート予定です)。さらに、すべてのプラットフォームで等しくサポートされるわけでもありません。したがって、増加したすべてのオーディオ レンダリングで CPU 負荷を軽減しようとしても、複数のハードウェア エンドポイントにレンダリングする機能がない場合は、代替の解決策が必要になるでしょう。友人を招待して同じソファーで分割画面の対戦プレイをするのに、すぐにヘッドフォンを装着して会話しないのも面白いかもしれません。が、そう感じるのは私だけかもしれません。
要点
したがって、画面分割時のオーディオ処理は、技術的に細かいことをたくさん求められる、いくぶん難しくやっかいなトピックとなる可能性があります。それでも直感と反対に、最も近いリスナー (つまり近い分割画面ビュー) を基準にして単純にオーディオをレンダリングすれば、合理的にすべてうまく機能します。このトピックに関する詳細は、まもなく出版される Guy Somberg 編著『Game Audio Programming Principles and Practices』のシリーズ第 3 巻で、私が書いた章をご確認ください。