LoginSignup
7
8

More than 5 years have passed since last update.

Unity5.4.0f3でADX2LEv202使う注意点

Last updated at Posted at 2016-07-30

福島ゲームジャム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;

をコメントアウトし
(5.4.1 Windows番では上のコメントはしないでも動くとの報告あり(Unity修正された?))

57行目で

 CriAtomWindow.cs
private void OnEnable()
{
 ...
searchPath = Application.streamingAssetsPath;
}

をセットするように変更するとエラーが消せる。

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

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

image

SoundSetupのシーンを作る。

CriWareLibraryInitializerとCriWareErrorHandlerを用意。

CRIWAREを用意する

とりあえずacf,acbを用意し、Uodate Assets of "CRI Atom Craft"でUpdateし
image

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

image

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

image

image
設定はこんな感じ。
Dont Destroy On Loadをチェックする。
(あるいは、CRI Atomスクリプトをつけて手動で設定する)

このSoundSetupシーンをBuild Settingsに追加しておく。

image

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

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

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

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

image

今の所、こんな感じ

マルチシーンのさらなる注意、1フレーム遅れて参照

http://tsubakit1.hateblo.jp/entry/2016/04/18/011411
をみると
1フレーム遅らして参照しないといけない?

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

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

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

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8