へくれすブログ

UnityとC#中心の備忘録です

【Unity】AudioSourceの同時再生による音割れを防ぐ方法

今回は音割れに関するTipsです。

f:id:hecres:20180310163842j:plain

音、特に効果音は複数/同一の音源を同時再生する機会が多いかと思います。
その際問題になるのが「同時再生の実現」と「音割れ」です。

同時再生はAudioSource.PlayOneShot(AudioClip clip);という便利なメソッドで実現できます。

しかし上記メソッドは音割れに関する考慮はされておらず、
そのまま音を重ねて鳴らすと波形が壊れて変質してしまいます。

効果音の同時再生数制御などを自作するのは結構面倒です。

なのでUnity側で吸収してほしいなぁ……と思っていたのですが、自分が知らないだけで普通にありました。

AudioMixerのエフェクトについて

音の管理にはAudioMixerが役に立ちます。
これがあれば自分で音声管理クラスを作らなくとも大抵のことは実現可能です。

音割れ防止にはAudioMixerのエフェクト機能を使用します。

グルーピングした範囲に対して一律でエフェクトを掛けられます。
各グループの下部にAdd..と書かれたボタンがあるので、クリックして追加したいエフェクトを選びます。

f:id:hecres:20180310170850j:plain

1グループに複数のエフェクトを追加することも可能です。

音をこもらせる。エコーを掛ける。ピッチを変更する。色々できます。
自分では試してませんが、ボイス再生時にBGMの音量を少し下げるといったこともできるみたいです。

音割れ防止エフェクト

対象のグループにNormalizeエフェクトを追加します。
以上です。

これにより名前通りNormalize(音量正規化)が掛かり、
音声データの最大音量をもとに、音が歪まない範囲で音量を最大化してくれます。

なぜ今まで気づかなかったのか

必要になったのが最近だからというのもありますが、
調べ方の問題もあったのかなと思います(「Unity 音割れ」とかでググっていました)。

AudioMixerとそのエフェクト機能はUnity5から提供されていたものですが、
音割れ防止機能と銘打たれているわけではありません。

なので音割れの原因である「デジタルクリップ」や
解決策である「ノーマライズ」「音量正規化」などの用語で調べれば
もっと早く答えに到達できたかもしれません。

参考/関連

その5 SEの同時発生数問題を考えてみる
magcat.php.xdomain.jp

この記事でのバージョン

Version
Unity 2017.3.0p4
Unity/PlayerSettings/Scripting Runtime Version Experimental (.NET 4.6 Equivalent)