【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文はロードが終わっていないのに再生しようとしていたので、ロードが完了するまで処理を止めるようにしています。

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

ベイビーフランス遠征

こんにちは。
最近目、肩、腰が辛くなってきている浅野です。
今回はLavalVirtualの展示でフランスに行ってきたのでそのことについてまとめたいと思います。
日程は3月16日から3月28日(29日帰国)でパリで5泊して、その後ラヴァルで6泊ぐらいして最後にレンヌで1泊という怒涛のスケジュールでした。

パリにいる間はルーブル美術館に行ったりマルシェに行ったり(ハコスコで)凱旋門に行ったり(ハコスコで)エッフェル塔に行ったりしました。

モナリザ…ちっちゃい!

というのも実はLavalVirtualでの展示用の実装が終わってなくて凱旋門とエッフェル塔に行く余裕が無く、メンバーにThetaSを渡して「これで写真を撮ってきてくれ! したら俺も観光にいける!」なんてバカなことをやりながら生活しました。
凱旋門とエッフェル塔にいけなかったのでRexさんにお土産のコインを貰いました。とてもうれしかったのですが、一緒に来ているのにお土産を貰うなんて「あれ?」ってなりました。料理も自分たちで作ったりして色々あったけど楽しい5日間でした。Monoprix様ばんざ~い!

Lavalに来てからは毎日のように食事会があってまったく気が休まりませんでした。
基本的に内向的なので他人との食事は落ち着かず味もよく覚えていないみたいな事がほとんどなのでなかなかに辛かったです。
そんでもってまだ展示用の機能追加が終わってなかったりしていて胃へのダメージが半端なかったです。
ただ、シーフードタワーはおいしかったです。

稲見先生にオマール海老半身頂きました! ありがとうございます!

展示の方はなかなかに盛況で黒山の人だかり状態(髪の色が黒だけではないので黒山ではない)になっていました。

展示中のお客さんの様子

展示中に実行ファイルをUnityエディターからexe切り替えたり、フランス語のローカライズ版を作成したりなど今考えると頭おかしいこともしていました。
休憩中は他の展示を見ずに外の公園でヤギを見たりベンチで寝たりとまったりしていました。ちょっと勿体無い気もしましたが、へとへとだったのでこれはこれでよかったと思います。

公園なのにヤギが…

あとACM SIGGRAPH賞を受賞しました。次の海外は7月末からロサンゼルスで展示です。行くかどうかは未定ですが…

レンヌに行ってからはどたばたしながらモン・サン=ミシェルに行きました。
ここではドラクエよろしくマッピングしながらThetaSを使ってバシバシ写真を撮りました。が、時間が無く全部を見て回ることはできませんでした…悲しみ…
帰国してからどれぐらい写真を撮ったのか見てみたのですが150枚しか撮ってませんでした。こんなんじゃVR作れないよ…と思っていたらThetaS君の中から写真が続々と出てきてなんだかんだで600枚近く撮ってました。これを整理してハコスコで見れるようなアプリケーションを作りたいですね!

モンサン!

全体を通して英語がかなり通じたのでそこまで苦労することが無く、フランス人の方もみんな優しくて特に不便なところも無く、色々ありましたが快適で楽しいフランス旅行でした。

ベイビーチームもひと段落着いてそれぞれが別の方向へと歩いていくと思います。が、まだ終わりではないのでこれからも応援の方よろしくお願いします。