テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

ウェブからダウンロードしたファイルを保存したり読み込んだり

強火で進めの@nakamura001さんに、Asset Bandleを使わずに外部コンテンツを使う方法を教えてもらった。せっかくなので紹介したい。

スクリーンショット 2012-08-28 23.28.57
一度ダウンロードすれば、次からはネットワーク不要でテクスチャを読める

■Unity外のファイルを保存・読込する方法


要するに、Application.persistentDataPathでフォルダパスを取得して、.NETのSystem.IOで保存しているらしい。確かにこれが出来るなら、WWWからダウンロードしたファイルを保存・読み込みすることができる。

■何かフォルダに制約があったような

さて、今回のキモになるApplication.persistentDataPathだけど、以前どこかで見かけたような気がしたのでメモを漁った所、こんな記事が出てきた。

[Unity 3D]iPhoneでの保存先(クリエイトウェーブ開発日記)
http://createwave.blog104.fc2.com/blog-category-10.html

つまり「Application.persistentDataPathに保存するとリジェクトの対象になるので他のフォルダに保存しましょう」ということらしい。フォルダパスの作成方法はUnityの公式HPに書かれているらしいので、それを参考にするとよさそうに見える。

ただし実際に動かしてみると、公式HPで設定したフォルダパスとApplication.persistentDataPathで取得したフォルダパスが概ね同じように見えた。もしかしたら現在のバージョンでは直しているのかもしれない。

■ウェブから画像をDLして使用する

とりあえず、@nakamura001さんのソースコードを参考に、WWWからテクスチャをダウンロード・保存して使えるようにしてみた。

実際のコードはこんな感じ。色々と問題ありそうだけど、iOSで動作確認したところちゃんと動作している。

isLoaded = false;
ErrorMessage = null;

string path = string.Format("{0}/{1}", Application.persistentDataPath , filename);

if( !File.Exists( path) )
{
WWW www = new WWW(URL);
yield return www;
if( www.error == null)
{
texture = www.texture;
File.WriteAllBytes( path, www.bytes );
}else{
ErrorMessage = www.error;
}
}else{
byte[] imageBytes = File.ReadAllBytes(path);
Texture2D tex2D = new Texture2D(Width, Height);
bool isloadbmpSuccess = tex2D.LoadImage(imageBytes);

if( isloadbmpSuccess )
{
texture = tex2D;
}else{
ErrorMessage = "load bmp failed";
}
}
isLoaded = true;

ただ、実際に使ってみるとメモリ消費量が非常に大きくなってしまうのではないかと、ちょっと心配していたり。

ファイル管理の面倒くさいところが全部残ってしまうので、正直アセットバンドルが使えるならそちらを使ったほうが不具合少なく開発出来そう。だけど、Pro版は持ってないのでこの手の技術は非常に助かる。



これをチームに説明したら、ファイルマネージャーやらファイル管理用CGIやら更新通知用のリモート通知やらその他モロモロを全部自前で組む必要が出てきたというのは秘密。

ファイル管理用CGIとかリモート通知(の送信側)とか、どこかに良い情報無いかなあ。