『Scars Above』におけるWwise Spatial Audioの実装ワークフロー

ゲームオーディオ / スペーシャルオーディオ

これは何についての記事?
Spatial Audio APIとは?
Spatial Audio APIのワークフロー
    Rooms and Portals
        アセットの整理と命名規則
            命名規則
            Wwiseオブジェクトの整理
            Unreal Editorアセットの整理
        計画を立てる
            ゾーンを定義する
        初期設定
            Wwiseの設定
            Unreal Editorの設定
        実装
            フェーズ1:Unreal Editorでの作業
            フェーズ2: Wwiseでの作業
            フェーズ3:Unreal Editorでの作業
        テストとトラブルシューティング
            Wwise RoomVerb
            Rooms and Portals
    Ak Geometry
        Ak Geometry APIとは?
        回折と透過損失
        Ak Geometry APIを使用するのはいつ?
        実装
        テストとトラブルシューティング
            Unreal Editorでの作業
            Wwiseでの作業
    最適化
        AkGeometryとRoomを関連付けることによる最適化
        完全に凸形状であるボリュームは、Diffractionをオフにする
        床のサーフェスをオフにする
        不要になったポータルを削除する
        ジオメトリをシンプルにする
        プラットフォームごとにSpatial Audioを設定する
        World Composition関連
    私たちのカスタムソリューション
        カスタムリスナー
        VisualizeAkGeometry
        SplineAudioWalls
        Weapon Tailスイッチ
最後に

これは何についての記事?

この記事ではSpatial Audioの詳細や、近日リリース予定の3人称視点アクションアドベンチャーゲーム『Scars Above』への適用について、掘り下げて考えてゆきます。『Scars Above』ではゲームプレイ中に通過するエリアやスペースが多数あり、理想的にはそれぞれの物理的・音響的な特徴から生まれるサウンドスケープにより、プレイヤーに伝わる没入感や臨場感が途切れることなく継続的に高まってゆきます。AudiokineticのWwiseインテグレーションの一部として提供されるSpatial Audio APIを適切に実装することにより、このようなプレイヤー体験を達成できることがすでに実証されています。私はゲームでSpatial Audioを最大限に活用する方法を、実装の技術的な側面に焦点を当ててサウンドデザイナー向けに明確かつ簡潔に説明し、トラブルシューティングや最適化に関するアドバイスや、Mad Head GamesがSpatial Audio実装ワークフローをさらに改善するために行った作業をご紹介したいと思います。

プロジェクトのセットアップやWwiseオーサリングツールとUnreal Editorの裏側のしくみについては詳しく説明しません。Spatial Audioの実装を担当するサウンドデザイナーは、WwiseやUnreal Engineの中級以上の経験者であることを想定しているためです。とは言え、ここで言及していない部分もオンラインのドキュメントで探すことができるため、この文書はきっと初心者のお役にも立つと思います。

『Scars Above』を念頭に書いているため、細かいところまですべてのプロジェクトに当てはまるとは限りません。『Scars Above』はUnreal Engineバージョン4.27.2をベースにした弊社カスタムエンジンでコンパイルし、Unreal Engineバージョン2021.1.9.7847.2311用のWwiseインテグレーションでリリースします。今回はWwise Reflectを使用せず、SoundBankのレガシーシステムでサウンドをパッケージングしました(Event-Based Packagingを使用せず)。簡潔にするため、そして今回のリバーブ処理の主な出所でもあるため、この文書内の例にはWwise RoomVerbプラグインを使用しています。

Spatial Audio APIとは?

Spatial Audio APIはWwise APIの一部であり、ゲームの音響環境をエミュレートするためのツールセットが入っています。ゲームの物理的なレベル環境を補完するリアルな音響環境をシミュレーションするために、このツールで反射、伝搬、回折などの音響現象を含むさまざまな音響特性を忠実に再現することができます。シミュレーションの目的は、ゲームの臨場感を高めてプレイヤーが空間内で自分の場所を把握することを助け、プレイヤー周辺で発生中のアクションの重要情報を提供することです。

実装を担当するサウンドデザイナーは、Spatial Audioのワークフローを熟知していることが望ましいです。ゲームの1つのレベルの最終的なブロックアウトが終わり、メッシュやブロッキングボリューム、その他ジオメトリなどがすべて揃い、レベル全体のプレイスルーができる状態になった時に作業を開始するのが理想的です。Spatial Audioの実装はブロックアウト後のほかのレベルデザイン作業(セットドレッシングなど)と同時進行が可能で、ほかの部署との依存関係はないはずです。ただしSpatial Audio実装はレベルのレイアウトのあらゆる変更に大きく依存するため、レベルデザインチームの同僚が当該レベルでさらに手を加えた場合は、レベルで行われている作業内容を把握しておく必要があります。

Spatial Audioに使用するジオメトリは主にBrush Editingツールを使い形成するため、Spatial Audio実装担当のサウンドデザイナーは3Dモデリングの基礎知識、またはUnreal EngineのBrush Editingツールの実践的な経験があると便利です。

Spatial Audio APIのワークフロー

Spatial Audio APIにはRooms and PortalsAkGeometry APIの2つの機能があり、これらを並行して使用することにより、ゲームに求められるリアリズムに合った音響を実現することができます。これらの使い方を詳しく説明してゆきます。

Rooms and Portals

Audiokinetic Wwiseドキュメントより:

"ルームやポータルのネットワークを周辺のジオメトリのハイレベルの抽象化(またはLOD(Level of Detail)の低レベルバージョン)としてとらえることができます。ルームやポータルをレベルのジオメトリと注意深く合わせて使えば、詳細で効率的な音響シミュレーションを達成できます。"

RoomやPortalを扱うサウンドデザイナーの仕事は、サウンドのサブレベルにRoomやPortalアクタを手作業で配置してゆき、レベル内の「ネガティブスペース」全体を満たし、統一感のあるボリュームのネットワークを形成することです。私は音の発信体も受信体も存在しないであろう固形の材質で構成された固くて手に取ることのできる物理的な空間を「ポジティブスペース」と呼び、反対に「ネガティブスペース」は通常は空気で満たされている、音の発進や受信が可能な空っぽの屋内や屋外のエリアのことを指します。

このゲームにおいてルームをAkSpatialAudioVolumeアクタクラスで表現します。これらアクタはレベルの1つまたは複数のエリアをカバーし、そのプロパティを設定して側面やエッジにおける反射、適切なWwise Auxアセットの追加によるリバーブ、Room Toneの割り当てなど、さまざまな特徴を定義することができます。AkSpatialAudioVolumeアクタには主要コンポーネントとしてLate Reverb、Room、Surface Reflectorの3つがあり、すべてBrushComponentにアタッチされており、それぞれが違うSpatial Audio機能を表しています。

一方、Portalは可視化されないAkAcousticPortalボリュームアクタであり、2つのRoomを繋ぐ開口部など、Roomのさまざまな種類の開口部に使います。BrushComponentにはPortalComponentが1つアタッチされています。

これらのボリュームはすべてレベル内に手作業で、その境界がメッシュやほかのボリュームとむやみに無計画に重ならないようように、「ネガティブスペース」を覆うように配置します。

アセットの整理と命名規則

Spatial Audioワークフローに含まれるオブジェクトやアセットは5種類あり、そのうち2種類はWwise側、3種類はUnreal Editor側にあります。WwiseにはWwise RoomVerbのプリセット(ShareSets Hierarchy内)とAuxiliary Bus(Master-Mixer Hierarchy内)があり、Unreal EditorにはAudiokinetic Auxiliary Bus(.uasset)、AkSpatialAudioVolume、AkAcousticPortals(レベルのアクタクラスインスタンス)があります。

Wwiseのアセット:

  • Wwiseリバーブ(RoomVerb、Convolution Reverb)のプリセット
  • Auxiliary Bus

Unreal Editorのアセット:

  • Auxiliary Bus
  • AkSpatialAudioVolume
  • AkAcousticPortal

:冒頭で述べた通り、残響のシミュレーション例として今回はWwise RoomVerbプラグインのみを使用していますが、時間軸で変化するその他のエフェクトもバスにアサインすることができます。

命名規則

