このチュートリアルでは、UnrealのWwiseインテグレーションに導入されたSpatial Audio機能を紹介します。ゲームにスペーシャルオーディオを実装するためのワークフローを説明し、スペーシャルオーディオ機能(3Dバスや、3DスペーシャリゼーションのSound SFXや、Reflect Effectプラグインなど)をWwisオーサリングツールで初期化するための技術的情報を提供します。
このチュートリアルは、以下に示すセクションで構成されています:セクション A は、プロジェクトを準備するための情報で、それ以後のセクションは、それぞれ別のSpatial Audio機能についての説明です。どのセクションも、ほかとは独立して読むことができます。
 |
注記: Reflectプラグインを使うセクションで、SoundBankを生成するときに適切なライセンスが必要となります。 |
A - Spatial Audioチュートリアルの事前準備
 |
注記: Wwise Launcherに、すべてのチュートリアルのパラメータの入ったマップが、Unreal Demo Gameの一部として提供されています。このマップに沿って続けたい場合は、本セクションをとばしてください。マップの名前は、SpatialAudioTutorialMapです。 |
A.1. 新規プロジェクトの作成
以下の手順(Wwise 2019.2、Unreal 4.24を使った場合)に従い、作業環境を整えてください。
- Epic LauncherでUnrealを起動します。
- 新しいUnreal Project C++ Blankプロジェクト(スターターコンテンツなし)を作成します。
- Unrealを閉じる
- Wwise Launcherを起動する。
- Wwise をインストールする。
- Unreal Engineタブを選択する。
-
Integrate Wwise into Project...ボタンをクリックする。
-
Open in Wwiseボタンを使ってWwiseを起動する。
-
Open in Unrealボタンを使って、Unrealを起動する。
A.2. Wwiseプロジェクトの準備
このチュートリアルでは、Sound SFXと、それを再生するEventが必要です。
- Wwiseプロジェクトの中で、 Actor-Mixer HierarchyのDefault Work Unitで新しいSound SFXを作成し、サウンドを1つインポートします。
- General Settingsタブで、必ず Use game-defined auxiliary sends を有効にします。

Sound SFXの作成
- Positioningタブで、Listener Relative Routingを有効にし、3D Spatializationを Position + Orientation に設定し、Attenuationを追加してMax distanceを5000とします。

3D SpatializationをPosition + Orientationに設定
- Actor-Mixer HierarchyでこのSound SFXを右クリックし、 New Event > Play を選択します。

サウンドのEventの作成
- プロジェクトを保存する。
A.3. Unrealプロジェクトの準備
- 床と、部屋が2つある建物と、屋外の障害物を、好きな方法で作成します。SpatialAudioTutorialMapでは、建物にカスタムメッシュを使い、屋外の障害物には簡単なキューブのスタティックメッシュのコンポーネントを使いました。
- シーンに、エミッターを配置します:
- 前のサブセクションで作成したEventを、Waapi PickerからContent Browserにドラッグします。

Wwise PickerからContent Browserにドラッグ
- Content BrowserでEventをダブルクリックし、SoundBankリストで直接、新しいSoundBankを作成します。

SoundBankを作成

SoundBankを選択
- シーンにEventをドラッグし、新しい
AkAmbientSound
アクターを複数、作成します。
- 屋外に1つ、各部屋に1つずつ、配置します。

SpatialAudioTutorialMap
- BlueprintsメニューでLevel Blueprintを開き、"Event BeginPlay"と"Event Tick"を削除します。
- ユーザーインプットでイベントをトリガーします。
- 新しく作成したAkAmbientSoundを、World OutlinerからBlueprintにドラッグします。
- AkAmbientSoundノードで、"Post Associated Ak Event"ファンクションを探します。
- Blueprintバックグランドを右クリックして、"Left Mouse Button"を探す。
- Pressedアウトレットを、"Post Associated Ak Event" Execにつなげます。
- ほかのすべてのAkAmbientSoundアイテムで、同じ手順を繰り返します。

アンビエントサウンドをトリガーするために、ユーザーインプットを追加
- Level Blueprintを保存し、閉じます。
A.4. 設定を検証する
- 上部メニューで、Build > Generate SoundBanks....を選択して、Windows用にSoundBankを生成する。
- Output Logでバンクが正しく生成されたことを確認します。

