ADX2でインタラクティブミュージック(2) Unity組込み


ADX2LEでインタラクティブなBGMをつくってみます。
ADX2の概要や基本的なことはほかの方が丁寧な説明を書いてくださっているので省略し、このドキュメントではランダム機能を用いてバリエーション豊かなBGMを実現したキューを再生する手順を説明します。

## ゴール

[前回]( https://qiita.com/dTAT/items/c28f5ee11b08cc2c1b5d )にて作成したキューを利用して、ポーズ画面ぽいものを開く/閉じるした際にいい感じに遷移するものを実現します。

## 素材の再調整

### ループの変更
![blocks.png](https://qiita-image-store.s3.amazonaws.com/0/18557/f4e9cb13-6a16-c65e-9a4b-6f3b3f7de7fb.png)
おそらく現状このような構成になっているかと思います。これをポーズを開閉したタイミングにてMainとBreakdownをきりかえたいので、Mainの遷移先はMainに、Breakdownの遷移先はBreakdownになるようにそれぞれ設定します。設定方法は割愛します。

### 分割点の変更
現状のままでもよいのですが、これだとMainからBreakdownに遷移するにはMainの終わりまで待ってしまうので最長8秒間は切り替わりません。BreakdownからMainへの遷移のための待ち時間はさらに長いです。

そこでMainとBreakdownそれぞれにおいてクの終わり以外でも遷移するタイミング、分割点を設定します。

ブロックを選択して右クリックメニューから「プロパティリスト」を選択しするとブロックのプロパティが表示されます。その中のブロック＞”ブロック分割数”欄の数を適当に変更します。とりあえずここでは4にしました。パーカッションを聞いた感じと2秒程度で変化すれば遅すぎないかなという勘の数値です。

分割数を設定したらその下にある”ブロック遷移タイミング”欄の設定を”指定分割で”に変更します。
![blockdev.png](https://qiita-image-store.s3.amazonaws.com/0/18557/341fa338-c0fe-ed29-5364-805fff74f100.png)
Breakdownのほうも8分割程度にしておきます。

### ビルド
ここまでできたらメニューの「ビルド」＞「Atomキューシートバイナリのビルド」を選択し、作成したキューがふくまれるキューシートにチェックがついているのを確認して「クリーンビルド」します。
※キューシート名はCueSheet0とかがデフォルトですがわかりやすいようにBGMという名前に変更してあります。
![build.png](https://qiita-image-store.s3.amazonaws.com/0/18557/ccf088cc-02fc-5978-c280-51dd9b6044b8.png)

## Unityへの組込
ADX2LE(もしくはAppStore版)Pluginの適応は完了して「Window」>「CRIWARE」が開ける状態になっている前提ですすめます。完了していない場合は参考ページを読んでPluginを適用してください。

ただ、参考ページの頃と2018/1現在では少し手順が違うようですので補足しておきます。
### ADX2ファイルの取込

まず「Window」>「CRIWARE」＞「Open CRI Atom Window」よりWindowを開きます。
つぎにSelectAssetsRootボタンをおして、ビルドの際に出力したフォルダ内のAssetsフォルダを選択します。
選択できたら「Update Assets of "CRI Atom Craft"」ボタンをおします。これでUnityプロジェクト内にファイルが取り込めます。
![craftwindow.png](https://qiita-image-store.s3.amazonaws.com/0/18557/a97c71f8-d118-50d0-adcd-ae6446f8698c.png)

### 再生オブジェクトの生成

コードベースでやってもいいのですが今回はなるべくコードを書きたくないのでCRI Windowの機能ですすめます。

さきほどのCRI Atomウィンドウを開いたまま、ヒエラルキーにGameObjectを作成してBGMPlayerと名付けます。

作成したらUnityエディタのPlayボタンを押して再生状態にします。この状態でCRI AtomウィンドウのReload Infoを押すと、現状のCue Sheet情報がとりこまれます。

CueSheetのプルダウンからAtom Craftで出力した際のCheSheet名、ここではBGMを選択するとCueName一覧が表示されます。

前回作成したCue("UnityDemo")を選択したら下部のAddComponentを押します。すると先ほど作成したGameObjet、BGMPlayerにCriAtomSourceというComponentが付与されます。このComponentをのComponentメニュー（右肩の歯車）をえらび、CopyComponetを選択します。
![craftwindow2.png](https://qiita-image-store.s3.amazonaws.com/0/18557/455e1ce8-9ffd-6bef-fa67-45e2f1dfc704.png)

エディタの再生をストップしたら、BGMPlayerのComponentメニューから「Paste Component as New」を押して、先ほどのComponentを付与します。

次に普通にAddComponentボタンをおして”Cri Atom”Componentを追加します。このCompoentは必要なファイルを読み込んでくれるComponentです。
このComponentの”ACF  File”欄にCraftをビルドした際のACFファイル名を、”Name”欄にCri Atom SourceのCueSheet名を、”ACB File”欄に生成されたACB名を、それぞれ入力します。（これ手入力しかないんでしょうか...?）

この二つのComponentだけでロードと再生を行ってくれるため、Cri Atom Sourceの”Play On Start”にチェックを入れてエディタの再生ボタンを押すだけでつくっておいたCueが再生されるはずです。もしエラーなどがでるようならば、だいたいCri Atomでうまく読み込めてなかったりする場合が多いので入力した情報を再確認するとなんとかなったりします。

![craftwindow3.png](https://qiita-image-store.s3.amazonaws.com/0/18557/5b148f14-5366-3a4b-3cdc-98667401e1f8.png)

再生できたのを確認したら次にすすみます。

### 遷移をスクリプトから行う

まずCri Atom SourceのPlay On Startのチェックを外します。

次に以下のBGMPlayerLT.csスクリプトをプロジェクトに追加します。
また、Editorフォルダの中に以下のBGMPlayerLTExt.csスクリプトを追加します。

追加したらGameObject、BGMPlayerにBGMPlayerLTを追加します。

BGMPlayerLT.cs

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BGMPlayerLT : MonoBehaviour {
	CriAtomSource atomSource;
	CriAtomExPlayback playback;
	/// <summary>
	/// Awake is called when the script instance is being loaded.
	/// </summary>
	void Awake () {
		atomSource = GetComponent<CriAtomSource> ();
	}

	/// <summary>
	/// Start is called on the frame when a script is enabled just before
	/// any of the Update methods is called the first time.
	/// </summary>
	void Start () {
        //再生開始した際にplayback情報を取得しておく
		playback = atomSource.Play ();
	}
	public void SetNextBlockIndex (int index) {
		if (playback.status != CriAtomExPlayback.Status.Playing) {
			return;
		}
        ///この関数で次の遷移タイミングでどのブロックに移動するか指定できる。
		playback.SetNextBlockIndex (index);
	}
}
```

BGMPlayerLTExt.cs

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

[CustomEditor (typeof (BGMPlayerLT))]
public class BGMPlayerLTExt : Editor {
    int nextBlockIndex = 0;
    public override void OnInspectorGUI () {
        var t = target as BGMPlayerLT;
        nextBlockIndex = EditorGUILayout.IntField (nextBlockIndex);
        if (GUILayout.Button ("apply")) {
            t.SetNextBlockIndex (nextBlockIndex);
        }
    }
}
```

GameObjectが以下の画像のようになっていればOKです。

![gameobject.png](https://qiita-image-store.s3.amazonaws.com/0/18557/c6cc75c4-ef05-1163-ed59-792572d34275.png)

エディタのPlayを行うと自動的にBGMが再生されるはずです。
その状態でBGMPlayerLTのIntFieldに1を入力してapplyをおすとCraftで設定したMainに遷移するはずです。同様に0でIntro、2でOutroに遷移します。
このIDはブロックの並び順です。

コードを見ていただければわかるように、遷移は「playback.SetNextBlockIndex (index)」のみで制御が可能です。

確認ができたらあとは適当につくったポーズメニューの開くタイミングで「playback.SetNextBlockIndex (2);」、とじるタイミングで「playback.SetNextBlockIndex (1);」となるようなUIを作成すれば完成です。
※ここからはuGUIとかの領域なので説明割愛させてください...

## まとめ
AtomCraft  でブロックと各ブロックの遷移タイミングを指定してやれば、「playback.SetNextBlockIndex (index);」をつかって簡単に遷移を指定できることがおわかりいただけたかと思います。

この機能を使えば、イントロ、戦闘中のループフレーズ、クライマックスフレーズを上手くループさせて表現するといった演出も簡単につくれます。
非常に簡単なのでADX2を採用された際はぜひ挑戦してみてください。

## 参考
- [CRI Atom Craftで音声データを作成する-Qiita]( https://qiita.com/Takaaki_Ichijo/items/705f8d3447f7c869df9d )
- [ Unity 5のサウンド機能をADX2 LEで強化する-Qiita ]( https://qiita.com/Takaaki_Ichijo/items/aa58faa062c67afb1a84 )