Spatial Audioアセットはどのタイプも名前のプレフィックスとして「AX」を付けることに決めました。これはほかの命名規則(サウンドエフェクトはSX、ミュージックトラックはMXなど)の代わりです。AkSpatialAudioVolumesでLate Reverbのみが有効であればAXにLRを付け、Roomとしても使用するAkSpatialAudioVolumesは名前にLRではなくRoomを付けています。WwiseのRoomVerbプリセットとAuxiliary Busアセットは同じ名前とし、記述名はそのレベルのSpatial Audio Layoutドキュメントに基づいて策定します(「計画を立てる」のセクションで説明)。Unreal Editorのアセット名は、対応するWwiseアセット名と同じ命名方法とする必要があります。

Wwiseオブジェクトの整理

Wwise RoomVerbプリセットはWwise AuthoringツールのProject Explorerの、ShareSetsタブに表示されるShareSets階層の一部です。プリセットは下図のようにレベルごとのフォルダに入れて整理することにしました:

image (1)

図1: Reverb ShareSets階層

基本的にそれぞれのレベルゾーンでプリセットを設定し、そのレベル関連のフォルダに入れます。レベルゾーンの定義については後で詳しく説明します。

ここで使うもう1点のWwiseオブジェクトタイプは、Auxiliary Busです。Auxiliary BusはProject ExplorerのAudioタブにあるMaster-Mixer階層の一部であり、ShareSetsと同様の方法で整理されています:

image (2)

図2: WwiseオーサリングツールのMaster-Mixer Auxiliary Bus階層

Auxiliary Busは必ず対象レベルに関するAudio Busの子として作成します。後でそれぞれのAuxiliary Busに該当ShareSetプリセットをアサインするため、Auxiliary Busは対応するShareSetプリセットと同じ名前にします。

  • 汎用Auxiliary Busを複数のゾーンで使用する

『Scars Above』ではAuxiliary Busの整理と実装に、2つ目のアプローチを採用しました。前述の通り各ゾーン専用のAuxiliary Busを作成したほか、プリセットをゾーンごとに作成する必要のないような状況で使用できる汎用Auxiliary Busのコレクションを2つ作成しました。これらをExteriorバスとInteriorバスの2つに分け、中身の分かる名前をつけました。

image (3)

図3:汎用Auxiliary Bus階層

このアプローチの長所はレベル内の似たような複数のゾーンに、バスを簡単にアサインできることです。一方、同じAuxiliary Busを多数のゾーンで使いまわすため、合わないからといってプリセットを勝手に編集することはできません。『Scars Above』では特徴的なトポグラフィーに専用のプリセットを用意し、類似する多様性の少ないエリアでは汎用プリセットを使用するという、ちょうどよいバランスを見つけました。

Unreal Editorアセットの整理

前述の通り3種類のUnrealアセットを使いますが、それはAudiokinetic Auxiliary Bus .uassets、AkSpatialAudioVolume、AkAcousticPortalのアクタです。

Audiokinetic Auxiliary BusをWAAPI PickerからContent Browserにドラッグ&ドロップして作成します。

アクタクラスのAkSpatialAudioVolumeとAkAcousticPortalは、Rooms and Portals APIの一部です。これらをサブレベルに直接置きます。

  • Content Browserの内容

ここでWAAPI Pickerを開いてAuxBusフォルダを見ると、オーサリングツールで作成した時と同じMaster-Mixer階層が表示されるはずです。Audiokinetic Auxiliary BusアセットをWAAPI Pickerからドラッグし、そのレベルのSpatial Audioアセットを保存するための適切なフォルダに入れます。まだ従来のSoundBank機能を使用している場合は、各Audiokinetic Auxiliary Busアセットを開き、該当するSoundBankをアサインしてください。

image (4)

図4: WAAPI PickerのMaster-Mixer Auxiliary Buss階層


  • World Outlinerの内容

レベル内のSpatial Audioアクタのインスタンス(World Outlinerに一覧あり)は、そのレベルに配置した後に、すべてAudioフォルダ内のSpatial Audio専用フォルダに移動してひとつにまとめます。私はAkAcousticPortalだけを入れるフォルダを1つ設定することをおすすめします。

image (5)

図5: World Outlinerに表示されたSpatial Audioアクタインスタンス

計画を立てる

ボリュームネットワークの構築で特にレベルが大きく不規則なエリアや交差するパスなどがある場合の作業は、気が重くなるかもしれません。このような空間でゲームの魅力は高まりますが、Spatial Audioの実装が格段に難しくなるため、着手前にしっかりとした計画を立てることが重要です。

レベル全体を大きく分け、さらに細かく分けてゆくという、私が「ゾーニング」と呼んでいる作業をするとよいと思います。ゾーニングが終わると同時にレベルのSpatial Audioの配置を示す「Spatial Audio Layoutドキュメント」が仕上がっていることが目標です。このドキュメントにゾーンの範囲やRoomとPortalのポジションなどを示す平面図と、各ゾーンの名前やプライオリティを入れます。正確な平面図を描写するためには、レベルデザイン関連の既存ドキュメントをすべて確認しておく必要があります。可能であればレベルデザイナーまたはゲームデザイナーとレベルのコンセプトについて話し、ビジュアル面での芸術性やレベルの雰囲気を聞いてください。複雑なレベルになればなるほどレベルデザイナーとの会話中に、一見気づかないような部屋、隅っこ、通路などが見えてくるものです。すでにレベルデザイン担当者たちが作業用にゾーンを決めているのであれば、私たちのアセットにも同じゾーン名を利用した方がよいでしょう。

ゾーンを定義する

ゾーンとはあるレベル内で音響的にも視覚的にも特徴があり、アセットの整理や命名において個別のエリアとして扱うことのできる部分を指します。レベルの複雑性に応じてゾーンにはGeneral、Specific、そしてRoomがあり、各タイプが直前のタイプのサブセットとなります。ゾーンには専用のAkSpatialAudioVolumeが設定されることもあり、これがさらにRoomとして定義されている場合もあります。AkSpatialAudioVolumeが表しているゾーンのタイプに応じて、そのプライオリティ番号が割り当てられますが、一般的なゾーンほど特殊なゾーンよりもプライオリティ番号が低くなります。

image (6)

図6: レベルのGeneralゾーン(例)

ゾーンタイプに基づいたプライオリティ順位:

  1. Generalゾーン:プライオリティ1以上
  2. Specificゾーン:プライオリティ2以上
  3. Room:プライオリティ3以上

:2つ以上のゾーンが重なる状況では、同じタイプのゾーンでもプライオリティが異なることがあります。このような場合はどちらのゾーンを優先するのかを決める必要があります。重複するゾーンのプライオリティが同じ場合、どちらがアクティブなゾーンであるかをシステムが予測することができません。

SpecificゾーンはGeneralゾーンの中にありながら、親のGeneralゾーンのAkSpatialAudioVolumeの中に、別のAkSpatialAudioVolumeインスタンスを設定するほどの特殊性のあるゾーンで、親よりもプライオリティが高くなります。

image (7)

図7: Generalゾーンの中のSpecificゾーン(例)

Roomは屋内空間であるか、屋外にありながらほとんど閉ざされた空間であり、多くの場合は開口部をポータルで覆う必要があります。RoomはGeneralゾーンまたはSpecificゾーンのサブセットであり、親ゾーンよりもプライオリティが高いです。ルームのスクリーンショットをレイアウトドキュメントに入れ、ルームの大きさ、音響的な特性、名前、プライオリティ番号なども分かるようにしてください。

image (8)

図8: Roomの様子(例)

初期設定

ゲームのSpatial Audio機能の実装をはじめる前に、プロジェクトの初期設定、Wwiseオブジェクト、Unreal Engineクラスのパラメータ定義についての確認事項がいくつかあります。

Wwiseの設定

  • Diffraction and Transmissionを有効にする

サウンドオブジェクトをSpatial Audioのオブストラクションやオクルージョンの対象にするためには、PositioningタブのDiffraction and Transmissionオプションを有効にし、サウンドオブジェクトを回折の計算に含める必要があります。

image (9)

図9: PositioningタブのDiffraction and Transmissionオプション

設定の適用対象はActor-Mixer Hierarchyにあるすべてのオブジェクトと、AkSpatialAudioVolumesに3DバスとしてアサインされるAuxiliary Busです。

  • Game-Defined Auxiliary Sendsを有効にする

サウンドをRoomのAuxiliary BusつまりWwise RoomVerbエフェクトに送るためには、Game-Defined Auxiliary Sendを有効にする必要があります。Actor-Mixer Hierarchyの送りたいオーディオオブジェクトのGeneral Settingsタブや、ほかのRoomのリバーブに送りたいリバーブがあるすべてのAuxiliary Busで、Use game-defined aux sendsオプションを有効にします。

