はじめに
ADXアンバサダーのこはとです!
UnityでADXを使っていると、こんなエラーを時々見かけます
[CRIWARE] Error:E2010040102:Cannot find specified cue name. (Specified cue name is 'SE_Bomb'.)
音が出ないときとかは、大抵このエラーが出力されています。
これは普通のUnityのエラーとは異なり、ADXの機能が出力するエラーです。
内容としては「指定したCueName(この場合は"SE_Bomb")が見つからないよ!」という旨の内容ですが、不具合の原因としてはいくつかのパターンが挙げられます。
本記事では、エラー「Error:E2010040102:Cannot find specified cue name.」が起きたときの具体的な対策方法を紹介します。
本記事では「Asset Support Addon」を導入していないケースでの対処法を紹介します。
Asset Support Addonを導入した場合、本記事で紹介するような不具合の多くを解決し、より安全に音声管理を行うことができますが、内容の複雑化を避けるため、本記事では通常のADX for Unityにおけるエラーの対処法をご紹介します。
https://game.criware.jp/manual/unity_plugin/latest/contents/addon4u_assetsupport.html
Asset Support Addonについては、近日別記事で紹介予定です。
この記事は、CRIWAREが提供するサウンドミドルウェア「CRI ADX」の機能についての紹介をします。
ある程度ADXを使用していて、基本的な操作や実装方法を知っている方向けの記事となります。
CRI ADXについてはこちら
忙しい人向けの結論
この状態にする↓
このGameObject(またはPrefab)を最初のシーンに配置することで、大体の問題は解決できると思います。
以下で詳しく解説します。
目次
- そもそもエラーが出力されない方へ
- CueNameが誤っている
- .acbファイルの更新がされていない
- 「CriAtom」コンポーネントが存在しない
- 再生の実行がCriAtomコンポーネントの初期化より早い
- Sceneの読み込み遷移時にCriAtomが存在せず、初期化が失敗する
前提:そもそもエラーが出力されない方へ
前提条件の話ですが、UnityでCRI ADXを使っていて「音が出ないのに、エラーも何も出ない!」という場合があります。
実は、上述のエラーは「ErrorHandler」(CriWareErrorHandler)というコンポーネントが出力しています。
これらのGameObjectは右クリックのドロップダウンから作成することができますので、事前にSceneへ配置しておきましょう。(作成するだけでOKです)
「Error:E2010040102:Cannot find specified cue name」の原因
エラーの内容としては前述の通り「指定したCueNameが見つからないよ!」という意味ですが、原因は概ね3つのどれかに当てはまります。
- 指定しているCueNameが誤っている
- .acbファイルが更新されていない
- 「CriAtom」コンポーネントを持つオブジェクトが無い、または正しく設定されていない
特に「CriAtom」コンポーネントが存在しない場合の不具合は、いくつかのケースが考えられます。以下でそれぞれのケースとその対処法を記載するので、自身のプロジェクトと照らし合わせて対処を試してみてください。
ちなみに、今回は以下のような処理を任意のタイミングで実行した際のエラーを元に記載しています。(※コードの内容は正常です)
public class Sample_TestPlayer : MonoBehaviour
{
public CriAtomSource source;
public string cueSheetName;
public string cueName;
public void PlaySound()
{
//CueSheetを指定
source.cueSheet = cueSheetName;
//CueNameを指定
source.cueName = cueName;
//音声を再生(状況によってはここでエラー)
source.Play();
}
}
CueNameが誤っている
うっかりでよくやってしまうパターンですね。
ADXではAudioClipの代わりに文字列の指定で音声再生ができるのも魅力の一つではありますが、一方でCueName(文字列)で指定する場合はこういったエラーが起こる場合もあります。
確認すべき点としては
- 大文字小文字を間違えていないか?
- 後ろに半角スペースが入っていないか?
- 0(ゼロ)とo(オー)や、1(イチ)とl(エル)など、似た文字を間違えていないか?
など、視覚的には分かりづらい微妙な違いが不具合の原因になったりします。
対処法
タイプミスしない、というのは難しいので、間違えづらい文字を避けたり、命名規則を決めたりするのも手です。
おすすめの方法としては、Unityのタブから
Window>CRIWARE>AtomBrowser
と開くと、CueNameをCopyできるボタンがあります。
CueNameの確実なコピーをしたい場合は、ここで行いましょう。
.acbファイルの更新がされていない
「AtomCraftでCueを作成したのに、Cueが無い!」という場合、.acbファイル(CueSheetやCueの情報が入っているファイル)の書き出し忘れをしている場合があります。
↓こういうの
ここが更新されていないと、AtomCraftでCueを作成してもUnityのProjectに反映されません。
対処法
.acbファイルは、内容を変更したらその都度書き出す必要があります。
AtomCraftでCueを追加したら、そのたびにacbファイルの更新をするのを忘れないようにしましょう。(ファイルパスの先がUnityプロジェクトのStreamingAssetsフォルダになっていることも忘れずに!)
もしCueを追加した場合、正常に読み込まれていれば、前述のWindow>CRIWARE>AtomBrowserでCueが追加されているのを確認することもできます。
「CriAtom」コンポーネントが存在しない
UnityでADXを使う上で、最低限必要なコンポーネントが3つあります
- ErrorHandler(CriWareErrorHandler)
- LibraryInitializer(CriWareLibraryInitializer)
- CriAtom
最初の2つは、Hierarchy上で右クリックしたドロップダウンから作成できます。
しかし、最後の「CriAtom」はこのメニューからは作成できません。
もし再生できない場合は、エラーが出たタイミングでSceneにAtomCraftコンポーネントが存在しているかを確認してみましょう。
対処法
もし存在しない場合は、通常のコンポーネントと同様、GameObjectの「AddComponent」からCriAtomコンポーネントをアタッチして作成することができます。
作成したら、StreamingAssetsフォルダ内の.acf、.acbのファイルパスを入力する必要があります。
手動で作成するのもいいですが、おすすめの作成方法はAtomBrowserから作成する方法です。ここから作成すると、正確なファイルパスの入力を自動で行ってくれます。
Window>CRIWARE>AtomBrowserから任意のCueを選択し、Window下部のCreateGameObjectをクリックすると、そのCueのAtomSourceと、「CRIWARE」という名前のGameObjectが作成されます。
(「~(CriAtomSource)」のObjectは消してもOK)
作成された「CRIWARE」GameObjectにはCriAtomコンポーネントがセットされ、Cueに紐づいたAcbファイルパスとAcf(設定ファイル)ファイルパスが自動で入力されます。
ちなみに、ACFFile,CueSheetの欄が未入力だと、CriAtomのコンポーネントが存在していても正常に動作しないので注意してください。
再生の実行がCriAtomコンポーネントの初期化より早い
ここからは少し込み入った内容です。
Unityにはメソッドごとに処理順が存在しますが、これによりCriAtomコンポーネントの初期化より前に音声再生が実行された場合は、CriAtom等のコンポーネントが正常にセットされていても動作しない場合があります。
CriAtomの初期化は通常のスクリプトよりも優先して実行される設定のため、通常このような不具合は発生しませんが、ProjectSettings > ScriptExectionOrderでCriAtomより優先して実行される設定になっていたりする場合は、この限りではありません。
対処法
ScriptExectionOrderを変更している場合は、エラー元のスクリプトがCriWare.CriAtomより優先度が下に来ている設定してください。
より詳細にCriAtomが初期化をするタイミングを知りたい場合は、
CriAtomスクリプト内のSetUp()メソッドにDebug.Logを仕込むと、より正確な実行タイミングを知ることができます。
Sceneの読み込み遷移時にCriAtomが存在せず、初期化が失敗する
Scene読み込み時は少し厄介で、読み込み前or読み込み先のLibraryInitializerとの兼ね合いで若干挙動が変わります。
ですが、基本的な原因は同じと思って頂いて構いません。読み込み先のSceneにCriAtomがいない場合、正常にCueが読み込まれず、エラーが出力される場合があります。
対処法
一番安全な方法は、CriAtomコンポーネントのDontDestroyOnLoadをTrueにし、そのGameObjectにErrorHandlerとLibraryInitializerを子オブジェクトとしてまとめてしまう方法に統一することです。
ロード先にCriAtomだけがいたり、逆にCriAtomがいないがInitializerがいたりなど、条件が増えると不具合に繋がりやすくなります。
それに対し、この方法は
- 読み込み先にCriAtomコンポーネントが無い場合
→読み込み前シーンのCriAtomコンポーネントセットがロードした内容を引き継いで、読み込み先でも再生可能になる。 - 読み込み先にCriAtomコンポーネントがある場合
→この場合でも読み込み前シーンのCriAtomコンポーネントセットがロードした内容を引き継いで再生可能になる。ただし、読み込み先にいたものは削除され、読み込み前のものだけが存在する状態になる(いわゆるシングルトンの状態)。
といった形で、どのケースでもある程度対応できるような仕組みとなっています。
特に、ゲーム内に複数シーンが存在し、各Scene単体でも動作するようにしたいという場合は、上述のセットをPreafab化してScene毎に配置してしまえば、Scene単体で動作させた場合はSceneに配置されたCriAtomが、Sceneをロードして使用する場合は、ロード前のSceneに配置されていたCriAtomが動作するため、開発面でも便利です。
まとめ
お疲れ様でした!
以上がError:E2010040102の主な対処方法です。
基本的には
- CueNameやCueSheetの入力があっているか確認する
- AtomBrowserで.acbや.acfが更新されていることを確認する
- 各SceneでCriAtomコンポーネントの存在を確認する
この3点をまず確認してみてください!
今回紹介したケースはCriAtomSourceを用いた場合のケースでしたが、スクリプト上でCriAtom.GetCueSheet()などを使用した際に出るエラーでも、CriAtomコンポーネントがCueSheetの内容が読み込めていない可能性が高いです。もし発生した場合はCriAtomがSceneに存在するかをまず当たるようにしてみてください。
また、CRIWARE公式のDiscordチャンネルでは、随時質問を受け付けております。
本内容でも解決しなかった場合や、他のエラーが出て解決できない!などの場合は、どんなに細かい内容でもよろしいので、ぜひここに質問を投稿してみてください!