Unity5.4.0f3でADX2LEv202使う注意点

福島ゲームジャム2016　#fgj16 に参加していてADX2LEを弄っていて、
いろいろ対処してみた。

# CRI Atom Windowでエラーになるのを回避

get_streamingAssetsPath is not allowed to be called from a ScriptableObject constructor (or instance field initializer),call it in OnEnable instead. Called from Sccriptable See "Script Serialization" page in the Unity Manual for further details.
などとエラーがでる。

とりあえずCRI Atom Windowがエラーを吐くので

32行目あたりの

```　CriAtomWindow.cs
public string searchPath;// = Application.streamingAssetsPath;
```
をコメントアウトし
(５.4.1 Windows番では上のコメントはしないでも動くとの報告あり（Unity修正された？））

57行目で

```　CriAtomWindow.cs
private void OnEnable()
{
 ...
searchPath = Application.streamingAssetsPath;
}
```
をセットするように変更するとエラーが消せる。

# Unityの新機能のマルチシーンで初期化してみる

UnityのLoadLevelがレガシーとして使えなくなってしまったので、
マルチシーンの対応をしてみる。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/43785c5e-10a5-9b87-e1c4-c8a9dc86c2c7.png)

SoundSetupのシーンを作る。

CriWareLibraryInitializerとCriWareErrorHandlerを用意。

## CRIWAREを用意する

とりあえずacf,acbを用意し、Uodate Assets of "CRI Atom Craft"でUpdateし
![image](https://qiita-image-store.s3.amazonaws.com/0/96808/13d4c641-730e-a9f8-1686-a068b9428714.png)

実行モードにして、「Reload Info」で、キュー一覧がでてくるので、

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/20140bf2-57b4-c04d-5ba2-746ebc09d68e.png)

実行モードを一度停止し、
「Create GameObject」ボタンで、キューを作ると　「CRIWARE」オブジェクトができる。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/4a30581d-89ca-f39f-c5fd-0f0d52e16778.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/870b6959-aae9-9eaf-acdd-3eb4d23be9da.png)
設定はこんな感じ。
Dont Destroy On Loadをチェックする。
（あるいは、CRI Atomスクリプトをつけて手動で設定する）

##このSoundSetupシーンをBuild Settingsに追加しておく。
![image](https://qiita-image-store.s3.amazonaws.com/0/96808/7606c857-b6ba-d5e6-8c85-cc6ec49ac16c.png)

## シーンをロードするスクリプトを書く

```SoundSetup.cs
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class SoundSetup : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        SceneManager.LoadScene("SoundSetup", LoadSceneMode.Additive);
    }
}
```

プレファブ化して、シーンに追加しておく
![image](https://qiita-image-store.s3.amazonaws.com/0/96808/2cdc9984-c071-2cd2-b64a-b1fd695c5b98.png)

## SoundManager.csを作る

```SoundManager.cs
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class SoundManager  : SingletonMonoBehaviourFast<SoundManager>{

    CriAtomSource source;
	// Use this for initialization
    void Start () {
        StartCoroutine("PlayBGM");
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    void OnSceneLoaded(Scene scene, LoadSceneMode loadSceneMode) {
        StartCoroutine("PlayBGM");
    }
	
    /// <summary>
    /// シーンに合わせてBGMを変更する
    /// </summary>
    /// <returns>The background.</returns>
    IEnumerator PlayBGM()
    {
        yield return new WaitForSeconds(1.0f);  
        if (SoundManager.instance.source == null)
        {
            SoundManager.instance.source = this.gameObject.AddComponent<CriAtomSource>();
        }

        if(SceneManager.GetSceneByName("Title").isLoaded)
        {
            SoundManager.instance.source.Play("Title");
        }

        if(SceneManager.GetSceneByName("CharaAndStageSelect").isLoaded)
        {
            SoundManager.instance.source.Play("TitleArpOn");
        }
    }

    /// <summary>
    /// SEを鳴らす
    /// </summary>
    /// <param name="name">Name.</param>
    public void PlaySE(string name)
    {
        SoundManager.instance.source.Play(name);
    }

    /// <summary>
    /// 足音　単発　足跡が着くときの音
    /// </summary>
    public void PlayFootStep()
    {
        SoundManager.instance.source.Play("footStep");
    }

    /// <summary>
    /// 足をすべらせて落ちる音
    /// </summary>
    public void PlayFall()
    {
        SoundManager.instance.source.Play("fall");
    }

    /// <summary>
    /// ゴールにたどり着いた音
    /// </summary>
    public void PlayGaol()
    {
        SoundManager.instance.source.Play("footSteps");
    }

}
```

SoundManager.csはDontDestroyのオブジェクトにくっつけておく。
（シーンが切り替わっても鳴り続けるCri Atom Sourceがついているので）

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/25778d6f-39d1-fcdf-34f7-9c046052d59c.png)

実行中のオブジェクトはDonDestroyOnLoad側にいる

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/42bca1a8-a7db-0882-da40-54de5bc1b939.png)

今の所、こんな感じ

#マルチシーンのさらなる注意、1フレーム遅れて参照
http://tsubakit1.hateblo.jp/entry/2016/04/18/011411
をみると
１フレーム遅らして参照しないといけない？

SoundSetupシーンが読み込まれる前とかにSoundManagerやCriAtom関連アクセスしてしまうとnullアクセスになるかもしれない。

```CriAtom.cs
	public static CriAtomExAcb GetAcb(string cueSheetName)
	{
        //  もしinstanceがなかったら
        if(CriAtom.instance == null)
        {
            Debug.LogWarning(" CriAtom.instance is null!");
            return null;
        }
```

こんな感じで、なにかGetAcbでnullアクセスしてたので回避した。

（上の例はちゃんとセットアップシーンを読んでいれば起きないかもですが）

#デバッグ時の対応について
どうも、初回のシーンでロードができるけど、デバッグ中なども、気をつけないとCriAtomの準備が間に合わないで処理が呼ばれてしまう様子・・・
Unityにお願いしたいのは、何よりも先に読んでくれる特別なシーンみたいのがあると嬉しいのだが・・・
（リリースの場合は、そのSetUpシーンから初めてタイトルシーンとか遷移するようにすればいいかもだが、デバッグ中にそれができないのがつらいところ。）

ヒントいただきました：
デバッグ時（UnityEditor時）のみですが、シーンロードしてから、ごにょごにょするといいかも・・・
できるかな・・・

#バージョン管理で、何かメタファイルで怒られる
![image](https://qiita-image-store.s3.amazonaws.com/0/96808/1221f3c5-029d-2cda-0adf-84b248051f9f.png)

まれによくあるのですが、
このAndroid.metaとかiOS.metaがなぜかバージョン管理のと一致しなくなる現象
（てかフォルダにmetaファイルできるんだ・・・）

とりあえずUnityを終了して、ローカル削除して、最新を取得しなおして解決するという感じ。