Buildメニューで、Generate SoundBanksを選択
- シーンをスタートする。それぞれのボタンを押すと、3Dスペーシャリゼーションを適用したサウンドが再生されるのが、聞こえます。
- Wwise Authoringに接続し、Profilerレイアウトを開きます(ショートカットはF6)。
- シーンでサウンドを再生すると、下図のようなグラフが表示されます。

OutsideボタンのVoices Graph
B - Reflect
このセクションでは、Spatial Audio Geometryを使い、Reflectプラグインに反射面を送信します。音響環境で音が伝播するときに感じられるアーリーリフレクションを、シミュレーションします。
B.1. Wwiseプロジェクト
- ファクトリーAcoustic Texturesや、アーリーリフレクションのAuxiliary Busのプリセットを入手するには、Reflect Factory Assetsをインポートする必要があります。
- Project > Import Factory Assets... に移動します。
- Reflectを選択し、OKを押します。
- ファクトリープリセットを使い、アーリーリフレクションのAuxiliary Busを作成します:
- Master-Mixer Hierarchyで、Master Audio Busを右クリックします。
- New Child > Presets を選択し、Early Reflection Auxiliary Busを選択します。
- Effectsタブでエフェクトをダブルクリックし、以下を行います
- Max Distanceは、 A.2. Wwiseプロジェクトの準備 で設定したサウンドの減衰のMaximum distanceの5,000、またはそれ以上に、設定します。
- Speed of Soundを34,500に設定します。

ReflectのSpeed of Sound、Max Distanceを設定
-
A.2. Wwiseプロジェクトの準備 で作成したSound SFXの、Sound Property Editorに移動します。
- General Settingsタブで、Reflect Effectのある新しいAuxiliary Busを、Early Reflectionsの下に追加します

Wwiseで、サウンドにReflectを適用
- プロジェクトを保存する。
B.2. Unrealプロジェクト
このプロジェクトでは、建物と、床と、障害物が、音を反射するようにします。方法は2通りあり、AkSpatialAudioVolume を使うか、 AkGeometryComponent を使います。
AkGeometryComponent は、スタティックメッシュのアクターに追加できます。スタティックメッシュのジオメトリを、スペーシャルオーディオに自動的に送ってくれるのです。また、シンプルコリジョンメッシュを送信するように設定することもできます。簡単な形には、このコンポーネントを使うのが一番です。スペーシャルオーディオの演算負荷がすぐに高くなるので、三角形を送り込み過ぎないようにすることが大切です。
AkSpatialAudioVolumeは、ブラシボリュームです。オブジェクト周りに手作業で追加し、変形させる必要があります。もし複雑なスタティックメッシュがあれば、このボリュームを使い、単純な形で囲むことができます。
- SpatialAudioTutorialMapの障害物は、簡単なスタティックメッシュです。 AkGeometryComponent をすぐに追加できます。
- このアクターをクリックし、Add Componentをクリックします。Ak Geometryを選択します。
- Geometryセクションで、Simple Collisionを選択します

AkGeometryComponent
- 床に対しても、同じ手順を繰り返します。
- SpatialAudioTutorialMapの建物は、カスタムメッシュで作られています。この形状も AkGeometryComponent を使えるくらい単純ですが、チュートリアルの練習用に、 AkSpatialAudioVolume を使ってみます。AkSpatialAudioVolumes は、建物のドアの位置に開口部を作るのが面倒なのが唯一の欠点です。
- 3つの
AkSpatialAudioVolumes
を、シーンにドラッグ&ドロップします。
- 1つは、建物の外壁用に、建物の周りに設定します。
- 残りの2つは、室内の壁用に、それぞれの部屋の周りに設定します。
-
AkSpatialAudioVolumes
は3つとも、"Enable Surface Reflectors"を有効にします。
- "Enable Room"と"Enable Late Reverb"はチェックを外したままにしますが、詳しくは C - RoomとPortal で説明します。

Spatial Audio Volumeで、Enable Surface Reflectorsを有効にする
B.3. 設定を検証する
- SoundBankを生成します。
- シーンをスタートし、Wwise Authoringに接続します。
- Advanced ProfilerのVoices Graphビューに、Reflectエフェクトのある新しいAuxiliary sendが表示されます。
- プレイヤーの最初のポジションにおいて、屋外に配置されたサウンドを再生します。

OutsideボタンのVoices Graph、Reflect付き
 |
