福島ゲームジャム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行目あたりの
public string searchPath;// = Application.streamingAssetsPath;
をコメントアウトし
(5.4.1 Windows番では上のコメントはしないでも動くとの報告あり(Unity修正された?))
57行目で
private void OnEnable()
{
...
searchPath = Application.streamingAssetsPath;
}
をセットするように変更するとエラーが消せる。
Unityの新機能のマルチシーンで初期化してみる
UnityのLoadLevelがレガシーとして使えなくなってしまったので、
マルチシーンの対応をしてみる。
SoundSetupのシーンを作る。
CriWareLibraryInitializerとCriWareErrorHandlerを用意。
CRIWAREを用意する
とりあえずacf,acbを用意し、Uodate Assets of "CRI Atom Craft"でUpdateし
実行モードにして、「Reload Info」で、キュー一覧がでてくるので、
実行モードを一度停止し、
「Create GameObject」ボタンで、キューを作ると 「CRIWARE」オブジェクトができる。
設定はこんな感じ。
Dont Destroy On Loadをチェックする。
(あるいは、CRI Atomスクリプトをつけて手動で設定する)
このSoundSetupシーンをBuild Settingsに追加しておく。
シーンをロードするスクリプトを書く
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class SoundSetup : MonoBehaviour
{
// Use this for initialization
void Start()
{
SceneManager.LoadScene("SoundSetup", LoadSceneMode.Additive);
}
}
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がついているので)
実行中のオブジェクトはDonDestroyOnLoad側にいる
今の所、こんな感じ
マルチシーンのさらなる注意、1フレーム遅れて参照
http://tsubakit1.hateblo.jp/entry/2016/04/18/011411
をみると
1フレーム遅らして参照しないといけない?
SoundSetupシーンが読み込まれる前とかにSoundManagerやCriAtom関連アクセスしてしまうとnullアクセスになるかもしれない。
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時)のみですが、シーンロードしてから、ごにょごにょするといいかも・・・
できるかな・・・
バージョン管理で、何かメタファイルで怒られる
まれによくあるのですが、
このAndroid.metaとかiOS.metaがなぜかバージョン管理のと一致しなくなる現象
(てかフォルダにmetaファイルできるんだ・・・)
とりあえずUnityを終了して、ローカル削除して、最新を取得しなおして解決するという感じ。