【Unity x ADX】AisacControl値をデフォルトの値に戻す方法


# はじめに
ADXアンバサダーのこはとです！
UnityでAdxを使っているとき、AisacControlをAtomCraftのデフォルト値に戻したいな～と思うことがあったので、今回はその方法をご紹介します。

この記事では、CRIWAREが提供するサウンドミドルウェア「CRI ADX」の機能についての紹介をします。
ある程度ADXを使用していて、基本的な操作や実装方法を知っている方向けの記事となります。
CRI ADXについてはこちら

https://game.criware.jp/products/adx-le/


# 再生中のCueのエフェクトをリセットしたい…！
ある日の開発中、私はそう思いました。
AtomCraftでは、Cue毎に**Aisacのデフォルトコントロール値**を設定することができます。
これを設定しておくと、Unityなどゲーム上で再生した時に、あらかじめ設定した値のまま再生してくれます。
では、ゲーム中にAisac値を変更したあと、**音声を再生したままAisac値をデフォルトの状態にリセットする**には？
Cue毎にデフォルト値がバラバラだと、逐一それを記憶して初期値に戻すのは面倒です。
今回はそれを一括で処理できる方法を紹介します。

## 先に結論！
### CriAtomExPlayer.ResetParameters()を使おう！
CriAtomExPlayer.ResetParameters()を実行後、CriAtomExPlayer.Update(playBack)を実行することで、変更されたAisacControlを再生したまま初期値に戻すことができます。
```C#:Example.cs
public void Reset()
    {
        //パラメーターリセット
        atomSource.player.ResetParameters();
        //Updateすると再生を維持したままパラメーターのみが更新される。
        atomSource.player.Update(playBack);
    }
```
ただしこれはメソッド名の通り、AisacControlのみをリセットする処理ではありません。
いくつか**注意点**もあるので、順を追って説明していきます。


## そもそもデフォルトコントロールとは？
デフォルトコントロール値って何に使うの？というと、例えばこんなシーン。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450329/95fd8f08-b121-5313-84b5-eeb241874512.png)

上の画像では、AtomCraftでPanの設定をAisac値に追従させています。
この例では、Panの値を曲線(-90～90)で変化させています。
Aisac値が０になると音が左に、１になると音が右に移動する制御ですね。
しかし、このままゲームで再生すると**Aisacの値は０**、すなわち音声は**左に寄った状態**で再生されてしまいます。

このように、制御のパラメーターの関係や演出の関係で、どうしても初期値を0以外で指定したい場合にデフォルトコントロールを使用します。この例だと、初期値は0.5が望ましいですね。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450329/cfaed4f1-ac87-e039-24ed-1d67651fcfe0.png)


↑四角で囲った部分がデフォルトコントロール値の入力部分です。ここに値を入力することで、ゲーム内で再生した場合も、この値のAisacControlを初期値として再生します。


# Q.Cue毎の初期値に戻すには？

最初の話題に戻りますが、例えば、BGMにかかっている効果を初期値に戻すような制御があったとします。
ゲーム内の全ての音声が先述のような設定だけなら、0.5に戻せば良さそうですが…
* Aisacでボリュームがなだらかに変わるBGM：**Aisacのデフォルト値は０**
* Aisacで再生速度の加速、減速があるBGM：**Aisacのデフォルト値は0.3**
* Aisacで音声を左右にパンするBGM：**Aisacのデフォルト値は0.5**

というように、異なるデフォルトコントロール値を持つBGMがゲームに存在している場合、全てのBGMに対し、共通の処理でデフォルトコントロール値に戻すにはどうすればいいでしょうか？

# A.CriAtomExPlayer.ResetParameters()を使おう！
Cue毎のAisacControlをリセットしたいときは、CriAtomExPlayerクラスの**ResetParamaters()** が有効です。
ResetParamaters()は、CriAtomExPlayerのVolume等のパラメーターを初期値に戻すメソッドであり、この際、**AisacControlもデフォルトコントロール値に戻ります**。

https://game.criware.jp/manual/unity_plugin/latest/contents/classCriWare_1_1CriAtomExPlayer.html#a7178038c3cb8d247eadb94cd2058c432:~:text=void%20ResetParameters