注記:
プレイヤーが屋外にいるときに、どちらかの部屋でサウンドを再生しても、そのサウンドは聞こえず、Reflectのセンドも表示されません。建物周りや、それぞれの部屋の周りに、開口部のないAkSpatialAudioVolumesを作成したからです。開口部を作成するには、ブラシオブジェクトを修正するか、Spatial Audio Portals( C - RoomとPortal 参照)を利用します。 |
- 次に進む前に、Profiler Settingsビューを開き、Spatial Audioが有効になっていることを確認します。
- Game Object Profilerレイアウトに移動します(ショートカットはF12)。
- Playerのカメラと、3つのエミッターに注目してください。
- Game Object 3D Viewerに、各反射面が表示されます。
- サウンドを再生すると、そのサウンドがどこから来るのかが分かるように、アーリーリフレクションのレイが描写されます。

Game Object 3D Viewerのアーリーリフレクション
- レイが表示されなければ、Game Object 3D Viewer SettingsでReflection Pathsが有効になっているか、確認してください。

Game Object 3D Viewerのアーリーリフレクション
 |
注記:
Game Object 3D Viewerにジオメトリが表示されない場合は、Monitor Queue Pool Sizeを増やす必要があるかもしれません。 初期化設定 で設定できます。 |
C - RoomとPortal
実際の音響環境では、閉ざされた空間から聞こえる音は、出入口や窓などの開口部から出てきます。Spatial AudioのRoomやPortalが、この効果をシミュレーションし、部屋(Room)の中で再生される音を出入口(Portal)だけから出します。
C.1. Wwiseプロジェクト
- Wwiseプロジェクトで、各部屋に新しいAuxiliary Busを作成します。
- 子Auxiliary Busを追加する場所を右クリックします
- New Child > Presets を選択し、Room Auxiliary Busを選択します。
- Effectsタブで、RoomVerb Effectを調整できます。

Auxiliary BusにReverbエフェクトを追加する
-
A.2. Wwiseプロジェクトの準備 のSound SFXまで移動します。
- Positioningタブで、"Enable Diffraction"チェックボックスがチェックされていることを確認します。

WwiseでサウンドのEnable Diffractionを有効にする
- プロジェクトを保存する。
C.2. Unrealプロジェクト
- Unrealで、新しく作成したこれらのAuxiliary Busを、Waapi PickerからContent Browserにドラッグ&ドロップします。
- これらをダブルクリックし、バンクにアサインします。
-
B.2. Unrealプロジェクト で作成してそれぞれの部屋に配置したAkSpatialAudioVolumeを選択します。
- "Enable Late Reverb"と"Enable Room"がどちらも有効になっていることを確認します。
- Late Reverb Sectionで、新しくインポートしたAuxiliary Busを、Content BrowserからAux Busパラメータにドラッグ&ドロップします。
-
AkAcousticPortal
を2つ、追加します。
- 建物の開口部付近に配置します。
- これらのPortalを選択し、"Ak Acoustic Portal"セクションで、それらのInitial Stateを Open に設定します。

音響用ポータルをシーンにドラッグする
 |
注記: AkAcousticPortal の向きは、それが接続する部屋同士が、ローカルのY軸方向に沿って配置されている必要があります。ポータルを選択すると、そのポータルの周りに黄色い帯が表示され、選択対象が分かりやすくなります。黄色い線が、フロントエリアとバックエリアの間の境界線を示します。部屋同士が重なり合っている場合は、優先順位が最も高い部屋を選択します。 |
C.3. 設定を検証する
- SoundBankをWindows用に生成します。
- シーンをスタートして、スタート位置から動かない。両方の部屋のサウンドが、トリガーすると聞こえるようになりました。
- Wwise Authoringに接続してから、Game Object Profilerレイアウトに移動します(ショートカットはF12)。Game Object 3D Viewerを見ると:
- 新しい2つのポータルがあります。
- 各エミッターの下に、配置されているRoom(部屋)の名前があります。
- リスナーを部屋から部屋へ移動させると、そのRoom(部屋)の名前も変わります。

Game Object 3D Viewerで、RoomやPortalを使う
- リスナーと違う部屋で、サウンドを再生すると(視界に入っていない場合):
- 反射面がポータルで切り開かれているので、音が聞こえます。
- ポータルを通過する、アーリーリフレクションのパスがあります。
- ポータルのエッジをディフラクション(回折)する、音の伝播パスがあります。

Game Object 3D Viewerの、Spatial Audioパス
 |
