ADX for Unityでゲーム内BGMの曲調切り替え、トラック遷移

# はじめに
ゲーム開発において、ゲームの中の状況に応じてBGMの切り替えをスムーズに行いたいと思ったことはありませんか？例えばプレイヤーのHPが少なくなった時に危険を演出するアレンジに切り替える（回復すれば戻る）、一時的な強化状態の曲に切り替える、などです。
本記事ではUnityとサウンドミドルウェア「ADX for Unity」を用い、ゲーム内のシチュエーションに合わせてBGMを変化させる演出を実装します。

※こういった手法をインタラクティブミュージックといいますが、より詳細な内容は「[Unityでインタラクティブミュージックを実装 with ADX 基礎編](https://qiita.com/Takaaki_Ichijo/items/8a18f72d4cb6a10f77e1#ゲームにインタラクティブミュージックを実装しよう)」を御覧ください。

この記事は「ADX2 for UE4でゲーム内BGMの曲調切り替え、トラック遷移」のUnity版です

[https://qiita.com/SigRem/items/8dfdb54b9eca8bca50e8](https://qiita.com/SigRem/items/8dfdb54b9eca8bca50e8)

# 前提

### 動作確認環境

Windows 10 Home 20H2
Unity 2020.3.27f1  + ADX LE Unity SDK 3.06.03
CRI ADX LE Tools for Windows 3.46.09

### 前提記事

CRI ADX導入方法や基本的な操作については以下の記事を参照して下さい。

Unityのサウンド機能をADXで強化する

[https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377](https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377)

# やること

- AtomCraftで複数トラックを持つキューを作成
- Unityにインポート
- トラック切り替え再生の実装

# 実装

## AtomCraft側の作業
まずは、再生するBGMの設定を行います。
ADXにおいて、再生用のデータはUnityとは別のツール「AtomCraft」を使い設定します。
その手順については、元の記事（UE4向け記事）の同名の項と同じになりますので省略しています。
本記事の手順を試す場合は、まず元の記事の[該当項目](https://qiita.com/SigRem/items/8dfdb54b9eca8bca50e8#atomcraft%E5%81%B4)を進めてから本記事を進めてください。

### 元記事との違い

音源にループ設定を行います。マテリアルツリーの音源をクリックし、ヒエラルキーから「ループ情報の上書き」をTrue、「ループタイプ」をループに変更します。

![ループの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/a40e5e60-e22e-c68a-2e31-4869833ee070.png)

もう一つ、「Atomキューシートバイナリのビルド」画面で、一番左下のオプション「UnityAssets出力」にチェックを入れるのを忘れないようにして下さい。
また、「セレクターによるトラック遷移」は[様々な制約](https://game.criware.jp/manual/native/adx2/latest/criatom_tools_atomcraft_track_transition_by_selector_attention.html)が存在するため、新規作成時しか選択できない（Cueを作成してからタイプを変更できない）ことに注意して下さい。

## Unity側の実装

### キューシートのインポート

AtomCraftからエクスポートしたファイルをインポートします。

### スクリプトを作成

以下のスクリプトをTransitionOfSelector.csとして作成します。

```TransitionOfSelector.cs
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

public class TransitionOfSelector : MonoBehaviour
{
    public CriAtomSource criAtomSource;
    private CriAtomExPlayer ex;

    private void Start()
    {
        ex = criAtomSource.player;
        criAtomSource.Play();
    }

    private void OnTriggerEnter(Collider other)
    {
        ex.SetSelectorLabel("BGM_Track", other.gameObject.tag);
        ex.UpdateAll();
    }

}
```

SetSelectorLabelによってセレクターとセレクターラベルを変更し、トラックの遷移を行います。ただし変更したパラメータはUpdateAll(またはUpdate)メソッドを実行するまで更新されず、トラックの遷移が起こらないことに注意して下さい。

### テストシーンの作成

以下のようなシーンを作成します。

![テストシーン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/8d030392-4aa8-cc42-ddd5-993b983bba6e.png)

- CriWareLibraryInitializer、CriWareErrorHandler
    - 基本コンポーネント、GameObject＞CRIWAREから作成
- CRIWARE
    - 自動生成
- Music_01(CriAtomSource)
    - 前項でインポートした音源

![A-Cの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/78bcf2ee-6582-6a5d-2cf4-0b907be6d05c.png)

- A～C
    - BOX ColliderだけつけたGameObject
    - scaleは10にし、それぞれ重ならないようずらして配置
    - タグをそれぞれ「Track_A」「Track_B」「Track_C」にする
        - AtomCraftで作成したセレクターラベル名と一致させる

![Sphereの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/d6582d0b-fb90-68b9-b5b4-e3bda43698e4.png)

- Sphere
    - Sphereオブジェクト
    - Sphere ColliderのisTriggerにチェックを入れる
    - RigidbodyコンポーネントとTransitionOfSelector.csをアタッチ
    - TransitionOfSelector.csのCriAtomSourceにMusic_01を設定する

### テストシーンの実行

ここまで出来たら忘れずに保存し、実行しましょう。
Sphereを掴み、A～CのBoxColliderの中に移動させてみます。するとUnityで設定したタグと、AtomCraftで設定したセレクターに対応するBGMに切り替わるのが確認できます。

# 補足

この方法の特徴はトラックをまるごと切り替える制御が簡単にでき、Unityから扱う場合は一つの音源ファイルとして扱えることです。アレンジ曲を複数用意し組み合わせて切り替えたり、一つの音源を複数登録しそれぞれフィルターを掛けて切り替えるといった使い方が出来ます。

似たような機能でポリフォニック（AISAC値によるコントロール）があります。こちらは各トラックを0-1のfloat値によって調整する事が出来るため、より高度な機能となります。実装方法については[こちら](https://qiita.com/Takaaki_Ichijo/items/8a18f72d4cb6a10f77e1)で紹介しています。