fc2ブログ
 
■プロフィール

クリエイトウェーブ

Author:クリエイトウェーブ
開発における、諸々を書いていきたいなと思っています。
mail : info@createwave.jp

■最近の記事
■カテゴリー
■最近のコメント
■月別アーカイブ

■最近のトラックバック
■ブログ内検索

■RSSフィード
■リンク
[Unity 3D]ローカルキャッシュのメモ
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」が同じため同一ファイルとして認識されてしまいます。
なのでもう一工夫してファイル名が被らないようにする必要があります。



カテゴリー:Unity | TM(0) | CM(0)