2014-02-11 27 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); 
相关问题