image (10)

図10: アクタミキサーのUse game-defined auxを有効にする

このオプションがチェックされていないオブジェクトは、ゲームのどのボリュームのWwise RoomVerbエフェクトにも処理されません。

  • Global Obstruction/Occlusionカーブ

ゲームでSpatial Audioを活用するということは、実行時にさまざまな計算を行い、Spatial Audioエンジンに送られる各Game Objectに対する処理量を決めることとなります。ゲームエンジンからWwiseに、DiffractionとTransmission Lossの2つの重要パラメータが送られます。DiffractionはサウンドのObstruction量に紐づいており、Transmission LossはサウンドのOcclusion量に紐づいています。

これらのパラメータがサウンドにどのような影響を与えるかは、ObstructionやOcclusionのVolume、LPF、HPFの各カーブで決定されます。カーブはグローバルに定義することも、RTPCとしてサウンドごとに定義することも可能です。

ObstructionやOcclusionのグローバルカーブは、Wwise Project SettingsのObstruction/Occlusionタブで設定します。

image (11)

図11: Project Settingsで定義したObstruction/Occlusionグローバルカーブ

これらのカーブを設定することにより、DiffractionとTransmissionの計算に送信したすべてのサウンドに処理が自動的に適用されます。

:オクルージョン計算にTransmission Loss RTPCではなく、グローバルOcclusionカーブを使うことをおすすめします。理由はRTPCカーブを使用したTransmission Loss計算はサウンドパスごとに行われず、ゲームオブジェクトごとに1つの値が提供されるため、直接パスに対して行った処理がエミッターから出る潜在的な回折パスにも影響を与えるからです。ObstructionやOcclusionのグローバルカーブを使用することによりレイ(ray)を個別に信号処理することができ、透過も回折もモデル化する際の精度が向上します。

Unreal Editorの設定

  • Occlusion Refresh Rate

Spatial Audioのオブストラクションやオクルージョン処理の代わりにUnreal Engineの組み込みオクルージョン計算を利用することができ、これはデフォルトで有効になっているため、Spatial Audioと並行して使用することができます。Unreal EngineのオクルージョンはSpatial Audioの実装やWwiseプロジェクトへの統合方法と比べるとやや初歩的であり、Spatial Audioの回折に切り替える場合は、Unreal Engineのオクルージョンをオフにした方がよいでしょう。

Unreal Engineのオクルージョンはゲーム内のAkComponentの各インスタンスに、OcclusionカテゴリにあるAk ComponentのOcclusion Refresh Intervalパラメータというかたちで適用されます。デフォルト値は0.2秒であり、1/5秒ごとに新しいOcclusion値がそのAkComponentのために計算されることになります。この値を0に設定するとUnreal Engineのオクルージョンが完全に無効となります。

image (12)

図12: AkComponentで、Occlusion Refresh Intervalを0に設定する

これをゲームの各AkComponentで行う必要があるため、プログラミングチームに頼んでAkComponent.cppのコンストラクタ内でパラメータのデフォルト値を0.0fに変更してもらい、以後は心配せずに済むようにするのがベストです。

  • Collisionプリセットを使う

コリジョンのプリセットは、すべてのSpatial Audioアクタに適切なコリジョンを確実に設定できる便利な方法です。Spatial Audio専用のプリセットがあることで、コリジョンが最初から常に適切に設定され、ほかの開発者がコリジョンの設定を変更しても私たちのボリュームへの影響を心配する必要がありません。

『Scars Above』ではSpatialAudioVolumeとSpatialAudioVolumeBlockという2つのコリジョンプリセットを定義しました。AkSpatialAudioVolumeで何かをブロックする必要はなく、それに重なるGame Objectを登録するだけでよいため、SpatialAudioVolumeのコリジョンプリセットはすべてTrace TypesをIgnoreに設定すればよいのですが、唯一の例外がWeapon Tailスイッチとデバッグに使用するAudioTraceというもので、こちらはOverlapに設定します。

コリジョンプリセットSpatialAudioVolumeBlockはその名の通り、AudioTraceをOverlapではなくBlockに設定し、それ以外はIgnoreに設定しています。このプリセットをAkGeometryに送信する必要のあるすべてのボリュームとその他オブジェクトに使用することで、このジオメトリにリスナーが入り込むことを防ぎます。詳細はこの文書の最後にある私たちのCustom Listenerインテグレーションの一部として説明します。

image (13)

図13: コリジョンプリセットSpatialAudioVolumeとSpatialAudioVolumeBlock

アクタや、特にマップ上にあるアクタのインスタンスに対しては、Customコリジョンを使わない方がよいと強く思います。Customコリジョンがある場合、その後の開発中に変更内容を把握しておくことが非常に難しくなる上、Collisionプリセットに変更が加えられた時にアクタに適用されません。

実装

フェーズ1:Unreal Editorでの作業

フェーズ1のゴールはレベル全体を複数のAkSpatialAudioVolumeで完全にカバーし、RoomやPortalのネットワークの基礎を形成することです。サウンドデザイナーはレイアウト資料を元に、各ボリュームをRoomとみなすのかどうかを判断してゆきます。レイトリバーブを表現するために屋外に設定するAkSpatialAudioVolumeは基本的にRoomとみなさず、そのエリアの輪郭を厳密に沿う必要がない一方、RoomとするAkSpatialAudioVolumeは屋内をカバーする時に使用することが多く、占める空間の外枠を厳密になぞる必要があります。

image (14)

図14: Late ReverbであるAkSpatialAudioVolumeだけのネットワーク

image (15)

図15: RoomであるAkSpatialAudioVolumeだけのネットワーク


  • レベルにAkSpatialAudioVolumeアクタを配置する

レベルにアクタインスタンスを落とし込む前に、正しいサブレベルが開いていることを確認する必要があります。サブレベルを選択するためにはWindowのドロップダウンメニューを開き、Levelsタブを選択します。この中にあるサウンドサブレベルを見つけてダブルクリックすると、Viewportの右下にその名前が表示され、選択が確定します。

image (16)

図16: サウンドサブレベルが正しく選択されていることを確認

AkSpatialAudioVolumeアクタを配置するためには、Place Actorsパネルでこのアクタタイプを選択し、レベル内へドラッグ&ドロップします。

image (17)

図17: Place ActorsパネルでAkSpatialAudioVolumeアクタを選択

アクタのインスタンスをレベルに追加する際、アクタのピボットポイントがエリアの中心の近くになるようにします。ピボットポイントのXYZ値でアクタの位置が定義され、これらの値を使用してProfilerビューやVisualize Rooms and Portalsなどのデバッグツールにおいてボリュームの位置が計算されるため、ピボットポイントは重要です。ボリューム自体からイベントをルームトーンとしてポストする場合も、ピボットポイントが大切です(Room Tone機能の詳細については後述)。

レベルにアクタを配置するとそのインスタンスがWorld Outlinerで選択されて表示され、Detailsタブが開きます。ここでいくつかの設定を決めることができます:

  1. このインスタンスに独自のサーフェスを設定するのか?(Enable Surface Reflectorsを有効にするのか?)
  2. このインスタンスをLate Reverb Aux Busに送るのか?(Enable Late Reverbを有効にするのか?)
  3. このインスタンスはRoomのように動作するのか?(Enable Roomを有効にするのか?)

image (18)

図18: AkSpatialAudioVolumeの設定

Enable Surface Reflectorsオプションはこのボリュームのサーフェスをジオメトリとして使用する時に関係するもので、サーフェスの音響テキスチャなどの音響特性の定義にも関係します。Late Reverbオプションは、このボリュームからリバーブを生成させるのかどうかという判断に関係します。レイアウト資料の特定の空間を表現するために使用するすべてのAkSpatialAudioVolumesは、その空間の音響特性をシミュレートすると推察されるため、このオプションを有効にした方が理にかなっているでしょう。Enable RoomオプションはこのエリアをRoomとして処理するのかどうかという、前述の判断に関係します。

以上のDetailsタブ設定に加え、BrushComponentのコリジョンプリセットを設定する必要があるため、Collision Presetsドロップダウンメニューをクリックし、先ほど作成したSpatialAudioVolumeプリセットを選択します。

image (19)

図19: 適切に設定されたAkSpatialAudioVolumeのCollision Preset

その後にSpatial Audio Layoutドキュメントに基づき、Late ReverbコンポーネントとRoomコンポーネントのPriority番号を設定します。

