「Steam Audio」で立体的な音の表現にしてみよう

Cluster Creator Kit v2.33.0から「Steam Audio」が利用できるようになりました。
Steam Audioは空間音響、つまり空間上の物体による遮蔽や反響などの音の伝わり方を考慮した立体的な音を表現するためのパッケージです。

Steam Audioを利用することで、例えば「壁の向こうの音が小さく聞こえる」「ドアが開いた時だけ中の音が聞こえる」「スピーカーの前方でだけ大きく聞こえる」といった、通常のAudio Sourceだけでは実現が難しい複雑な音響表現が可能になります。
「音の聞こえ方」にこだわって、ワールドでの体験をよりリッチにしてみましょう!

※Cluster Creator Kit v2.33.0時点では、プレイヤーのボイス等に遮蔽・反響などの影響を与えることはできません(ボイスについても対応できるようになる機能を現在開発中です)。ワールド内に設置した音源や、サブ音声のスピーカーで利用可能です。

Cluster Creator Kitを最新版にする

最初にCluster Creator Kitが最新版になっていることを確認してください。

Unityの上部メニューから「Window > PackageManager」を開き、「Packages」を「In Project」に切り替えて、一覧から「Cluster Creator Kit」を選択します。
Cluster Creator Kitを選択して、右下に「Update」ボタンがある場合はそれを押すことで、最新版に更新することができます。

Steam AudioをダウンロードしてUnityプロジェクトにインポートする

下記のDownloadページから「steamaudio_unity_4.6.0.zip」を選択してダウンロードします。
https://github.com/ValveSoftware/steam-audio/releases/tag/v4.6.0

ダウンロードしたzipファイルを展開し、フォルダ内からsteamaudio_unity > unity > SteamAudio.unitypackageを見つけてください。

Steam Audioを導入したいワールドのUnityプロジェクトを開きます。
UnityのProjectウィンドウに、先ほどのSteamAudio.unitypackageをドラッグ&ドロップしてください。インポートするアセット一覧ですべてにチェックがついていることを確認して、「Import」ボタンをクリックします。
インポートが終わると、Assets/PluginsフォルダにSteamAudioのアセットが展開されます。

※このフォルダおよび中のアセットは削除・変更しないようにしてください。

Steam Audioを使うための設定をする

アセット導入後、Steam Audioを利用するためにはプロジェクト設定の変更が必要です。

上部メニューの「Edit」から「Project Settings」を開きます。
Project Settingsの左側の一覧から「Audio」を選択してください。
Audio設定のうち、以下の項目を変更します。

  • 「Spatializer Plugin」に「Steam Audio Spatializer」を選択
  • 「Ambisonic Decoder Plugin」に「Steam Audio Ambisonic Decoder」を選択

以上でSteam Audioの機能が利用可能になりました。
続いて各機能の使い方を紹介していきます。

より深く知りたい方はこちらのドキュメントも参照してください。
以下では基本的な使い方を紹介していきます。

音源を設置する

まずは通常通りAudio Sourceを設置します。
Audio Sourceコンポーネントの設定に「Spatialize」という項目が追加されているので、チェックを入れて空間音響を有効にします。
また、「Spatial Blend」のスライダーを「3D」にしてください。

※「Spatialize」のチェックを忘れると空間音響の機能が使えず、普通のAudio Sourceになります。

※「Spatialize」の項目がない場合は「Steam Audioを使うための設定をする」の節を再度確認してください。

Audio Sourceと同じGameObjectに「Steam Audio Source」コンポーネントを追加します。Steam Audio Sourceの「Distance Attenuation」にチェックを付けて距離減衰を有効にし、この状態で一度プレビューで確認してみましょう。

通常のAudio Sourceと比べて立体的な音になり、左右のパンだけでなく音源との距離感なども感じられるようになっていると思います。
Audio SourceのSpatializeをオフにすると通常のAudio Sourceの聞こえ方になるので、音源の周囲を移動するなどしながら比較してみてください。