注記:
もしワールドにスペーシャルオーディオの部屋が1つ以上ある場合は、このスペーシャルオーディオの部屋が提供する追加情報が取り込まれるので、オクルージョン・オブストラクションのアルゴリズムの動作が変化します。エミッタ―とリスナーの間のラインオブサイト(直線)テストが失敗した場合は、以下のいずれかになります。
- リスナーとエミッタ―が同室にある場合は、Wwiseのオブストラクションフィルター(ドライパスのみ)が設定されます。
- エミッタ―とリスナーが別室にある場合は、Wwiseのオブストラクションフィルター(ウェットパスとドライパスの両方)が設定されます。
- スペーシャルオーディオの部屋がない場合は、アルゴリズムは、リスナーに対するラインオブサイト(直線)が成立していない音がすべてオクルージョンで遮られているものと解釈して、Wwiseのオクルージョンフィルター(ウェットパスとドライパスの両方)が設定されます。
|
Wwiseでポータルのシャドウリージョンのフィルターレスポンスを微調整するには、Project SettingsのObstruction/Occlusionタブを開きます。

ObstructionのVolumeカーブ

ObstructionのLPFカーブ
C.4. Portalとリバーブ
Portalから出てくるサウンドは、反響して、リスナーが現在いる部屋に入ってくることがあります。Spatial Audio Tutorialマップでは、以下の手順でこれを設定しました。
- Wwiseプロジェクトで、
- Room Reverbに使うAuxiliary Busを探します。このRoomは、ほかの部屋のリバーブに送るサウンドが出ている部屋です。
- Auxiliary Bus Property EditorのGeneral Settingsで、Use game-defined auxiliary sendsが有効になっていることを確認します。

RoomのAuxiliary Busの'Use game-defined auxiliary sends'を有効にする。
- Soundbankを生成し、シーンをスタートし、Wwise Authoringに接続します。
- Auxiliary sendsが有効になっているRoomでサウンドを再生してから、つながっている別のRoomに移動します。
- 出されたサウンドのウェット部分が、リスナーのいるRoomのリバーブにも送られることが、分かります。

SmallRoomのリバーブが、LargeRoomのリバーブに送られる。
C.5. Room Tone
部屋には、エアコンの稼働音など、特定のアンビエント音があることがあります。これを再現するために、Spatial Audio Roomというゲームオブジェクトにイベントをポストすることができます。リスナーがこのRoom(部屋)にいると、サウンドのポジションはその位置にあります。別のRoomに移ると、リスナーには、元のRoomとリスナーの位置をつなげるPortalから、Roomのトーンが聞こえます。
- Wwiseプロジェクトで、
- Room Tone用に新しいSound SFXを作成します。
- サウンドをリバーブに送りたい場合は、'Use game-defined aux sends'を有効にします
- 必要に応じて、Distance attenuationカーブ用のAttenuationを追加します。
- このRoom toneでPlayイベントを作成するために、このSound SFXを右クリックし、 New Event > Play を選択します。
- Unrealで、
- 前のサブセクションで作成したEventを、Waapi PickerからContent Browserにドラッグします。
- あなたのRoomの1つで、このイベントをAk Eventセクションの下にあるAk Audio Eventパラメータに追加します。
- Aux Send Levelを調整し、このサウンドの一部を、Roomのリバーブに送るように設定します。
- Auto PostボックスをチェックしてRoom ToneイベントをBeginPlayでポストするのか、通常ゲームオブジェクトにイベントをポストするのに使うBlueprintファンクションでコールするのかを、決めます。

Roomを有効にしたSpatial Audio Volumeの、AkEventセクション。
- Spatial Audio Tutorialマップでは、Level BlueprintのBlueprintファンクションを使い、Room Toneをアクティブにしたり解除したりします。
- World Outlinerで、Room ToneのあるAkSpatialAudioVolumeを選択してから、Level Blueprintで右クリックしてReferenceを作成します。
- Referenceからコネクションをドラッグし、"Post Associated Ak Event"を検索します。
- 同様に、Stopファンクションを検索します。
- インプットノードとしてKeyプレスを追加します。

Room Toneの再生と停止をLevel Blueprintから行う
- SoundBankを生成します。
- シーンをスタートし、Wwise Authoringに接続します。
- Room ToneのあるRoomまで移動し、キーを押してRoom Toneをスタートします。音が聞こえることを確認します。
- Advanced Profilerビューに、再生中のイベントが表示されます。

