Unity における空間オーディオの処理方法

Unity では簡単に AudioSource を空間化する方法が用意されていますが、UI の整理が行われておらず、いつも迷うのでまとめておきます。

なお、プリインストールの簡易版 Oculus Spatializer を使うときの話です。フル版の Oculus Spatializer や Steam Audio といったプラグインの使用方法は異なります。

結論

番号 操作 結果
1 Spatial Blend の数値を 1 に 距離と方向に応じて音量を変化
2 Audio Settings の Spatializer 方向に応じて音質と音量を変化
3 AudioSource の Spatialize その AudioSource に2の計算を行う(音質の変化が適用される)

3をすると、1の方向による音量変化は2によって上書きされます。

オーディオとの距離や方向によって音量を変化させる

Spatial Blend を 1 にすると、これを実現できます。これによって、3D Sound Settings と書かれた下のグラフ部分の処理が行われ、距離や方向に応じて音量が減衰します。この時点で、Stereo Pan は完全に AudioListener との位置関係によって制御されるため、無効になります。

また、赤い Volume グラフを編集することで自在に減衰量をコントロールすることができます。その辺りの内容は下記の書籍に詳しい章があるので一読をお勧めします。

ここではあくまで音量のみが制御されます。つまり、距離によってグラフ通りに音量を絞ったり、方向によってステレオ LR の音量比率を変えている(たぶん)だけです。さらに、デフォルト設定である Spread 0 の状態では、音源を右に配置すると、左からは完全に聞こえなくなるピーキーな仕様で、これだけでは、全然それっぽくなりません。(Spatializer によって置き換えられるため今回は不要ですが、120くらいにすると若干それらしくはなります)

また重要な点として、音質の変化は計算されません。これを計算するのが次のセクションです。

オーディオの方向によって音質を変化させる

Audio Settings で任意の Spatializer を選択します。

その後、目的の AudioSource で Spatialize をチェックすると、上記で選んだ Spatializer の HRTF を使って、音源の方向によって周波数特性を変化させることができます。というか勝手にやってくれます。Unity が行っていた LR の音量比率計算も置き換えられます。やったね。

一見これで問題ないように見えます。しかし、様々な距離に配置したり、プレイヤーを移動させるなどしていると、まだ足りない部分があることに気づきます。それは何でしょうか。ここで現在までに処理されている内容を並べてみましょう。

内容 処理部
方向による音量の変化 Spatializer
方向による音質の変化(周波数特性) Spatializer
距離による音量の変化 Unity

…もうおわかりですね。距離による音質の変化が処理できていません。雑に言うと、遠くの音ほど低域が減衰するような感じになりません。プリインストールの簡易版 Oculus Spatializer だけではこれを処理できないので、再現したいのであればフル版を入れましょう。

フル版の Oculus Spatializer を入れると何ができるのか

フル版は本当にヤバいです(語彙)

お前は何を言ってるんだ(すごい)効果の程はこちらで視聴できます。ヘッドフォン用。

他の Spatializer

VR で使う前提で作られているものとしては、Steam Audio と Resonance Audio が挙げられます。機能的には似たり寄ったりですが、切磋琢磨してくれてて最高。Steam Audio は数が増えると CPU を爆裂に消費する設計(執筆時。なんと AudioSource ごとに毎フレーム FindObjectOfType を走らせている)になっており今はアレなのですが、Resonance Audio はめちゃくちゃ大量の音源を置いてもへっちゃらとアピールしており気になりますね!

今日はもう遅いので、参考になりそうなリンクを貼っておきます。ちょっと古いけど3種をしっかりレビューしてて良い記事。
Let’s Test: 3D Audio Spatialization Plugins

2019年4月1日