1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unityで音のリアルタイムオーディオ処理 空間音響(残響効果・エリア足音)を超軽量で行ってみた

Last updated at Posted at 2025-07-31

はじめに

Ghost PhotographersというVRホラーゲームで実装した遮蔽効果の備忘録です。

#CRI_ADX勉強会 で未紹介の部分ですが、足音の変化など場所の説得力を増す効果を
プログラムやデザイナーの手を使わずに
サウンド側の設定のみで軽量に行えるものを目指しました。

デモ

基本的な残響

ユーザーがエリアに入った時に、ふさわしい残響効果を持たせる。

リスナーが特定のコライダー入ったタイミングで、
エフェクトの切り替えを行うことで実現します。

シーン上にSound専用のコライダーを配置するため設定は手間ですが、
自動で場所によって音が変化するような仕組みを作るとしたら、
そして、音の変化が豊かにできるのならば、労力は惜しみません。

シーンを作ってしまえば、実行時は自動で切り替わる仕組みになります。

シーンに付随してSoundのプレファブを用意

他の作業とバッティングしないようサウンド専用のPrefabをいじる形にし、
シーンを汚さない形でコライダーを設定しています。
(故にシーンが大きく変更された場合は、都度追従して修正が必要になります)

image.png

ここではFloor_1Fというシーンに対して、オーディオ設定用のAudioFloor_1Fというプレファブを用意しています。

ADX2ではスナップショット切り替え

このタイトルではADX2を使っているので、
スナップショットを切り替える形で残響を変化させています。

それぞれのキューがリバーブ用のバスに出力していて、
バスのスナップショット切り替えでまとめてエフェクトが変わるような形になります。

image.png

ADX2のリバーブ設定

I3DL2リバーブを左右それぞれ個別に用意しています。
ほとんどの設定では同じ設定ですが、
シーンによって 若干の差異で左右や奥に広がるような、雑味を加える感じで利用しています。
また近接の初期反射感を出すためにマルチタップディレイを使う場合もあります。

ADX2のミキサーのスナップショット切り替え

image.png

スナップショット名前と時間指定で変化させています。
場所によっては、時間をかけて変化させる場合もあるし、
狭い空間などの場合は、すぐに変化がでてほしいために短めにする場合もあります。

image.png

あまりに短い時間指定だと不自然な変化になるようでした。

vivoxボイスチャットのエフェクト

vivoxのボイスチャットの残響も変更させるため、こちらはUnityのミキサーの残響バスのミックス量を変更しています。

Unityのミキサのバスの出力を変化

image.png

vivox側はUnityのミキサーのスナップショットの深さで変化
image.png

ちなみにボイスチャットは、死亡時や距離が離れた時は、
電話から声がするようなエフェクトへ切り替えたりなどの操作も行っていますが、
そこはバスのルーティング(接続先)を切り替える形で実装しています。

Unityのリバーブゾーンは未使用

Unity標準であるリバーブゾーンは仕様がややこしいのと、そこまで求めていなかったので未使用です。(あと、拡張も難しそうだったので)

独自のコンポーネントをエリア配置という形で実装しています。

残響反映は厳密ではない

リスナーがいる場所の設定で、すべての残響が変わる形で簡易的にしています。

例えば、風呂場のシャワーを出したら、音は風呂残響ですが、
畳部屋まで移動した場合は、シャワーの音の残響はどうなるでしょうか?

厳密さをとるなら、シャワーの音は残響込みで定位してほしいところですが、
それは複雑になるため諦めています。
(おそらくいくつか優先度の高い残響設定を複数もたせるみたいな複雑な処理が必要になる)

そこまでせずとも、それらしい雰囲気はできたので許容しています。

もし、仮にそのような演出が必要な場合は、音側に残響をもたせた音を用意してしまうかもです。

今回は音はドライな音(響かない音)を用意し、ADX2によるリアルタイムの残響付与をする形にしています。

コライダー

isTriggerなBoxコライダーを利用します。

image.png

おそらくUnityはBoxコライダーが一番軽いという見込みで利用しています。

Unity上では、
リスナーにもコライダーを用意し、Soundという同じPysixレイヤーにしておきます。

こうしておくことで、サウンド以外のものに影響を与えないように気を使っています。

image.png

プログラムでは、OnTriggerEnter、OnTriggerExitの実装で、処理をします。
image.png

リスナーが入ってきたかどうかで、残響を変えるような実装です。

コライダーを抜ける時の注意

もしコライダーが入れ子(多重・重なって配置)されている場合、
コライダーから抜けた時に、どこにも所属しないことが想定されます。

今回は、シンプルにトリガーに入る時だけ処理を切り替える形にしています。

もう少し丁寧にする場合は、抜けるときに、どこかのコライダーに所属しているかチェックすると良いかもしれませんが、 入る時と二重で切り替えが発火してしまう場合があるので注意が必要です。

image.png

同じコンポーネントで、足音の属性も切り替え

あくまで、リスナーがどこにいるか、だけの情報で空間の響きを変えていますが、
それを利用して足音の床属性も持たせています。

足音や息遣いなどフォーリー的な音が残響の影響を受けて変化することで、
空間変化を音で強調しています。

image.png

これで、中庭だと泥や葉っぱのような音、廊下ではコンクリートのような床といった切り替えが自動で行われています。

外ではあまり響かず、廊下では響くといった音の変化が感じられます。

プログラムでは移動時にキューで足音を再生、足音の鳴らし分けは
ADX2のグローバルセレクターを切り替えるのみで、
キューの中の特定のトラックのみ鳴るように鳴らしわけをしています。

image.png

おわりに

今回はADX2を利用していますが、ADX2のUnityには足音の切り替えだったり、
空間による変化などの処理がとくに無いのと、
MetaQuest2でも動くスタンドアローンVRタイトルであるため、酔い軽減のためにも
処理をとにかく削りたいため、必要最小限のコライダーで実装してみたものになります。

何かの参考になれば幸い。

ADX2勉強会の時の資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?