image (20)

図20: 適切に設定されたAkSpatialAudioVolumeのLate ReverbとRoomのPriority

次にWwiseのWeapon TailスイッチのInterior/Exteriorステートを設定するために使用するボリュームに、アクタタグを追加します。(詳しくは 「私たちのカスタムソリューション」セクションで説明します。)ボリュームの特性(屋内・屋外、大きさ)に基づき、以下の4つのボリュームタイプから選びます:

  • Exterior
  • Interior_Large
  • Interior_Medium
  • Interior_Small

image (21)

図21: AkSpatialAudioVolumeにInteriorタグ・Exteriorタグを追加

最後に、World Outlinerのインスタンスの名前を命名規則に従い変更します(プレフィックス「AX」、続いてRoomの設定に応じて「LR」または「Room」、続いてレイアウトドキュメントにある残りの名前)。その後にWorld OutlinerのインスタンスをAudio / SpatialAudio /<Level>フォルダに移動します(図5参照)。

  • Brush Editingツールでボリュームの形状を整える

フェーズ1では空間の輪郭にボリュームのかたちが沿うように、かたちを修正してゆきます。アクタがRoomでない場合は、Spatial Audio Layoutドキュメントで定義されたGeneralまたはSpecificゾーンの線をトレースするだけで充分です。アクタがRoomである場合は、該当するエリアの端にぴったりと沿うように時間をかけてボリューム形状を整える必要があり、包含するエリア全体のかたちに近づけます。

この作業にはUnreal EditorのBrush Editingツールが最適です。あいにくこの機能を踏み込んで説明することは、今回の目的の範囲外です。前述したようにSpatial Audioの実装を担当するサウンドデザイナーは、このツールに充分に慣れる必要があります。インターネットを探せば頂点の移動や面の押し出しを教えるチュートリアルが多数あります。言うまでもなく数をこなすことで上達しますから、最初は難しすぎると感じるかもしれませんが、努力する価値が絶対にあります。

いくつかの技をご紹介します:

1. Brush EditingツールのショートカットはUEバージョン4.xでShift+4、UEバージョン5.xでShift+7です。
2. AkSpatialAudioVolumeのDetailsタブにEnable Edit Surfacesというボタンがあり、これを押すといまのボリューム以外のアクタがすべて非表示となり、Brush Editingツールモードに入ります。Disable Edit Surfacesをクリックするとツールが終了し、非表示となっていたアクタがすべて再表示されます。

image (22)

図22: AkSpatialAudioVolumeの2つのEdit Surfacesボタン

3. Roomボリュームの形状をつくる時に気づいたのですが、垂直エッジの上下の頂点を両方とも選択して同時に移動させることで2つの頂点を同一平面上に保つことができ、つくり出される三角形が少なく便利です。

BrushEditing1

GIF 1: 2つの頂点を同時に移動する

4. 2つの頂点の選択は、ViewportのOrthographicビューのTopまたはBottomで簡単にできます。

BrushEditing2

GIF 2: Top Orthographicビューで頂点を垂直に選択する

5. 私はまずはじめにルームの主要な開口部の1つをカバーし、そこから作業をすすめるようにしています。開口部のエッジを固定することにより、この特定の開口部のためのサーフェスを確保することができ、ポータルの配置の正確さについて心配する必要がなくなります。

6. 新しいサーフェスを追加する最も簡単な方法は押し出しで、形状を増やすための頂点が追加されますが、押し出すサーフェスに気をつけてやり過ぎないようにしなければ、ボリュームが複雑になりすぎ、変更しづらくなってしまいます。

7. 終わりましたら不要な頂点がないかを確認してください。不要な頂点は削除せず、残す予定の最寄りの頂点に結合します。

BrushEditing3

GIF 3: 不要な頂点を結合させる

形状を整えて仕上げたアセットは入っているエリアを充分にカバーする必要があり、エリアのエッジに密接に沿いながら隣接するスペースにはみ出さず、ほかのルームとも重ならないようにします。Room同士が重なってしまうと、ポータルのないエリアで問題が発生する可能性があります。エミッターやリスナーの入っている可能性のあるエリアは特に注意を払い、周囲の壁に完全にフィットしなかったとしてもボリュームを調整してカバーしなければ、ボリュームが突然下がったり不適切なフィルタリングが適用されたりするなど、音の再生に問題が生じてしまいます。

問題が起きるのはエミッターやリスナーがポータルのないサーフェスを通り抜け、Roomの反対側や、重なっている別のRoomに入った時などです。ボリュームは目に見えないため、リスナーとエミッターの間にサーフェスがあることに気づかないかもしれません。リスナーとエミッターが異なるRoomにある場合は、お互いの視界に入っていても、両者の間のエッジにおける新たな直接パスや回折パスを計算する必要があります。そこにポータルが存在しない場合はパスが妨害されすぎて、あるいはパスが長すぎて、発せられた音がリスナーに聞こえない可能性があります。

このような手作業がいかに面倒であるかをAudiokineticの優秀なスタッフは認識しており、プロセスをスピードアップするためのツールを提供するために最善を尽くしてくれています。AkSpatialAudioVolumeやAkAcousticPortalにあるFit to Geometryオプションは、単純な箱型の部屋や廊下でできている建物のジオメトリでは、まるで神からの贈り物のように便利に感じるかもしれませんが、私たちのゲームでは出入口付きの洞窟、隅っこ、曲がりくねったトンネルなど複雑で規則性のないエリアが目立ち、輪郭をうまく追えません。ボリューム形状ができたとしても手作業による調整が必須だと思われ、私たちのゲームに使用する意味がありません。

Volume2

GIF 4: 適切に配置されたAkSpatialAudioVolume(例)


  • AkAcousticPortalアクタをレベルに配置する

AkAcousticPortalアクタを配置するためには、AkSpatialAudioVolumeと同様にPlace Actorsパネルでアクタタイプを選択し、レベル内にドラッグ&ドロップします。

アクタのインスタンスを作成した後に、それがWorld Outlinerで選択されて表示され、Detailsタブが開きます。そこでPortalのInitial Stateを設定しますが、OpenまたはClosedとし(デフォルトはOpen)、適切なSpatialAudioVolume Collision Presetを選択します。

次にWorld Outlinerのインスタンスの名前を、命名規則に従い変更します(プレフィックス「AX_Portal」、あとはレイアウトドキュメントからとった名前)。その後にWorld OutlinerのインスタンスをAudio / SpatialAudio / <Level> / Portalsフォルダに移動します(図5参照)。

今度はアクタの位置をこのポータルで表したい開口部の位置に変えます。形状をTranslate、Rotate、Scaleのツールを使いながら整え、開口部を完全にカバーします。ポータルのY軸を開口部に垂直に置き、片方の空間からもう一方の空間への線にY軸が沿うようにします。X軸の方向にも注意する必要があり、これでポータルの前面が決まります。アクタはViewportに黄色の帯として表示され、向きが分かりやすくなっています。

image (23)

図23: 適切に配置された AkAcousticPortal(例)

X軸を延長・短縮することによりポータル幅が定義されます。ポータル幅は2つの音響空間の間のトランジションが起きるエリアを表し、クロスフェードを空間的に示したものと解釈することができます。ポータルの深さが深いほど、トランジションはより緩やかなものになります。

AkAcousticPortalにはアクタを正しく配置できたかどうかを示す色表示があります。ポータルは必ず1つ以上のボリュームに添付する必要があります。またポータルの前後のルームは違うルームとする必要があります。ポータルにボリュームが関連付けられていない場合や、ボリュームとボリュームの間にポータルが正しく配置されていない場合は赤色で表示されます。

Portal3

GIF 5: AkAcousticPortal配置表示

:AkAcousticPortalは隣接するAkSpatialAudioVolumeごとに1つのエッジだけをカバーするように配置しない限り、正しく機能しません。配置が誤っている場合、ボリュームの表面とPortalが交差する点にリスナーが来た時に音が途切れる可能性があります。このためAkSpatialAudioVolumesをモデリングする際、ボリュームの1つの面だけが開口部全体をカバーするようにボリュームを修正する必要があるため、特に注意することが大切です。

私は2つの隣接するRoomの形状をつくりネットワークをつくる場合、Room同士の間に何もない空間ができないよう、開口部分でRoom同士を繋げることが最良であると分かりました。こうすることによりトランジションがどこで起ころうとも、トランジションはポータル経由となり、ポータルのないRoomの表面経由でないことが保証されます。

