ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】サウンド AudioClip と AudioMixer

久しぶりの更新です。。今回は備忘録がてらにUnityサウンドの AudioClip と AudioMixer についてまとめてみました。

AudioClip

WAV,MP3,OGG等の音声ファイルをUnityにインポートして Projectビューからファイルを選択すると Inspectorビュー に AudioClip の設定画面が表示されます。

f:id:aki517:20190724225526p:plain

Force To Mono

モノラルにします。データサイズが半分になります。SEなど音質をあまり気にしないデータは有効にすると良いです。

Load In Background

チェックを入れるとバックグラウンド読込が有効になります。ロードが完了したかどうかは AudioClip.loadStateで確認できます。

Load Type

音声データの読込方法を設定します。この設定はメモリやCPU負荷に影響するため、用途に応じた適切な設定が必要です。

項目 処理 データサイズ 用途
Decompressed On Load ・読込と同時にメモリへ展開される
・再生時の負荷が少ない
200KB未満 SE
Compressed In Memory ・圧縮されてメモリに載り、再生時に展開される
・消費メモリが抑えられる
・再生時のCPU負荷が大きい
200KB〜1MB Voice, Jingle
Streaming ・データを段階的にメモリへ読込で展開する
・消費メモリは最小になる
・即時再生ができない
・読込と展開が都度行われるのでCPU負荷が大きい
1MB以上 BGM, Voice(長尺)
Preload Audio Data

チェックを入れるとアプリ起動時にメモリへ展開されます。再生時の負荷を抑えれますがデータ数に比例してアプリ起動の時間がかかるようになります。システムSE(決定音、キャンセル音)などゲーム内で常駐する必要があるものはチェックを入れておくと良いかもです。

Compression Format

圧縮フォーマットを設定します。ADPCMは圧縮率がVorbisほど高くはないですがCPU負荷が小さいメリットがあります。Vorbisは圧縮率が良いですが展開コストが高いです。

Quality

Compression Format で Vorbis を選択した場合に設定可能です。圧縮率の設定を行い、0に近いほどサイズが小さくなるがノイズが発生しやすくなります。70〜100の範囲は普通の人には差が分からないレベルなので、50〜70の間で設定すると良いでしょう。

AudioMixer

BGM, SE, Voiceなどのカテゴリーに応じたボリュームやエフェクトの設定が行えます。

作り方

Projectビュー内で右クリック > Create > Audio Mixer で作成出来ます。

f:id:aki517:20190725085100p:plain

Groups

カテゴリーの設定を行います。Masterをルートに階層で設定ができます。

f:id:aki517:20190727100504p:plain

Snapshots

AudioMixerの設定を保存することができます。また、このsnapshotを使って場面に応じたボリュームやエフェクトの設定に切り替えることができます。例えばバトル中にメニューを開いた時にメニュー系システムSEのみ聞こえる かつ BGMボリュームを下げる設定にする場合は下図のようなsnapshotを作成しておき、ゲーム内で切り替えることによって実現できます。

f:id:aki517:20190727102355p:plain

スクリプトでsnapshotを変更する方法は以下の2通りになります。また、方法2の weights は 0.5 に設定すると2つのsnapshotがミックスされた設定になります。

[SerializeField] AudioMixer audioMixer;

// 方法2. 1秒かけて OpenMenu の snapshot へ移行する.
void Example1()
{
    var snapshotOpenMenu = audioMixer.FindSnapshot( "OpenMenu" );
    snapshotOpenMenu.TransitionTo( 1f ); 
}

// 方法2. 1秒かけて, Default > OpenMenu の Snapshot へ移行する.
void Example2()
{
    var snapShotDefault = audioMixer.FindSnapshot( "Default" );
    var snapShotOpenMenu = audioMixer.FindSnapshot( "OpenMenu" );
    var snapshots = new AudioMixerSnapshot[]{ snapShotDefault, snapShotOpenMenu };
    var weights = new float[]{ 0.0f, 1.0f };
    audioMixer.TransitionToSnapshots( snapshots, weights, 1f );
}

切り替え時の補間方法はデフォルトではLinear(線形)になっています。snapshot単位で調整したい場合は対象のsnapshotのMasterを選択 > Inspector の各項目で右クリックをすると下図のように補間方法を選択することができます。

f:id:aki517:20190727103733p:plain

スクリプトからボリュームを制御したい

AudioMixerのsnapshotを使わないでスクリプトからボリュームを制御する方法は以下になります。

  1. AudioMixerから対象Groupを選択
  2. Inspector の Volume を右クリック >「Expose 〜」 をクリック
    f:id:aki517:20190803180450p:plain

  3. AudioMixer 右上にある Exposed Parameters をクリックして対象パラメータをリネーム
    f:id:aki517:20190803181210g:plain

  4. 制御スクリプトは以下になります。

[SerializeField] AudioMixer audioMixer;
void Example()
{
    float masterVolume;
    audioMixer.GetFloat( "MaserVolume", out masterVolume );
    masterVolume *= 0.5f  // 適当にボリュームを半分にする.
    audioMixer.SetFloat( "MasterVolume", masterVolume );
}

ちなみにAwake()内でAudioMixer.SetFloat()を実行しても適用されません。Start()であれば問題ないです。こちらのフォーラムにも上がっていますが私が動作を確認した Unity2019.1でも修正されていませんでした・・(^_^;

まとめ

AudioClip は 用途に応じて Load Type を設定して Compression Format, Quality の設定を適切に行うのが良いでしょう。最終的にサウンドデータは数が多くなるので Presets機能 を使って自動設定ができるようにするのが良いかと思います。

goisagi-517.hatenablog.com

AudioMixerはsnapshot機能はボリューム調整を個別に対応しなくて良いので便利ですが、ボリュームを調整したい場面が増えてくるとそれに比例してsnapshot数が増えていくので注意が必要です。

参考

【Unite Tokyo 2018】実践的なパフォーマンス分析と最適化
コンセプトと AudioMixer の概要 - Unity マニュアル