2014-02-11 30 views
3

我正在使用Parse SDK for Unity來獲取一些文件並保存在我的資源目錄中。當我調用parse.findAsync()時,它會創建另一個任務,我不可能調用WWW來下載我從解析中獲得的URL。我需要:在主線程外調用WWW

  • 調用parse
  • 獲取解析信息
  • 每個文件我從parse
  • 了等待一切完成
  • 呼叫WWW;
  • 返回結果;

我嘗試這樣做:

 public IEnumerator GetXXXAsync(String objectId){ 
     var query = ParseObject.GetQuery("xxx").WhereEqualTo("yyy", ParseObject. 
     CreateWithoutData("zzz", objectId)); 

     List<String> urlList = new List<String>(); 
     Album album = null; 

     query.FindAsync().ContinueWith(t => 
             { 
      var tasks = new List<Task>(); 
      Task task = Task.FromResult(0); 
      foreach (var result in t.Result) 
      { 
       ParseObject obj = result;  

       ParseFile file = (ParseFile)obj.Get<ParseFile>("image"); 
       if(file != null){ 
        urlList.Add(file.Url.ToString()); 
        tasks.Add(GetImageAsync(file.Url.ToString(), "image.png")); 
       }    


      } 

      // finished. 
      return Task.WhenAll(tasks); 
     }).Unwrap().ContinueWith(_ => 
     { 
      gameManager.SendOk(); 

     }); 

     return null; 
     } 

     private WWW WaitForImage(String url, string filename) { 

     WWW www = new WWW(url); 
     while(!www.isDone){ 
      Debug.Log("Waiting"); 
     } 
     Utils.SaveFileFromTexture(www.texture, (gameManager.GetResourcesPath() + "/Textures/" + filename)); 
     Debug.Log("Saving file "); 
     return www;  


    } 


    public Task<WWW> GetImageAsync(String url, string filename) { 
     var task = new TaskCompletionSource<WWW>(); 
     Debug.Log("GetImageAsync " + filename); 
     task.SetResult(WaitForImage(url, filename)); 
     return task.Task; 
    } 

我試圖讓一個IEnumerator的,而不是WWW的,但我總是得到WWW「不能被稱爲主線程之外」。我有什麼可以在主線外調用WWW嗎?還是其他什麼?

韓國社交協會,

+2

沒有辦法解決它。或者使用'coroutine'異步運行'WWW''(與Unity可以異步運行)或者找到第三方下載工具。 – Jerdak

+0

快速問題。如果您不打算編譯的應用程序資源文件的一部分,您打算如何使用下載的資源? – Alex

+0

@Alex你可以使用www.LoadImageIntoTexture(texTmp)在運行時加載圖像;並且可以用於url或文件路徑。或者你可以爲這個模型創建一個像運行時一樣的導入器http://wiki.unity3d.com/index.php?title=ObjImporter – Shredder2500

回答

1

你可以使用this主線程上運行WWW的異步的東西完成後。或者你可以使用system.net中的webclient在後臺線程上下載。不要忘記,你可以在主線程上使用WWW進行下載,以便在下載時不鎖定幀。

WebClient的例子

WebClient webClient = new WebClient(); 

webClient.DownloadProgressChanged += OnChange; 
webClient.DownloadFileCompleted += OnCompleted; 
webClient.DownloadFileAsync(new Uri(download), fileAndPath); 
相關問題