2019/12/25

AudioMixerを活用して、サウンド調整の処理

WRITER: q.q.vuong

サウンド周りの調整、管理


開発G所属のクライアントエンジニアです。

はじめに:

Unityでサウンドの処理(サウンドの音量を調整や再開、ストップ、一時停止など)はAudioSourceというComponentでやるのは一般的かもしれません。ですがこれは一番良い方法ではないと思います。Unity提供したAudioMixerを活用してゲームサウンドの調整処理をしてみました。


UnityのAudioMixerの紹介:

Unity Docのページに「Unity のオーディオミキサーでは、いろいろな音源をミックスしたり、それにエフェクトをかけたり、マスタリングを行ったりすることができます」が書いてあります。AudioMixerを使用すると、音量レベルを変更したり、信号をグループにルーティングしたり、オーディオエフェクトでサウンドを処理したりできます。


AudioMixerを使うの設定ステップ:

ゲームによる、ゲームのサウンドタイプが違います。今回は下記のサウンドタイプを分けています。

  • BGM
  • SFX (インゲームのサウンドエフェクト)
  • UI (UIのサウンドエフェクト:ボタンクリック、ポップアップなど)
  1. Audio Mixerの作成:

  1. Audio Mixer Windowを開く:

  1. Master Group下に、サウンドグループを追加します:


MasterグループはAudioMixerのDefaultグループです。
画像を見るとbgm, sfx, uiグループはMasterグループの下に配置されています。

  1. シーンにAudioSourceのGameObjectを作成する:

下記は一般的な設定ですね。
 

AudioMixerをつかうなんで、こんな形に設定する。

簡単解説

  • AudioSourceのOutputを何も設定しない場合、音声の挙動はこんな流れです:

    メモ
    Audio Listener は、マイクのようなデバイスとして機能します。これは、シーン内で所定の Audio Source からの入力を受信し、コンピューターのスピーカーを通じて音声を再生します。ほとんどのアプリケーションで、メインの カメラ にリスナーを追加するのが一般的です。オーディオリスナーが リバーブゾーン の境界内にある場合、それはシーン内のすべての可聴音が適用されます。さらに、Audio Filters をリスナーに適用でき、シーン内のすべての可聴音に適用されます。

  • AudioSourceのOutputをMixerグループに設定する場合、音声の挙動はこんな流れです:

  1. MixerのパラメーターをExportする

MixerグループのVolumeパラメーターをExposeする。ParameterをExposeのははRuntimeコードでMixerのパラメーターを調整できるためです。


Exposeされたパラメーターリストです


ここまでの設定は完了しました!!!


今までのやり方:

シナリオ:

ユーザーがオプションで音量調整する場合、サウンドマネジャーに、一般的下記の処理を行うと思います  

上記の処理で感じる事:

  • コード書くのが多い。
  • LoopでAudioSourceづつの音量を設定しないといけない。
  • Master音量だけ調整するとエフェクトの音量やUIの音量なども影響されます。(音量のバランスがなくしました)。
    例えば:
    Master音量が10ときに、effect音量を8にセットしました。 =>effect音量とMaster音量は10分の8
    Masterを6にセットする。この場合、effect音量とMaster音量は10分の8を変わらない事をほしかったですがEffectもMasterと同じく6なってしました。。

上記のシナリオでAudioMixerを使います:

ユーザーがオプションで音量調整する場合、サウンドマネジャーに、下記処理をおこまいます。

上記の処理で感じる事:

  • コード書く大体簡単くなりました。
  • Master音量だけ調整するとエフェクトの音量やUIの音量なども影響されない。(、音量調整はAudioSource毎に行うではないですから音量のバランスはそのままで保留できます)。

結論:

  • AudioMixerはAssetなので、サウンド周りのバランス(Master、ui, effect,…)の調整はEditorで調整できます。
  • サウンドの調整コードも軽くなります。
  • 簡単にオーディオレベルを制御したい、AudioMixerはベストチョイスです。

更にTipです:

PlayOneShotを効果的に使用する:

非常に基本的なアドバイスのように思えますが、Unityフォーラムで繰り返し質問される質問です。

「最初のサウンドを停止せずに、2番目のサウンドを再生するにはどうすればよいですか?」

シンプルで、PlayではなくPlay One Shotを使用します。

PlayOneShotは標準のPlay機能と同じように機能しますが、いくつかの重要な違いがあります:

  • PlayOneShotは、オーディオソースで既に再生中のクリップを中断しません
    これにより、マシンガンの発射、足音、スイング、ヒットなどの繰り返し音に最適です。
  • PlayOneShotでは、関数を呼び出すときに再生するオーディオクリップを指定する必要があります
    これにより、オーディオソースのクリップフィールドを交換する代わりに、バリエーションにさまざまなクリップを簡単に使用できます。
  • PlayOneShotを呼び出すときに、クリップの音量スケールを設定できます。
    これにより、クリップのボリュームが(0-1のフロートスケールで)変更され、オーディオソースの全体的なボリュームに影響を与えずにサウンドをランダム化するのに最適です。

スクリプティングでは、PlayOneShotは次のようになります。

PlayOneShotでトリガーされた複数のオーバーラップサウンドはすべて、総音声カウント(デフォルトでは32)にカウントされることに注意することが重要です。そのため、クリップがCulledされないように、繰り返し音の尾を短くするように注意してください。

アバター

q.q.vuong

開発Gクライアントエンジニア
メイン:Unity
興味はゲーム内システム仕組みを設計する。
現在はAddressable,PhotonとUnityの新しいECSを勉強しています。