BrushEditing4

GIF 6: 隣接するRoom間に空のスペースがないネットワーク


フェーズ2: Wwiseでの作業

次にWwise Authoringツールで各AkSpatialAudioVolumeやそれぞれのWwise RoomVerb ShareSetプリセット用にAuxiliary Busを作成し、そのパラメータを定義します。

  • Auxiliary Busを作成する

「Wwiseオブジェクトの整理」セクションの手順に従っていれば、すべてのAuxiliary Busに適切な名前が付き、Master-Mixer階層の正しい位置に配置されているはずです(図2参照)。各Auxiliary BusのPositioningタブにPositioning、Attenuation、Diffractionの関連設定が入っています。Listener Relative Routingを有効にし、3D SpatializationをPosition + Orientationに設定します。

Wwiseバージョン2019.2以降はAuxiliary Busに減衰カーブを割り当てる必要がありません。エミッターの地点からリスナーの地点までの距離を計算し、この距離をエミッターにすでに適用されている減衰に使用します。AttenuationカーブをAuxiliary Busに適用することによりポータルから発せられるリバーブをさらに処理できるため、エミッター自体に設定されている減衰が足りないと感じる時はAttenuationプリセットを追加してください。

ポータルを経由したボリュームのリバーブに回折や透過損失による影響を与えたい場合は、Enable Diffractionを有効にします。

image (24)

図24: 適切に設定されたAuxiliary BusのPositioningタブ

ほかのボリュームのRoomVerbエフェクトを適用するリバーブエフェクトは、Auxiliary BusのGeneralタブでUse game-defined aux sendsにチェックを入れます。

image (25)

図25: AUXバスのUse game-defined aux sendsを有効にする


  • Wwise RoomVerb ShareSetプリセットの作成とアサイン

事前に定義した方法で、Wwise RoomVerbのプリセットがShareSetsタブで作成されます。そのパラメータはボリュームの音響特性や、サウンドデザイナーの制作意図を考慮して定義します(図1参照)。

Auxiliary BusのEffectsタブでWwise RoomVerbプラグインのインスタンスをアサインし、適切なShareSetプリセットを選択します。

image (26)

図26: 適切なWwise RoomVerbプリセットをアサインする


フェーズ3:Unreal Editorでの作業

  • Auxiliary Busの作成とアサイン

フェーズ3でAuxiliary BusをWAAPI PickerからContent Browserの適切なフォルダにドラッグ&ドロップして、Unreal Editorの中でAuxiliary Busアセットを作成し、必要に応じてそれをSoundBankに追加することにより、このAuxiliary Busを該当するAkSpatialAudioVolumeにアサインすることができます。

バスをアサインするためにはボリュームを選択し、そのDetailsタブのLate ReverbカテゴリにあるAux BusプロパティでAuxiliary Busをドラッグ&ドロップするか名前で検索して追加します。

image (27)

図27: 適切にアサインしたAuxiliary Bus

  • ルームトーン

AkSpatialAudioVolumeの適切な配置とレベル内の場所の重要性については、すでに述べた通りです。Roomトーンという機能を使用してボリュームそのものにAkEventをポストすることにした場合、ボリュームの位置と回転を使用します。ボリュームの位置と回転がRoomトーンの位置と回転となり、ボリュームの正面がサウンドの正面の向きとなります。サウンドのPositioningタブでPosition + Orientationを選択した場合、私たちがルームの中にいる間はサウンドのステレオイメージがルームと一緒に回転しサウンドが空間に固定されているかのようで、さらにリアルになります。

通常のAkAmbientSoundとRoomトーンの主な違いは、リスナーがボリュームの内側にいる時にRoomトーンとリスナーの間の距離が常にゼロとして処理されることです。リスナーがボリュームから出た時にエミッターが最寄のポータルに配置され、距離はポータルからリスナーまでが計算されることを、Roomトーンの減衰カーブを設計する時に覚えておいてください。

テストとトラブルシューティング

Wwise RoomVerb

Wwise Authoringツールでプリセットを編集しながらパラメータの変更を耳で確認することができないため、パラメータのテストはプレイセッション中に行う必要があります。セッションを開始してからWwise Profilerに接続し、ゲームをプレイしながらエフェクトの値を変えます。リバーブを励起させて変化を確認するためには、特徴的なトランジェントのあるサウンドを配置し、必要に応じてボリュームとボリュームの間を移動させてトリガーさせるのが最も簡単です。私が『Scars Above』でよく使ったのはケイトの近接攻撃の時の空を切る音で、理由はPlayer Characterが操作可能でいつでも使えるからです。

Rooms and Portals

RoomやPortalのトラブルシューティングの主な目的は、レベル内でAkSpatialAudioVolumeによって充分にカバーできていない部分を見つけることです。カスタムツールを使わない場合はリスナーを操作して(一般的にカメラのスプリングアームに添付されています)、ボリュームの面と周囲の壁が一致するであろうゾーンのエッジに沿ってリスナーを手動で動かしながら確認します。ボリュームはゲームプレイ画面に表示されないため、サウンドの問題は耳を頼りに見つけるしかありません。サウンドの問題とは急なボリューム低下や処理方法の突然の変化などで、これはリスナーがポータルではなくサーフェスを通り抜けてボリュームの外部に出た場合、Diffraction値やTransmission Loss値が高く跳ね上がってしまうために発生します。問題のあるエリアを見つけ時はプレイセッションを中断し、エリア全体が正しく覆われるようにボリュームをさらに修正し、再度テストします。

ボリュームが空間を充分に覆っていないエリアを特定するための分かりやすい印が、Viewportで編集する時に見えてしまうボリュームのエッジです。エッジは黄色の線で示されます。ジオメトリから突き出ている線がある場合、リスナーがこの線で繋がっているサーフェスを通りボリュームに覆われていないエリアに出てボリュームを脱出してしまう可能性があり、サウンドの問題が生じやすくなります。

image (28)

図28: AkSpatialAudioVolumeのエッジが周囲のジオメトリから突き出てしまった例

あなたのゲームにおいて目に見えないブロッカーなど、ほかの方法を使いカメラ(そしてリスナー)をブロックしている場合はそのようなアクタにボリュームを揃えることができますが、私の経験上、ゲームでもエディターでも目に見えるStatic Meshの中にボリュームを合わせることがボリュームの壁をリスナーが通過できないようにする、なかなか安全な方法であると思います。もちろんあなたの経験も違うかもしれませんが、やはり何度もテストするに限ります。

  • Visualize Rooms and Portals

Wwise Unrealインテグレーションの便利なツールの1つがVisualize Rooms and Portalsです。これをProject Settingsで有効にすることにより、レベルを移動しながらAkAcousticPortalアクタのインスタンスや隣のルームとの関係を見ることができます。AkSpatialAudioVolumeの境界線は表示されませんが、このツールで提供される情報でポータルやボリュームのピボットが正しく配置されているかを確認することができ、非常に有益です。

image (29)

図29: Visualize Rooms and Portalsオプションを有効にした時のゲームプレイの様子

Visualize Rooms and PortalsはWwise Integration Settingsの一部であり、これをオンにした場合はDefaultGame.iniが変更されてリポジトリにコミットされるため、チーム全員にポータルを見せたい時を除きコミット前にオフにしてください(すぐにQAから電話がかかってきます)。

プログラミングチームで余裕がある場合は、Spatial Audio用のデバッグツールをカスタム作成することを強くおすすめします。この目的のために私はプログラマーたちの助けを借り、VisualizeAkGeometryというSpatial Audio可視化のカスタムソリューションを考案・実装したため、その他のカスタムツールとともに本書の終わりで紹介します。

Ak Geometry

Ak Geometry APIとは?

Ak Geometry APIはRooms and Portals APIと合わせて使用し、サウンドが固形の障害物を回る時の回折エフェクトや障害物の表面から反射する様子をシミュレーションできる、Wwiseのツールセットです。

回折と透過損失

回折とは音波がエミッターからリスナーに向かう途中で障害物に遭遇し、その障害物に妨害されて障害物のエッジ周りを一定の角度で曲がり、減少したボリュームと制限された周波数でリスナーに到達する現象です。障害物が音を通さない素材でできている場合、主要な音源として直接パスではなく回折パスが優先され、(仮想)エミッターが障害物のエッジに配置されます。

