Unity AudioMixerで音量等のパラメータをスクリプトから操作する際のつまりポイントメモ

## 経緯

Unityのスクリプトリファレンスなどだと若干わかりづらかった & ググってもなかなか良い記事に巡り合わなかったためここにメモ

Unity5.6あたりからサウンド周りの管理用コンポーネントとして AudioMixerがある、これはGUIでのサウンドの調整やエフェクトの追加等々が行える便利な機能

↓詳しくは公式リファレンスを参照↓
[マニュアル](https://docs.unity3d.com/ja/current/Manual/AudioMixer.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/current/ScriptReference/Audio.AudioMixer.html)



## サウンドの音量を下げる方法( パラメータ出力から設定まで )

先ずProjectWindowにて適当なAudioMixerを作成する

ProjectWindow > ContextMenu( 右クリック ) > Create > AudioMixer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/324adcbc-c992-d5b5-85d5-7e8e2c8ffb47.png)

今回はTestAudioMixerを作成、初期状態の画像が以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/010375d2-db82-2836-e98a-c0bb9a67a6d1.png)

今回は画像のMaster要素( グループという )の操作をメインに扱う
次はこのAudioMixerを編集するためにAudioMixerWindowを開く
メニューの Window > Audio > AudioMixer
又はショートカットの ```Ctrl + 8```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/15865a36-7856-8110-455a-51426e487f08.png)


AudioMixerのデフォルト画面が下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/1eefc613-0c26-804d-1d56-302c50b9250e.png)


今回メインで扱うのは画像のうちでの ```Groups```要素
Groupsの右端にある + アイコンをクリックまたはGroups要素上で右クリック Add child groupを選択し新しいグループを作成する
この際新たに作成したGroupは必ずMasterの下に来るMasterの下であれば各種グループの親子構造は自由に編集できる

今回はSEというグループを新たに作成した、新たなグループを作成したウィンドウ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/15bec58d-d3b0-9af8-5b9c-ebc7f68e2668.png)


ただしこのままではスクリプトからのアクセスは出来ずUnityのGUIからのみ編集可能の状態、これをスクリプトからアクセスし編集できるようにするまでが今回の記事

次に見る箇所はAudioMixerからInspectroに移る、SEグループを選択したうえでInspectorを表示すると下図のようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/e1a2e3cf-3bd2-bd45-9ca8-eff36efa6e3f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/bf6bc8fd-bf43-5872-fb87-eadd29e3a94b.png)

図のAttenuation 要素の Volumeにカーソルを合わせ右クリック > Expose 'Volume (of SE)' to scriptを選択する、こうすることでスクリプトからアクセス可能になる、ただしこのままだとスクリプトからアクセスする際のKeyがわからない
ちなみにVolumeでアクセスを試みたところ駄目だった
ではどんなパラメータ名になっているのか、確認する方法は以下の通り( 個人的にこれは罠だと思ってる、すっげぇわかりづらい )

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/74939d37-d4c6-b305-9e3a-2041115aab9f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/e14a0066-cfae-7932-c782-1575786258dc.png)


赤矢印の箇所をクリックして開く、すると先ほど作成したパラメータ名がわかる( MyExposeParam )となってるところ
右クリックでメニューを開き、Rename を選択、今回は SE という名前にした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/ba477ab1-3334-76cb-efde-8d545e349eaf.png)


これでスクリプト上からアクセスできる
スクリプト例( あらかじめInspector上からmixerパラメータにAudioMixerへの参照を設定しておく )

```csharp

    void Hoge()
    {
            mixer.SetFloat("SE", -40f);
    }
```

要注意な点はここで設定する値は 0 ~ 1 の値ではなくdB単位( -80 ~ 0 )なので直感的な0 ~ 1での制御をしたい場合は別途 0 ~ 1 をデシベルに変換する関数を作成する必要がある

↓参考ページ
http://www.proaudioinfo.com/shiryou/db/db.htm

関数にするとこんな感じ

```csharp

    // 0 ~ 1の値をdB( デシベル )に変換.
    float ConvertVolume2dB(float volume) => Mathf.Clamp(20f * Mathf.Log10(Mathf.Clamp(volume, 0f, 1f)), -80f, 0f);

```



## あとがき

いろいろエフェクトを掛けられたりできるので便利なため今後この AudioMixer を活用していきたい
今回はここまで、地味にこのパラメータをスクリプト上から操作するの手順が見つからなかった( Unityにはもう少しわかりやす手順書を作ってもらいたいところ或いはたんに見つけられてないだけ? )