Advanced Profilerビューの、再生中のRoom Tone
- 3D Game Object Viewerでリスナーを動かしながら、Roomゲームオブジェクトを観察します。
- リスナーがこのRoomにいると、Roomが音を出すのは、リスナーの位置からです。Roomゲームオブジェクトが、リスナーのゲームオブジェクトのあとをついていくのが分かります。
- リスナーが別のRoomにいれば、RoomゲームオブジェクトはPortalに配置され、そこからリスナーゲームオブジェクトまで、パスが描写されます。

Game Object 3D ViewerでRoomゲームオブジェクトを観察する
D - Diffraction
エミッターとリスナーの間のライン・オブ・サイトが、障害物によってオブストラクションを受ける場合に、その周りを回るディフラクション(回折)パスをSpatial Audioで作成することができ、現実味のある音の動作をシミュレーションできます。エッジを回るディフラクションパスの角度に基づいて、音がオブストラクションを受けて減衰します。
 |
注記:
Spatial Audioのディフラクションを使用する場合は、Unreal Engine側のobstruction/occlusionを無効にしてください。エミッターの Occlusion Refresh Interval ( AkComponent)を0に設定します。 |
SpatialAudioTutorialMapでは、屋外の障害物や建物の外壁の周りに、Spatial Audioディフラクションを追加できます。
- Wwiseプロジェクトで、ディフラクションを適用したいエミッターが出すSound SFXのDiffractionが有効になっていることを確認します。
- Sound Property EditorのPositioningタブで、Diffractionを有効にします。
- Unrealで、
- ディフラクションを有効にしたサウンドを出す各AkAmbientSoundアクターを、それぞれクリックします。
-
Occlusion Refresh Interval を0に設定します。
- 建物の外壁のAkSpatialAudioVolumeをクリックします。
- Acoustic Surface Propertiesセクションで、Diffractionチェックボックスをチェックして有効にします。
- 屋外にあるスタティックメッシュの障害物をクリックします。
- Geometryセクションで、Diffractionの下のDiffractionチェックボックスをチェックして有効にします。
- SoundBankを生成します。
- プレイし、Wwiseに接続します。
- ディフラクションが有効になっているサウンドとリスナーの間に障害物があるときに、そのサウンドが再生されると、ディフラクションを有効にしたジオメトリの周りにディフラクションエッジが表示され、ディフラクションパスが表示されます。

Game Object 3D Viewerに表示されるディフラクションパス
E - Transmission
エミッターとリスナーの間にオブジェクトが出現したときに、音はそのオブジェクトの中を通過することもできます。Spatial Audioは、音のダイレクトパスに対してオクルージョンを適用することでこの現象を再現します。AkSpatialAudioVolumeやAkGeometryコンポーネントに、0から1までのOcclusion値を適用できます。このOcclusion値がWwiseに送られ、そこで、プロジェクトのOcclusionカーブに従い該当フィルタが適用されます。一般的に設定値が1.0であれば完全なオクルージョン、設定値が0.0であればその音がジオメトリを透過することを意味します。
- Spatial audioの初期化設定で、Enable Transmissionを有効にします

Spatial AudioのInitialization設定
- 音の透過値とは、その音がエミッターからリスナーまでのダイレクトパスを通るときに遭遇する、Spatial audioのジオメトリや部屋の最大オクルージョン値です。
- AkSpatialAudioVolume コンポーネントでは、
- そのコンポーネントでサーフェスリフレクタが有効であれば、オクルージョン値を各Acoustic Surfaceと関連付けることができます

各Acoustic SurfaceのOcclusion値
- そのコンポーネントでRoomが有効であれば、Occlusion値をWall OcclusionでRoomの各壁と関連付けることができます。

RoomのWall Occlusion
- AkGeometry コンポーネントでは、
- オクルージョン値をAcoustic Properties Overrideパラメータでオーバーライドできます
- コリジョンメッシュの場合

AkGeometryコンポーネントのシンプルコリジョンメッシュの、オクルージョン値をオーバーライドする
- スタティックメッシュの各マテリアルの場合

AkGeometryコンポーネントのスタティックメッシュの、オクルージョン値をオーバーライドする
- さらに、 Integration設定 のAkGeometry Surface Properties Mapで、Physical Materialごとにオクルージョン値を設定することもできます

Physical Materialにオクルージョン値を関連付ける
- Wwise AuthoringのProject Settingsで、Obstruction/OcclusionタブにあるOcclusionカーブを調節します。

OcclusionのVolumeカーブ

OcclusionのLPFカーブ