透過損失はエミッターとリスナーの間にある障害物が大きすぎるため、音が障害物のエッジを回り切れず、障害物を通過する音の直接パスだけが残る時に発生します。障害物の素材特性に応じて音が部分的または完全に遮断され、ここでもボリュームが減少して周波数スペクトルが制限されます。

Ak Geometry APIの一部であるDiffractionとTransmission Lossが、Wwiseのオクルージョンとオブストラクションのパラメータを定義し、Unreal Engineのオクルージョンシステム全体を置き換えます。これらのパラメータを使用してWwiseオブジェクトのVolumeカーブ、HPFカーブ、LPFカーブを形成することができ、オブストラクションとオクルージョンという2つの音響現象を正確にシミュレーションします。

Ak Geometry APIを使用するのはいつ?

例えば、新しく作成したRoomの真ん中に1つのStatic Meshでできた石柱があり、音がその周りで曲がり、表面で反射するとします。この石柱にAkGeometryコンポーネントを追加することにより、メッシュのコリジョンをSpatial Audioが読み取るジオメトリに変換することができます。このジオメトリはWwiseエンジンで表現されるレベルジオメトリの近似値として機能し、直接パスや回折パスの計算、そしてDiffractionパラメータ値やTransmission Lossパラメータ値の設定に使用されます。

Late Reverbのシミュレーションにしか使わないボリュームで覆われた屋外など、いま回折が起こっていないエリアで使うとさらに効果的です。この場合、Spatial Audioの計算に含めたいすべてのStatic MeshにAkGeometryコンポーネントを手動で追加します。複雑なメッシュが多数配置されていないレベルでは、時間をかけずに簡単に採用できる手法です。三角形が多数あるメッシュにおいては、AkGeometryコンポーネントを追加した場合、負荷が大きすぎるかもしれません。このような時こそBrush Editingスキルを活かし、障害物をAkSpatialAudioVolumeで覆い、かなり簡素化したジオメトリを作成します。

Rooms and Portals、Ak Geometry、そしてボリュームを組み合わせることで、オブストラクションまたはオクルージョンでサウンドに影響を与える必要のある、すべてのエリアや障害物をカバーすることができます。

実装

Ak Geometryの実装は主に2つの方法があり、既存のStatic MeshにAkGeometryコンポーネントを追加する方法と、1つ以上のStatic Mesh(またはその他の障害物)を覆うAkSpatialAudioVolumeアクタを形成する方法です。

Static MeshにAkGeometryコンポーネントを追加する

既存のStatic MeshにAkGeometryコンポーネントを追加する手順を説明します。まずはじめにViewportで対象アクタを選択し(World Outlinerでハイライト表示されます)、+Add ComponentボタンをクリックしてからAkGeometryコンポーネントを見つけます。

image (30)

図30: Static MeshにAkGeometryコンポーネントを追加する

このコンポーネントを選択し、GeometryカテゴリのMesh TypeパラメータでSimple Collisionを選択し、Enable Diffractionをオンにします(すでに有効になっていない場合)。

image (31)

図31: AkGeometryコンポーネントのDetailsタブ

コンポーネントが生成するジオメトリの複雑性は基本的に制御できないため、このソリューションで結果的に負荷が大きくなりすぎることもあります。ComplexでなくSimpleコリジョンを使用しているにもかかわらず、複雑になりすぎたり機能さえしなかったりすることもあるため、注意が必要です。Static MeshにSimple Collisionがない場合、新しく作成するかテクニカルアート担当チームに助けを求める必要があります。

AkSpatialAudioVolumesをAkGeometry として使用する

最適化などの理由でメッシュにAkGeometryコンポーネントを追加したくない場合は、AkSpatialAudioVolumeを代わりに使うことができます。その場合はボリュームのアクタインスタンスをレベルに追加し、メッシュが充分に覆われるように形成します。このボリュームのDetailsタブでEnable Surface Reflectorsをオンにし、Enable Late ReverbとEnable Roomをオフにします。さらにEnable Diffractionがオンになっていることを確認し、SpatialAudioVolumeBlockコリジョンプリセットをアサインします。

image (32)

図32: 適切に配置・設定されたStatic Mesh周りのAkSpatialAudioVolume

コリジョンプリセットのSpatialAudioVolumeBlockはこの目的のためにあり、Custom Listenerが紐づいているAudioTraceチャンネルをボリュームでブロックすることができます。これを使いシンプルなAkGeometryボリュームを短時間で作成することができ、ボリュームの境界線内にリスナーが入る心配がありません。Custom Listenerについては本ドキュメントの「私たちのカスタムソリューション」のセクションをご覧ください。

  • 既存RoomのDiffractionをオンにする

オブジェクトのように既存Roomの周りをサウンドが回折するようにしたい場合、DetailsタブのGeometry SettingsカテゴリでEnable Diffractionをオンにします。

image (33)

図33: AkSpatialAudioVolumeでDiffractionを有効にする

完璧な凸形状でないボリュームの、ボリュームが内側に曲がるエッジにおいて回折が起きるためには、これを有効にする必要があります。

image (34)

図34: 凹形状のAkSpatialAudioVolumeの、有効にした場合にサウンドが回折する選択されたエッジ

image (35)

図35: エミッター(e)からリスナー(l)までの経路の例


カスタムソリューション

『Scars Above』では音を回折させる必要のある屋外の壁、階段、その他大型の物体が多くあるエリアがありました。これらのメッシュにAkGeometryコンポーネントをアサインしようにも多すぎたり、Brush Editingツールを使い周りにAkSpatialAudioVolumeを形成しようにも面倒で時間がかかり過ぎたりし、どちらも現実的ではありませんでした。こういった場合はプログラマーに相談し、Ak Geometryをすばやく正確に作成するカスタムソリューションを作ることをおすすめします。私たちがSplineAudioWallと名付けたツールの計画とイテレーションはとても楽しい経験となり、詳細を本書の「私たちのカスタムソリューション」で述べています。

テストとトラブルシューティング

作成したジオメトリにおいてもRooms and Portalsと同様に、ジオメトリの周辺で音が正しく回折しなかったり、エミッターやリスナーがジオメトリに不要に入ってしまったりする問題がないかなどのテストは必須です。Unreal EditorとWwiseのどちらにおいても回折をテストする方法がいくつかあり、いずれも問題のあるジオメトリを特定するための貴重な情報を提供し、望む結果が得られるまで問題を修正してパラメータを微調整する機会を提供してくれます。

Unreal Editorでの作業

  • Draw Diffraction

ゲームプレイセッション中にエミッターの回折パスをテストするために、AkComponentのDetailsタブにあるSpatial Audio / Debug Drawカテゴリにおいて、Draw Diffractionをオンにするという選択肢があります。

image (36)

図36: AkComponentのDebug DrawのDraw Diffractionを有効にする

テスト中のゲームプレイでサウンドを再生した時に、AkComponentを含むエミッターからAkGeometryの一部である障害物のエッジ周りに向かい、緑色の線が表示されます。サウンドがエッジを回折するポイントに紫色の小さな球が表示されます。これを使いジオメトリの境界線が適切に設定されているかどうか、またジオメトリが障害物を充分に覆っているかどうかを判断することができます。

image (37)

図37: ゲームプレイ中に描写される回折パス(例)

この線は開発者限定の機能であるためビルドには表示されませんが、変更をリポジトリにコミットする前に、グッドプラクティスとしてAkComponentのDraw Diffractionオプションをオフにするようにします。

  • Visualize Rooms and Portals

Visualize Rooms and Portalsツールも、AkAcousticPortalアクタのエッジ周りの回折パスをテストするために役立ちます。さきほどのDraw Diffractionと組み合わせることで、ポータル周辺のエミッターからリスナーまでの回折パスが表示されます。

Wwiseでの作業

Wwise側のテストにはAuthoringツールの2つの異なるProfilerレイアウトを使用し、直接パスと回折パス、およびDiffractionとTransmission Lossのパラメータのトラブルシューティングに必要な情報を取得することが含まれます。

  • Game Object Profiler

Game Object Profilerではリスナーの位置、サウンド再生中のすべてエミッタの位置、Spatial Audioに送られるジオメトリ、そして相互に影響し合うサウンドの伝搬や回折の様子を描写することができます。ゲームセッションを開始し、次にAuthoringツールに接続します。Game Object Profilerを開くと(ショートカットF12)、いま述べたすべてのオブジェクトが平面上に表示されます。ここではGame Object Profilerの使い方を詳しく説明しませんが、Spatial Audioの実装内容を示すジオメトリ、パス、Diffraction値、Transmission Loss値などが視覚的に確認できる非常に便利なツールです。

