【Unity】外部リソース読み込みのお話

こんにちは。
最近休日なのに大学に来ることに何の抵抗も感じなくなってきていてやばいと感じている浅野です。

今回はフランスで開発してる時に「ぐえっ」ってなったUnityの外部リソース読み込みの話をしたいと思います。

ことの成り行き

フランスで開発している際にフランス語の音声とテキストデータを現地で調達しようという話になって、そのために外部ファイルからリソースを読み込むように設計する必要がありました。
そのため、テキストデータはC#のSystem.IOを使ってCSVファイルを読み込み、音声データはResources.Loadを使用して読み込んでいました。
この時点で何が起きたか分かる方は分かると思うのですが、ビルドして_DataフォルダにResouecesフォルダを作って音声ファイルを放り込んでも再生してくれませんでした。
しかもそのことに気付いたのが展示中で「フランス語版音声再生されないよ!?どうするの!?」となり、急遽ユニティエディターを立ち上げてなんとか対処しました。

原因の考察

原因として以下の2つの理由が挙げられます。

  • Assetフォルダ内のResourcesファイルの中身と_DataフォルダのResourcesファイルの中身を同じにしていた。
  • そもそもResoueces.Loadはビルドインデータからしか読み込まない。

1つ目のファイルの中身が同じだったというのは確認作業の時に音再生できているしいいだろうとなってしまい、どのフォルダからロードしているのかを確認をしていませんでした。
2つ目の「Resoueces.Loadはビルドインデータからしか読み込まない」は、公式に記述されていて驚きました。

Unityマニュアルより なってこった!

対処法

調べてみたら対処法として、バイナリデータとして読み込むやWWWクラスを使うが候補として出てきました。
バイナリーデータを扱うのは難しそうだったので今回はWWWを使用して実装しました。

[sourcecode language=”csharp”]
//WWW===================================
www = new WWW("file:///" + Application.dataPath + "/Resources/Japan_/" + count.ToString() + ".wav");
while (!www.isDone)//ロードが完了するまで次に進んでほしくないため
{
Debug.Log("チョットマッテネ");
}
Narration[count] = www.audioClip;
Debug.Log(count+" : "+www.isDone);
/*======================================
//Resources.Load************************
Narration[count] = Resources.Load("Japan_/" + count.ToString());
if (Narration[count] == null)
{
Debug.Log("ぬるりJ" + count);
}
//**************************************
*/
[/sourcecode]

一応比較としてResources.Loadでの実装も並べておきます。
WWWのほうのWhile文はロードが終わっていないのに再生しようとしていたので、ロードが完了するまで処理を止めるようにしています。

こんな感じで実装することができました。もうこんな危ない橋を渡ることが無いと思うので、使う機会はないと信じたいですね…