※ヘッドホン・イヤホン等で確認してください。スピーカーでは効果が分かりづらい場合があります。

前方に向かって音が出るようにする

現実のスピーカーの多くには指向性があり、スピーカーの正面で大きく聞こえ、背後に回ると聞こえにくくなります
通常のAudio Sourceでは音源からの球状範囲でしか減衰を設定できないためこうした表現は難しいですが、Steam Audioを使うとこういった表現も簡単に設定できます。

指向性の設定をするには、Steam Audio Sourceの「Directivity」にチェックを入れます。
Directivity Inputが「Simulation Defined」になっている状態で、「Dipole Weight」「Dipole Power」を調整することで、前方への偏りのバランスを調整することができます。

※Audio SourceのGameObjectのZ+方向(ローカル座標で青い矢印の向く方向)が正面方向になります。

「Dipole Weight」を大きくすると、聞こえる範囲が前方に偏るようになります。およそ0.5くらいでほぼ前方のみになり、そこから1に近づくと後方にもはみ出して8の字のような形状になっていきます。

「Dipole Power」を大きくすると範囲が狭くなり、真正面近くにしか聞こえなくなります。
Dipole Weight, Dipole Powerのいずれかが0だと偏りがなくなってしまうので、最初は

  • Dipole Weight = 0.5
  • Dipole Power = 1

くらいの設定から調整していくのがオススメです。

壁や地面による遮蔽を設定をする

続いて、壁や地面による遮蔽を設定してみましょう。音源とプレイヤーの位置関係だけでなく、「間に壁があるときは聞こえなくなる」といったことが可能です。

最初は建物や地形など、動かない壁や地面の設定をしていきましょう。開閉するドアなど、動く遮蔽物については別の設定が必要です。

まず、壁や地面の3Dモデルのオブジェクト(Mesh FilterコンポーネントやTerrainコンポーネントがついたGameObject)に「Steam Audio Geometry」コンポーネントを追加します。

※3Dモデルのオブジェクト自体ではなく、その親階層にSteam Audio Geometryを設定することで、子階層の3DモデルをまとめてひとつのGeometryとして扱うこともできます。その場合はSteam Audio Geometryコンポーネントの「Export All Children」にチェックを付け、子オブジェクトにはSteam Audio Geometryを設定しません。

Steam Audio Geometryコンポーネントが設定できたら、上部メニューの「Steam Audio」から「Export Active Scene」を選択します。
アセットの保存場所を聞かれるので、選択して保存します。このアセットにはシーンごとの壁や地面の音響の設定が書き込まれるので、シーンアセットと同じ場所などにしておくと分かりやすいでしょう。

アセット保存後、シーン上に「Steam Audio Static Mesh」というオブジェクトが生成されます。このオブジェクトは削除・変更しないようにしてください。

最後に、音源のSteam Audio Sourceコンポーネントで「Occlusion」の項目にチェックを付けます。これを有効化しないと壁によって音が遮られる機能が有効になりません。

この状態でプレビューしてみましょう。音源とプレイヤーの間にSteam Audio Geometryを設定した壁があると音が聞こえなくなったり、小さくなったりします。

ここでひとつ注意しなければならないのが、Steam Audio Geometryを設定した壁や地面に変更を加えた場合、再度Export Active Sceneを実行する必要がある点です。再実行しなかった場合、最後にExportしたときの壁や地面を基準に音が遮られるようになってしまいます。ライトベイクを利用しているワールドに変更があったらライトベイクし直すのと同様に、Steam Audio Geometryも変更があった場合はExportし直してください。

壁や地面の材質を設定する

壁や地面は音を完全に遮るだけでなく、壁を通して小さく聞こえるようにしたり、反響を再現したりといったことも可能です。

それぞれの壁や地面がどのように音を通したり反響させたりするのかは、それぞれの材質の設定を定義する「マテリアル」アセットを作成して設定します。

