unityroomでADX2を使う

# はじめに

まず、残念ながら
ADX2LEではUnity WebGL用のデータが作れません。
将来的なTipsとして載せておきます。

ADX2 Unity for WebGLでは使えますが、
使用する場合はライセンスなどの確認が必要です。

ここでは、将来のため人柱的に
Unity1weekで試みた備忘録になります。

## 環境は

Mac 
Unity 2018.3.8f1　（2019-03-16時点での最新）
CRI Atom Craft Ver.3.35.00　（2019-03-16時点での一つ前のバージョン）
Unity for WebGL（2019-03-16時点での最新）
CRIWARE Unity Emscripten Ver.2.30.42  
を使用。

# データの作成
WebGLターゲットを追加し、
Unity Assetsを出力するようにしてビルド。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/f2542da8-f9f8-fd89-0de2-9b555711f05c.png)


Unityで新規プロジェクト作成

[チュートリアル](https://game.criware.jp/manual/unity_plugin/jpn/contents/atom4u_qstart_game.html)
をみつつ

Unity PluginではAtom WindowからAssetsを選択して
Updateしてデータ更新。

UnityのSwitch TargetでWebGLに切り替えて

AtomPlayerのPlayOnStartをチェックし
Editor上で実行、音が鳴ることを確認。

ビルドしてブラウザで音が鳴ることも確認。

# unityroom対応

さて、[unityroom](https://unityroom.com/)へあげてみて音が鳴るだろうか？

**音が鳴らない！**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/42b5461b-1041-27e3-4c29-77b68d4c4607.png)

ブラウザで実行中に
cmd+opt+iキーで開発者モードに
エラーが出ているのがわかる。

ACFのロードに失敗している。

unityroomの仕様で、streamingAssetsのファイルを上げることができない
これが原因で音が鳴らない。

これをなんとか解決しないといけない。

ADX2のチュートリアルなどでは、
streamingAseetsにデータが置かれているけれど、
実のところこれ、好きなところからロードできるようです。

参考→ [ADX2Web版でありそうな対処](https://www53.atwiki.jp/soundtasukeai/pages/22.html#id_0daf8c9c)

どうやらtextリソースとしてbytes配列で渡す方法があった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/f5f44746-4208-80ea-4acf-79f395bbcc72.png)

Resourcesにファイルを移動し、拡張子をbytesに変更。
HierarchyにあるCRIWAREとbgm(CriAtomSource)を無効化。（こちらでロード再生できないので）

空のGameObjectを追加して、
ADX2Loaderなるスクリプトを追加。ここでリソースからもロードと再生をしてみた。

``` ADX2Loader.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ADX2Loader : MonoBehaviour
{
	CriAtomSource atomSourceSe;
	byte[] raw_dataAcf;
    byte[] raw_dataAcb;
    IEnumerator Start()
    {
        // ----
		// テキストアセットとしてACFを読み込む。tunagary20190316-2.bytesはResourcesフォルダに配置する。
        // ----
        TextAsset text_assetAcf = Resources.Load<TextAsset>("tunagaru20190316-2");
        raw_dataAcf = text_assetAcf.bytes;
        // ----
        // テキストアセットとしてACBを読み込む。CueSheet_0.bytesはResourcesフォルダに配置する。
        // ----
        TextAsset text_assetAcb = Resources.Load<TextAsset>("CueSheet_0");
        raw_dataAcb = text_assetAcb.bytes;
        // ----
        // ACF登録
        // ----
        CriAtomEx.RegisterAcf(raw_dataAcf);

        // ----
        // CriAtomを作成しゲームオブジェクトに追加
        // ----
        this.gameObject.AddComponent<CriAtom>();
        // ----
        // キューシートを追加
        // ----
        var cuesheet = CriAtom.AddCueSheet("CueSheet_0", raw_dataAcb, null);
        // ----
        // キューシートのロード完了まで待つ WebGL版はロードに時間がかかる（ロード前にAtomにアクセスしないようにここで待つ）
        // ----
        while (cuesheet.IsLoading)
        {
            yield return new WaitForEndOfFrame();
        }
        // ----
        // DSPバス設定
        // ----
        CriAtom.AttachDspBusSetting("DspBusSetting_0");



		atomSourceSe = gameObject.AddComponent<CriAtomSource>();
		atomSourceSe.cueSheet = "CueSheet_0"; //キューシート名指定

		atomSourceSe.Play(0); // キューID指定再生
    }
}

```

Editorで音が鳴るのを確認！

[unityroom](https://unityroom.com/games/shdb2019)でも音が鳴るのを確認！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/dd3d666b-15ef-22ae-cc1f-eb34e667b72f.png)

## データにビート同期情報埋め込んだり

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/d0972eb5-662e-047d-b533-f240b84a382d.png)

アクションで音止めたり
アクション経由で音を鳴らすことでビート同期させたり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/1663bb40-7447-29d6-ffbc-700310cc0470.png)

ビート同期でオブジェクトの大きさ変えたりはこちら
[CRIADX2のビート同期を使ってリズムに合わせた演出をつける](https://qiita.com/nishimura-ma/items/bac6e3d6528490bd9e36)
を参考に

再生後にコールバックを設定しないとうまくいかないところが注意点。
Editor上だと問題なくても、ブラウザで動かすと再生タイミングによってうまくコールバックが機能しない時があった。
確実に再生されているタイミングでコールバックを登録する。

# まとめ
Webならではの対処がいろいろあるけど、
一度鳴ってしまえばあとはPC版と同じはずなのでいろいろできそう。

実際のところ、Web上でのファイル操作などはURL指定だったりするのかもしれない。（Web関連詳しく無いけど、ストレージサービスみたいなのとかでも、上の例みたいなバイナリでロードもできるのでいろいろとできるはず）
なにかの参考になれば幸い。