image (38)

図38: Game Object Profiler内のプロファイリングセッション(例)

  • Voice Profiler

Voice ProfilerでDiffractionパラメータやTransmission Lossパラメータの変化を、より詳細に追跡できます。Voice Inspectorにサウンドを再生している各Game Objectのパス全体と、パスに随時適用される各種処理が表示されます。プロファイリング対象のサウンドを再生するゲームオブジェク トリファレンスの、子として表示されるDiffractionパラメータやTransmission Lossパラメータも表示されます。

image (39)

図39: Voice Profilerに表示されるパラメータDiffraction、Transmission Loss

最適化

Spatial Audioの負荷が高くなることもあります。Spatial Audio計算の対象となるオブジェクト数、ジオメトリの複雑さ、そして求められるフィデリティの加減にもよりますが、各瞬間ごとに実行する計算がオーディオスレッドに負担をかけすぎることがあります。リソースはいつも通り貴重であり、賢明なサウンドデザイナーであればSpatial Audioの実装を最適化する手立てを考え、オーディオチームがCPUにかける負担を軽減する措置を講じるでしょう。

ゲーム内で最大限に機能するSpatial Audioを実現させたいと考えるサウンドデザイナーのために、私の最適化の攻略方法をここでいくつかご紹介します。

AkGeometryとRoomを関連付けることによる最適化

AkGeometryコンポーネントを持つアクタが1つのRoomで完全に覆われている場合、このコンポーネントをRoomに関連付け、リスナーがこの障害物と同じRoomにいる場合のみ、このアクタ周りの音の伝搬を計算した方が望ましいです。そのためにはアクタのAkGeometryコンポーネントを選択し、OptimizationカテゴリのAssociated Roomプロパティで該当するRoomインスタンスをアサインします。

image (40)

図40: Static MeshのAkGeometryコンポーネントにRoomを関連付ける

:これを行うためにはRoomとAkGeometryコンポーネントのアクタが、同一サブレベルにある必要があります。

Roomが1つのジオメトリに関連付けられた場合、このRoomはレベル内のその他のグローバルジオメトリ(どのRoomにも関連付けられていないジオメトリ)を考慮しなくなることにご注意ください。

完全に凸形状であるボリュームはDiffractionをオフにする

ジオメトリに含めたいすべてのAkSpatialAudioVolumeで、Enable Diffractionをオンにする必要があることは前述した通りです。ポータルは必ずデフォルトでエッジ周りをサウンドが回折するため、完全な凸形状のRoom、つまり音を回折させたいエッジが全くないボリュームでは、このオプションをオフにした方が無難です。

1番分かりやすいのは、ボリュームごとにそのルームのすべてのポータルから、同じルームのほかのポータルが視界に入っているかを確認する方法です。答えがイエスであれば、このボリュームをジオメトリ計算から外しても問題ないと思われます。

床のサーフェスをオフにする

Spatial Audioジオメトリに含めるRoomボリュームがあるとします。大抵のRoomは壁、天井、床で構成されています。このような空間では床面すなわち底面からの回折を計算する必要はほぼないため、これらのサーフェスをAkGeometry計算から除外しても問題ありません。これでAkGeometryの三角形を減らせ、ボリュームの下の回折パスを計算する必要性がなくなります。

Brush Editingモードで対象となるボリュームの床サーフェスを選択し、Geometry SurfacesカテゴリにあるEnable Surfacプロパティ横のボックスのチェックを外し、サーフェスをオフにすればよいのです。

image (41)

図41: Roomボリュームの床サーフェスを無効にする

不要になったポータルを削除する

レベルにRoomやPortalを配置し終わり、すべてが問題なく動作することを確認した後に、追加したポータルの中にゲームプレイ中に実際に音を通さないポータルがないかを自問する必要があります。レベルデザイナーが芸術的な観点や採光のために、開口部を壁や天井(時には床にまで)設けているかもしれません。それぞれの開口部に専用のポータルがあることでゲーム内の形状をジオメトリで忠実に模倣することができ、反対側で音が発生した場合はそれが確実に聞こえるという安心感があります。

一方、実際には反対側で音が発生する状況など、訪れないポータルがあるかもしれなません。ポータルごとに各種エミッター、リスナー、同じRoomに接続するほかのポータルとの位置関係に応じてパスを計算する必要があるため、このようなポータルを排除することによりSpatial Audio実装が大幅に改善されるはずです。

ジオメトリをシンプルにする

当たり前のことかもしれませんが、ジオメトリをシンプルにすることにより計算量が減り、CPUの動きがスムーズになります。ジオメトリの簡略化を検討する際、ゲーム内のあらゆる実用的なケースを考慮し、特定の状況で達成したい詳細レベルを考えてください。例えば丸みを帯びた柱に沿って丹念に形状を整えたボリュームを設定することにより、精度は高くなるかもしれませんが、そのようなフィデリティをプレイヤーが実際に知覚できないのであればゲームに不要であり、よりシンプルな形状でも同じ結果を得ることができないかを検討します。

このような場合は新しいボリュームを作成するか既存のボリュームで必要な頂点を選択し、余分なものを結合するだけで三角形の数を減らすことができます。

プラットフォームごとにSpatial Audioを設定する

まだSpatial Audioのさまざまな処理でオーディオスレッドが悪戦苦闘しているようであれば、プラットフォーム別のSpatial Audio Initialization Settingsを見て、Wwise Integration側で改善できる点がないかを確認してみてください。これらの設定はWwise Project Settingsカテゴリにあり、多少のフィデリティを犠牲にしてCPUへの負担を軽減できるパラメータが数多くあります。私が詳細を説明するまでもなく、大半の設定は名前から内容が分かり、それ以外はツールチップやドキュメントで説明されています。

以下は私たちがPS4とPS5のプラットフォームで納得できると感じた設定です。

image (42)

図42: 『Scars Above』のPS4プラットフォームのSpatial Audio Settings

image (43)

図43: 『Scars Above』のPS5プラットフォームのSpatial Audio Settings

World Composition関連

作業中のレベルがWorld Compositionの一部であり、ほかのレベルと一緒にストリーミングされている場合、Spatial Audioアクタをホストするパーシスタントサブレベルを別途用意し、SUB_Sound_SpatialAudioなどとし、そこにすべてのSpatial Audioアクタを入れることを提案します。これはWwiseバージョン2021.1.9とUnreal Engineバージョン4.27.2で、Spatial Audioアクタをストリーミングしにくいためであり、多数のRoom、Portal、その他のAkジオメトリをランタイムに同時にロード・アンロードした時に、サウンドに若干の不具合やフレームドロップが発生する可能性があります。これらのアクタをすべてパーシスタントなサブレベルに入れることで問題を迂回でき、リソースへの負荷を抑えられます。(設定が適切であればSpatial Audioジオメトリを大量に同時ロードした場合にも、問題が生じないはずです。『Scars Above』では1つのパーシスタントレベルに1000個以上のアクタを入れましたが、ゲームは問題なく動きました。)

私たちのカスタムソリューション

Audiokineticが提供するWwise Spatial Audio APIのツールで、ゲームの音響空間を構築してテストするための機能をほとんどカバーできました。ただしプロジェクトはそれぞれに違いがあり、私はプログラミングチームの助けを借りながらSpatial Audioパイプラインを向上させるカスタムソリューションをいくつか作成する必要性を感じました。これらのソリューションにより効率性とスピードの両面でワークフローが改善されたため、カスタムソリューションだけが提供できる可能性を実現するために、やはり利用可能なツールセットや周囲の人々と積極的にかかわることを強くおすすめします。

カスタムリスナー

私たちはWwise Unrealインテグレーションのリスナー機能を採用しまたが、柔軟性を上げるために多少拡張しました。私たちのカスタムリスナーは専用のスプリングアームに設定されており、これがカメラに紐づいていますが、カメラとは別に動かすこともできます。カスタムリスナーの位置はカメラとPlayer Characterの間で自由に設定できます(私たちのゲームではPlayer Characterからの距離の2/3あたりに設置することが最も自然に感じました)。カットシーンでカメラが遠ざかる時は、リスナーを一緒に移動させることもPlayer Characterと同じ位置に置くこともできます。