※3Dモデルのテクスチャなどを設定するマテリアルとは別のものです。

Projectウィンドウを右クリックし、「Create>Steam Audio>Steam Audio Material」を作成します。
作成したマテリアルアセットを、Steam Audio Geometryコンポーネントの「Material」欄に設定します。
その後、再度「Export Active Scene」を実行するとマテリアルが適用されます。

作成したマテリアルのInspectorでは、以下の項目が設定できます。

  • Absorption(吸収)
    • 材質がどれだけ音を吸収する(反響させない)かを設定します
    • 石材などの反響しやすい素材では小さい値に、木材などの反響しにくい素材では大きくします。
    • 音域ごとに吸音しやすさを調整することができます。例えばLow Freq Absorptionを小さく、High Freq Absorptionを大きくすれば、低い音だけが反響しやすくなります。
    • 反響を有効にするためには、音源のSteam Audio Sourceで「Reflection」にチェックを入れる必要があります
  • Scattering(拡散)
    • 音が反響する際に、どれだけ乱反射によって拡散するかを設定します。
    • 一般的に表面がツルっとした素材では小さく、ザラザラした素材では大きくすると自然です。
    • 反響を有効にするためには、音源のSteam Audio Sourceで「Reflection」にチェックを入れる必要があります
  • Transmission(伝達)
    • 素材を通した音の伝わりやすさを設定します。小さくすると壁越しの音が聞こえにくくなり、大きくすると壁越しでも聞こえやすくなります。
    • 金属のような遮音性の高い素材では小さく、プラスチックのような遮音性の低い素材では大きくします。
    • 音域ごとに伝わりやすさを調整することができます。例えばLow Freq Transmissionを小さく、High Freq Transmissionを大きくすると、高い音だけが壁越しに聞こえやすくなります。
    • 壁越しでの伝達を有効にするには、音源のSteam Audio Sourceで「Transmission」にチェックを入れる必要があります

先の動画では音が響いて壁越しにはほとんど聞こえない金属のようなマテリアルと、あまり響かず壁越しだとくぐもって聞こえる木材のようなマテリアルを設定しました。下記が設定値の例になります。

また、Assets/Plugins/SteamAudio/Resources/Materialsにサンプルマテリアルが入っているので、そちらも参考にしてみてください。

ドアなどの動くオブジェクトにも作用するように設定する

開くドアなど「動くオブジェクト」を遮蔽物として設定したい場合は、少し別の設定が必要です。
この設定をすることで、「ドアが開いているときは中の音が聞こえる」「ドアが閉じているときは中の音が聞こえない」といった表現が可能になります。

まずは「動かないオブジェクト」のときと同様に、3DモデルのオブジェクトにそれぞれSteam Audio Geometryコンポーネントを設定します。

※こちらも同様に3Dモデルのオブジェクト自体ではなく、「Export All Children」を適用することで子階層をまとめて扱うことができます。このとき、子階層の3Dモデルだけをギミックで動かすことがないようなつくりにしてください。設定時点での子階層の3Dモデルすべてをひとまとまりとして扱うので、子階層を動かすと見た目とSteam Audioでの遮蔽とがズレてしまうことがあります。

動くオブジェクトの場合は、さらに「Steam Audio Dynamic Object」コンポーネントを同じGameObjectに追加します。
Steam Audio Dynamic Objectの「Export Dynamic Object」ボタンを押して、オブジェクトごとの設定を保存しましょう。
対象オブジェクトの3Dモデルやマテリアル設定に変更があった場合は、再度Export Dynamic Objectを実行して現在の情報を書き出す必要があります。

※一度書き出してアセットと紐づいていれば、上部メニューのSteam Audio > Export Dynamic Objects In Active Sceneでまとめて更新することもできます。

正しく設定できていれば、先の動画のような表現が可能になります。

反響をベイクする

音源が固定されていて動かず、壁や地面などの遮蔽物もほとんどが動かない(Steam Audio Dynamic Objectを使わない)場合、空間に対する反響の情報を「ベイク」することで処理を軽量化できる場合があります。