今回は、これを利用してAisacControlをAtomCraftで設定したデフォルトコントロール値に戻します。
試しに以下のようなコードを作成してみました。
```C#:AudioPlayer.cs

using CriWare;
using UnityEngine;

public class AudioPlayer : MonoBehaviour
{
    //Cueを設定したAtomSourceゲームオブジェクトを作成し、ここに設定。
    [SerializeField]
    CriAtomSource atomSource;
    //値反映用のPlayBack
    CriAtomExPlayback playBack;


    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        //状態更新用PlayBackの取得
        playBack = atomSource.Play();
    }

    // Update is called once per frame
    void Update()
    {
    }

    /// <summary>
    /// GUIのボタンなどで実行
    /// Cueに設定されたAisacControl_00を任意の値に変更
    /// </summary>
    public void ChangeAisac(float val)
    {
      atomSource.SetAisacControl("AisacControl_00", val);
      atomSource.player.Update(playBack);
    }

    /// <summary>
    /// SoundManagerクラスなどから実行
    /// パラメーターを初期化する
    /// </summary>
    public void Reset()
    {
        //パラメーターリセット
        atomSource.player.ResetParameters();

        //Updateすると再生を維持したままパラメーターのみが更新される。
        atomSource.player.Update(playBack);

        Debug.Log("reset");
    }
}

```
このコードでは、任意のCriAtomSourceを再生し、任意のタイミングでAisacの変更、リセットができます。
ChangeAisac()でAisac値の変更ができるので、GuiのButton等で値の変更後、Reset()を実行して変更したAisacControlがもとに戻るのを確認してみましょう。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450329/516b8c54-891a-5566-7d4c-dd31d6c2847d.png)


これで親スクリプトは、CueそれぞれのAisacデフォルトコントロール値を気にすること無く、一括の処理でAisac値をAtomCraftで設定した初期値に戻すことができます。


# ResetParameters()を使う上での注意
今回はAisacControlのリセットという使い方でこのメソッドを紹介しましたが、いくつか注意点があります。
### ・Aisacのデフォルトコントロール値は取得できない
「そもそもデフォルトコントロール値を取得すればいいじゃん！」という考えもあるかもしれませんが、現時点でAisacのデフォルト値を取得するAPIは存在せず、現在のAisacControl値は、あくまでもAisacControlの値の変更後のみ取得が可能です。

```C#:Example.cs
public void GetAisacValue()
{
    //任意のAisacControlのValue(float)を取得
    CriAtomExPlaybackDebug.GetAisacControl(playBack, "AisacControl_00", out var val);
    //ここまでにAisacControlの変更がされている場合：val = 変更した値
    //ここまでにAisacControlの変更がされていない場合：val = 0（デフォルト値関係なく0）
    
    //ログ出力
    Debug.Log("Aisac Value = " + this.gameObject.name + val);
}
```
これはResetParamaters()実行後も無変更時と同様で、AisacControlの値を取得しても0が返されるので注意してください。

### ・記事の例だと、全てのパラメーターがリセットされるわけではない
実はResetParamaters()の実行後にUpdate(playBack)でAisacControlのリセットをするのは、やや捻った使い方になります。
スクリプトリファレンスやSammaryにもある通り、本来はResetParamaters()実行後、**Start()を実行することで、完全に全てのパラメーターの更新が行われます**。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450329/fed6231e-ec79-5a77-11d7-658a52475e7e.png)

ですが、一方でStart()を実行すると音声が最初から再生されてしまうため注意が必要です。
今回はあくまでもAisacControlのリセットが目的だったため、ResetParamaters()を裏技的な方法で使用していますが、もし他のパラメーターも一括でリセットしたい！という場合は、Update(playBack)ではなくStart()を実行する、または、パラメーター単体での初期化を行うようにしましょう。

### ・逆に、AisacControl以外もリセットされる
上記からもわかる通り、逆にVolumeなど**AisacControl以外の一部の値**もUpdate(playBack)のタイミングで**更新されてしまいます**。
もしAisacControl値以外のパラメーターの状態をキープしたいのであれば、ResetParamaters()の前に予め値を取得し、Update(playBack)の後に改めて値を設定するなどで対策する必要があります。

# 以上！
これにより、特に大量の音声、BGMを運用する場合や、サウンド担当と実装担当が別々のプロジェクトの場合など、実装側はAtomCraft側の設定を気にすること無く、AisacControl値をリセットすることができます。
是非ご自身のプロジェクトでも活用してみてください！