Spatial Audioとの関係ではSpatialAudioVolumeBlockコリジョンプリセットを設定したジオメトリに、リスナーが立ち入ることができないようにしました。カメラとリスナーはそれぞれのスプリングアーム上にあるため、カメラをブロックしていないAk Geometry(私たちが設定した目に見えないボリュームなど)は、リスナーをブロックします。リスナーがジオメトリのオクルージョンで妨害されるのを防ぎ、安全装置のように機能します。障害物の周りにあまり複雑でないジオメトリを作成することもできます。

  • ShowDebug AudioListenerコマンド

ShowDebug AudioListenerはデバッグ用につくられたコンソールコマンドで、Custom Listenerコンポーネントの実行時に更新される現在位置を青い玉として表示します。スプリングアーム上のリスナーの位置を確認することができます。さらにリスナーがボリュームの範囲を出た時や、意図せぬかたちで妨害された時が分かります。リスナーの現在のトランスフォームデータも表示してくれます。

Listenernew2

GIF 7: コンソールコマンドShowDebug AudioListenerでリスナーをデバッグする

VisualizeAkGeometry

Visualize Rooms and Portalsを自由に使えることはすばらしいのですが、ポータルやポータルとボリュームの接続だけでなく、すべてのAkGeometryをゲームプレイ中に可視化できるとさらによいと思いませんか?

私たちはVisualizeAkGeometryというデバッグツールをつくり、これを実現しようとしました。有効にするとボリュームやレベル内のほかのジオメトリとボリュームの関係を見ることができ、ゲームを実際にプレイしながらとても簡単に問題箇所を見つけたり、リスナーとエミッターのパスをデバッグしたりできます。

私たちはいくつかのビューを実装しました。ツールのオン・オフをトグルできるほか、ジオメトリの表示を半透明のメッシュ、ワイヤーフレーム、または両方にすることができ、ビューの深度も2種類あります。最初の深度ではAk Geometryがレベル内のその他アクタより前面に表示され、ボリュームの完全な形が見える一方、次の深度ではこのジオメトリがほかのレベルジオメトリの後ろに隠れるため、Brush Editingセッション中に見落としてしまった突出するエッジや面が見えてきます。このビューではポータルがあるべき開口部の場所のボリューム面も見えるため、あるエリアから別のエリアにリスナーやエミッターが移る位置を特定することができます。

VisualizeAkGeometry4

GIF 8: VisualizeAkGeometryの表示モードの違い

SplineAudioWalls

障害物の周りにAk Geometryを簡単にすばやく作成しやすいように、スプラインアクタのポイントを柔軟かつ迅速に追加・移動できるアクタクラスを実装し、さらに各ポイントで簡単に単純メッシュを生成して編集できるようにしました。

Brush Editingはすでにあるレベルジオメトリの周りにボリュームを形成する場合は特に使いづらかったのですが、これによりBrush Editingツールに頼らずAk Geometryを作成できるようになりました。SplineAudioWallアプローチの方が直感的に使え、主に壁をシミュレーションするためのツールですが、さまざまな種類の形状を囲むことができ、Brush EditingツールよりもAk Geometryに適したワークフローです。

レベルにアクタを配置した時、短いスプラインとシンプルな紫色のボックスが表示され、これがジオメトリの基本となります。スプラインに新しいポイントを自由に追加することにより、新しいボックス(プロシージャルメッシュ)が即座に作成されます。個々のポイントにおいてプロシージャルメッシュを移動、回転、そして自由な方向へ拡大縮小することができます。

アクタの編集が終わるとスプラインポイントの数に応じて、複数のシンプルなボックスで構成された1つの複雑な形状が完成します。このプロシージャルメッシュをStatic Meshにベイクしますが、Static MeshにはAkGeometryコンポーネントが添付されており、ジオメトリをWwise Spatial Audioエンジンに送ります。ベイクされたメッシュにはデフォルトでSpatialAudioVolumeBlockコリジョンプリセットがアサインされており、境界内にリスナーが立ち入るのを防いでくれます。

このアクタにはある便利な機能がついていて、最適化のためにすべての床サーフェスをオフにすることができます。レベルの床に置かれることの多いアクタであるため、このオプションはデフォルトで有効です。

SplineAudioWall2

GIF 9: SplineAudioWallアクタのインスタンスの編集

このアクタはVisualizeAkGeometryデバッグツールで表示することもできます。AkSpatialAudioVolumeは水色、SplineAudioWallは紫色で表示されます。(GIF 8参照)

ところで新しいスプラインポイントを追加するたびに、Spatial Audioに送られるジオメトリに三角形が追加されるため、不要なポイントは必ず削除してください。

このソリューションの今後の改良点として、サーフェスごとのTransmission LossパラメータとAcoustic Textureの追加があります。『Scars Above』ではWwise Reflectを使わなかったため、これは優先しませんでした。

Weapon Tailスイッチ

『Scars Above』ではRoomの既存ネットワークを使い、Player Characterがいる空間の種類をそのInterior/Exteriorタイプとサイズから判断しています。

これを実現するためにPlayer Characterカスタムコンポーネントを作成し、AudioTraceチャンネルを使用して一定間隔でボリュームをトレースし、最もプライオリティの高いボリュームのアクタタグを返します。返されたアクタタグに基づき、Wwiseで適切なInterior/Exteriorステートを設定します。このステートはいくつかの目的に使いますが、Weapon Tailスイッチもその1つです。今回のWeapon Tailサウンドは4種類で充分と判断しましたが、それはExterior、Interior_Large、Interior_Medium、そしてInterior_Smallです。AkSpatialAudioVolumeの各インスタンスに、アクタタグを手作業で追加します。

image (44)

図44: V.E.R.A.ウェポンのTailスイッチコンテナのGeneral Settingsタブ

最後に

最後までお読みいただきありがとうございます。Spatial Audioに関する読者の疑問や課題が、私のアドバイスで少しでも解消しやすくなったことを願います。Audiokineticは常にSpatial Audio APIの改善を図っているため、時間が経つと本書の詳細も部分的に該当しなくなりますが、計画をしっかりと立てて整理し、慎重に実装し、トラブルシューティングと最適化をまんべんなく行うという基本はあまり変わることはないでしょう。私は今後もSpatial Audioの発展を注意深く見守るつもりであり、新たな発見や改良された手法を取り込み本書を更新してゆきたいと思います。

サポートとフィードバックを提供してくれたMad Head Gamesサウンドデザイナー仲間のDimitrije、Selena、Teodora、Marko、そしてEA DiceのNikolaに最大の敬意を表したいと思います。Mad Head GamesプログラミングチームのNina、Stevan、Nemanja、Dušanにも心から感謝します。AudiokineticのJulie、Adrien、Guillaume、Nathan、Louis-Xavier、Thalie、Masha、Maximilienからは、たくさんのアドバイスとブログというかたちで私の考えを発表する機会をいただき、大変感謝しています。

ミラン・アンティッチ

リード兼テクニカルサウンドデザイナー

Mad Head Games

ミラン・アンティッチ

リード兼テクニカルサウンドデザイナー

Mad Head Games

セルビア・ベルグレードのスタジオMad Head Gamesのリードサウンドデザイナー兼テクニカルサウンドデザイナー。カジュアルゲームやビッグバジェットゲームのサウンドデザインとオーディオシステム作成で豊富な経験を有し、特にUnreal Engineで開発されたAA・AAAプロジェクトでWwiseを活用することを得意とします。

LinkedIn

コメント

Replyを残す

メールアドレスが公開されることはありません。

ほかの記事

«11 – 11 : Memories Retold » のサウンドの舞台裏

« 11-11 : Memories Retold »...

10.4.2019 - 作者 ヨアン・モルバン(Yoann Morvan)

アウター・ワールドのサウンド - パート1

私たちオブシディアン...

3.9.2020 - 作者 オブシディアン エンターテインメント (Obsidian Entertainment)

Wwise+GMEゲーム音声ソリューション:様々な音声利用方法を解放し、プレイヤーに「リアルサウンド」を提供

13.1.2022 - 作者 Tencent Cloud

atmoky Ears ハイパーリアルなWwiseのヘッドフォン用スペーシャルオーディオプラグイン

atmoky Ears...

20.1.2022 - 作者 Markus Zaunschirm

ビデオゲームのサウンドのアーカイブ・パート1 基本編

30.3.2022 - 作者 ファニー・ルビヤール(Fanny REBILLARD)

『Scars Above』におけるオーディオ最適化の手段

はじめに 今回は私たちのゲーム『Scars...

14.2.2024 - 作者 ミラン・アンティッチ