ベイクする際はまず、空間上でのベイク情報を記録する「プローブ」を作成します。
空のGameObjectに「Steam Audio Probe Batch」コンポーネントを追加し、位置・回転・スケールを調整して範囲を決めます。

※シーン上では範囲はピンクの枠線で表示されます。

Steam Audio Probe Batchの「Horizontal Spacing」で配置間隔(距離)を、「Height Above Floor」で底面からの高さを設定して「Generate Probes」を押すと、等間隔で並んだプローブが生成されます。
複雑な形状のワールドでは複数のSteam Audio Probe Batchを使ってベイクすることも可能です。必要な分だけ同様に作成・設定してください。

※プローブの密度が高いほど精度が良くなりますが、数が増えるとデータが大きくなる可能性があります。

続いてSteam Audio Sourceを確認します。
Steam Audio Sourceの「Reflections」にチェックがついていることを確認し、さらにReflection Typeを「Baked Static Source」に変更します。

※今回は「Baked Static Listener」は使用しません。

最後にSteam Audio Sourceと同じGameObjectに「Steam Audio Baked Source」コンポーネントを追加しましょう。
Steam Audio Baked Sourceの「Probe Batches」に影響させたいSteam Audio Probe Batchをひとつずつ指定するか、すべてのプローブを利用する場合は「Use All Probe Batches」にチェックを入れます。

設定できたらSteam Audio Baked Sourceの「Bake」ボタンを押してベイクしましょう。
以上でベイクの設定は完了です。

以上で基本的な表現がひととおりできるようになりましたが、Steam Audioには他にも様々な機能があります。もっと音響にこだわりたい人は挑戦してみましょう!
以下にその一部を紹介します。詳細は公式ドキュメントに書かれているので、気になる人は調べてみてください。

空気による減衰

Steam Audio Sourceの「Air Absorption」にチェックを付けると、音が空気によって吸収され減衰する状態を再現することができます。
「Air Absorption Input」を「User Defined」にすることで細かな調整ができるので、空気感にこだわりたい場合は調整してみてください。

アンビソニック音源

特殊なマイクを使って全方位からの音を収録した「アンビソニック音源」を利用することができます。
利用する場合は対応する形式の音源アセットのインポート設定で「Ambisonic」を有効にしたうえで、Steam Audio Sourceに追加する形で「Steam Audio Ambisonic Source」コンポーネントを設定します。

  • Audio Sourceに「Spatialize」の項目が見つかりません
    • 「Steam Audioを使うための設定をする」の節を確認してください
  • Steam Audio Sourceを設定したのに空間音響になりません
    • 同じGameObjectのAudio Sourceコンポーネントで「Spatialize」が有効になっていること、また「Spatial Blend」が「3D」になっていることを確認してください
  • Audio Sourceのカーブを設定しても距離減衰しません
    • Steam Audio Sourceの「Distance Attenuatioin」が有効になっていることを確認してください
  • 壁越しでも音が遮られません
    • Steam Audio Geometryを設定し、Exportしたことを確認してください
    • Steam Audio Sourceの「Occlusion」が有効になっていることを確認してください
  • マテリアルを設定・調整しても反響などに反映されません
    • Steam Audio Sourceの「Reflections」や「Transmittion」が有効になっていることを確認してください
    • マテリアルの設定・調整後にSteam Audio GeometryをExportしたことを確認してください
  • 開くドアを遮蔽として設定したところ、ドアが開いても遮蔽状態が変化しません
    • Steam Audio Dynamic Objectが設定されていることを確認してください
    • Steam Audio Dynamic Objectで現在の状態をExport Dynamic Objectしたことを確認してください
    • アニメーションなどでSteam Audio Dynamic Objectの子階層を動かしていないことを確認してください
記事をシェアしてワールド制作を盛り上げよう!

Cluster Creators Guide|バーチャル空間での創作を学ぶならをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む