2014-02-11 3 views
3

일부 파일을 가져 와서 내 리소스 디렉토리에 저장하기 위해 Unity 용 Parse SDK를 사용하고 있습니다. parse.findAsync()를 호출하면 다른 작업이 만들어지고 파싱을 통해 얻은 URL을 WWW에서 다운로드 할 수 없게됩니다. 내가 수행해야합니다메인 스레드 외부에서 WWW 호출

  • 전화 구문 분석
  • 구문 분석 정보 입수를
  • 내가 모든 것을 완료를 기다립니다 구문 분석
  • 에서받은 모든 파일에 대한
  • 전화 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; 
        } 
    

    가 나는 WWW 대신있는 IEnumerator를 얻기 위해 시도하지만, 난 항상 WWW를 얻을 :

나는이 시도. 메인 스레드 밖에서 WWW를 호출하기 위해 할 수있는 일이 있습니까? 아니면 다른 것?

TKS을

+2

주위 방법이 없습니다. 'coroutine'을 사용하여'WWW'를 "비동기 적으로"(Unity와 비동기로) 실행하거나 타사 다운로드 도구를 찾으십시오. – Jerdak

+0

빠른 질문입니다. 컴파일 된 응용 프로그램 리소스 파일에 포함되지 않은 경우 다운로드 한 리소스를 어떻게 사용할 계획입니까? – Alex

+0

@Alex www.LoadImageIntoTexture (texTmp)를 사용하여 런타임에 이미지를로드 할 수 있습니다. URL 또는 파일 경로에 사용될 수 있습니다. 또는 모델을 위해 런타임과 같은 수입업자를 만들 수 있습니다 http://wiki.unity3d.com/index.php?title=ObjImporter – Shredder2500

답변

1

당신은 당신의 비동기 물건 완료 후 주 스레드에서 WWW를 실행하는 this를 사용할 수 있습니다. 또는 system.net의 webclient를 사용하여 백그라운드 스레드에서 다운로드 할 수 있습니다. 다운로드하는 동안 프레임을 잠그지 않게하기 위해 메인 스레드에서 WWW를 사용하여 다운로드 할 수 있다는 것을 잊지 마십시오.

WebClient를 예

WebClient webClient = new WebClient(); 

webClient.DownloadProgressChanged += OnChange; 
webClient.DownloadFileCompleted += OnCompleted; 
webClient.DownloadFileAsync(new Uri(download), fileAndPath); 
관련 문제