投稿日:2011-12-30 Fri
Pです。iOSやAndroid端末は、アプリ自体の容量を減らすためにローカルキャッシュを行うことがよくあります。
これをUnity3Dで実現するにはどうするかの備忘録です。
[1]画像や3Dなどのリソースを一旦AssetBundle形式に変換する
http://unity3d.com/support/documentation/ScriptReference/BuildPipeline.BuildAssetBundle.html?from=AssetBundle
ここにあるScriptを適当なUnityプロジェクトのEditorフォルダに配置する
ちょっと不便なのがiOS、Android、PCブラウザなどそれぞれについてAssetBundleを作らなければならない。
先に[Switch Platform]で目的のPlatformに切り替えておく。
Projectパネル内の画像を右クリックして[Build AssetBundle From Selection - Track dependencies]をクリック。
適当な名前を付けて保存。(拡張子はそのまま.unity3d)
今作った.unity3d形式のファイルをサーバーにアップロードする。
これでリソースの準備は完了。
[2]WWW.LoadFromCacheOrDownload()を使用
名前の通り、ロードとキャッシュを自動で行ってくれる便利なメソッドです。
Loadが完了したら、用途に応じてキャストしてあげます。
IEnumerator LoadCorutin(string url) {
WWW www = WWW.LoadFromCacheOrDownload(url, 0);
yield return www;
if (www.error != null) {
print(www.error);
} else {
if (url.IndexOf("texture") > -1) {
//画像
Texture2D texture = www.assetBundle.mainAsset as Texture2D;
} else if (url.IndexOf("3d") > -1) {
//3Dデータ
GameObject go = Instantiate(www.assetBundle.mainAsset) as GameObject;
} else if (url.IndexOf("audio") > -1) {
//サウンド
AudioClip clip = www.assetBundle.mainAsset as AudioClip;
}
}
}
一点、気をつけなければいけないことがあります。
キャッシュされたAssetBundleの識別は、ドメインやディレクトリ構造を無視したファイル名だけで行われます。
どういうことかというと、
http://○○○○/img/org/img0.unity3d
http://○○○○/img/thumb/img0.unity3d
上記2つの異なるパスに配置されたAssetBundleは、「img0.unity3d」というファイル名が同じため、同一ファイルとして扱われます。
よってファイル名だけでユニークとなるようにする必要があります。
ちなみにPHPであっても問題なく動作します。
MIME Typeは「application/vnd.unity unity3d」です。
さらにサーバー上で「.unity3d」を使用できるように以下の記述をします。
AddType application/vnd.unity unity3d
ただし、POST送信が出来ない(??)ことと、識別がファイル名だけで行われるので若干使い勝手が悪いかもしれません。
/img/get_img.php?type=org&id=0
/img/get_img.php?type=thumb&id=0
などとしても「get_img.php」が同じため同一ファイルとして認識されてしまいます。
なのでもう一工夫してファイル名が被らないようにする必要があります。
△ PAGE UP