2017-07-21 2 views
1

私はunity3d wwwを使ってWebサーバーから画像をダウンロードし、それを私のローカルストレージに保存しました。私が持っている唯一のチェックはSystem.IO.File.Exists()で、既にダウンロードされているかどうかを確認することです。私の問題は、Webサーバーからのイメージが更新されたとき、または同じ正確なファイル名で置き換えられたときに再ダウンロードされないことです。私もwww.responseHeadersを試しましたが、画像がダウンロードされると利用可能になります。私はassetbundleについて知っていますが、私はただ一つの画像に対してassetbundleを作成したくありません。画像が既にダウンロードされているかどうかを確認しますか?

編集:ここでは

がわずかに変更され、私のコードです。 Fist webserverに接続して、イメージURLを含むすべてのプロジェクトデータをjsonタイプのデータ配列として取得します。次に、ダウンロードする画像のURLを持つ配列をループします。

void ConnectToWeb() 
{ 
    StartCoroutine(AppManager.Instance.WebRequest("http://www.google.com", 
     (AppManager.HttpResponse callback) => 
     { 
      if (callback.ResponseCode == 0 || callback.ResponseCode != 200) 
      { 
       throw new ArgumentException(callback.Error); 
      } 
      if (callback.Done == true) 
      { 
       StartCoroutine(LoadData(callback.JsonResponse)); 
      } 
     }) 
    ); 
} 

private IEnumerator LoadData(JsonData itemData) 
{ 
    for (int i = 0; i < itemData["results"].Count; i++) 
    { 
     if (!System.IO.File.Exists(itemData["results"][i]["picture_name"].ToString())) 
     { 
      WWW www = new WWW(itemData["results"][i]["picture_url"].ToString()); 
     while (!www.isDone) 
     { 
      Debug.Log("downloaded " + (www.progress * 100).ToString() + "%..."); 
      yield return null; 
     } 
     File.WriteAllBytes(imagePath, www.bytes); 
    } 
} 

}

+0

イメージをダウンロードして保存するために使用しているコードを追加してください。 – Programmer

+0

これを実現する最良の方法は、イメージのハッシュを保存し、ハッシュが変更された場合にWebサーバーと比較することです。それが変更された場合は、イメージを再ダウンロードしてください。 – Nico

+0

@ニコはい、それは私の心の中で最初のことでしたが、私は、これは多くの画像がある場合、これは遅くなると思う。私はこれらの画像がテクスチャであると仮定します。 – Programmer

答えて

0

使用PlayerPrefs

public static void SetBool(string key, bool state) 
{ 
    PlayerPrefs.SetInt(key, state ? 1 : 0); 
} 

public static bool GetBool(string key) 
{ 
    int value = PlayerPrefs.GetInt(key); 
    return value == 1 ? true : false; 
} 

void DownloadImage() { 
    var isDownloaded = GetBool("IsImageDownloaded"); // <-- Check this first! 
    if(!isDownloaded) { 
     DownloadImageInternal(); // The real function to download an image 
     SetBool("IsImageDownloaded", true); 
    } 
} 

System.IO.File.Existsは()してもしなくてもよい、デスクトップ、AndroidとiOSアプリのために働くことがあり、それはおそらくあなたのアプリケーションであることに注意してくださいUnity Editorでは正常に動作しますが、AndroidまたはiOSデバイスにデプロイするとクラッシュします。

+0

これらのプラットフォームでFile.Existsを実装できないのはなぜですか?それらはすべてファイルシステムを持っていて実装されていませんか? –

+0

これは近いですが、イメージがすでにダウンロードされているだけでなく、イメージのバージョンが変更されたかどうかを検出することです。 'File.Exists'の問題に関しては、私が知っているのは、常に' true'を返すことだけです。 'Application.persistentDataPath'のようなパスで使用されるとクラッシュしてはいけません。また、ファイルが存在するかどうかを確認する前に、ディレクトリが存在することを確認してください( 'Directory.Exists')。 – Programmer

+0

@WayylandYutani、それを試してみてください。あなたは、Android、iOS、およびデスクトップのための普遍的なファイルパスを記述する単一のフォーマットを見つけることができません。これが当てはまらないなら、私を訂正してください。 – David

関連する問題