Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在主线程外调用WWW_C#_Unity3d_Parse Platform - Fatal编程技术网

C# 在主线程外调用WWW

C# 在主线程外调用WWW,c#,unity3d,parse-platform,C#,Unity3d,Parse Platform,我正在使用Parse SDK for Unity获取一些文件并保存在我的资源目录中。当我调用parse.findAsync()时,它会创建另一个任务,我不可能调用WWW下载从parse获得的URL。我需要: 调用解析 获取解析信息 为我从parse获得的每个文件调用www 等待一切完成 返回结果 我试过这个: public IEnumerator GetXXXAsync(String objectId){ var query = ParseObject.GetQu

我正在使用Parse SDK for Unity获取一些文件并保存在我的资源目录中。当我调用parse.findAsync()时,它会创建另一个任务,我不可能调用WWW下载从parse获得的URL。我需要:

  • 调用解析
  • 获取解析信息
  • 为我从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;
    }
public IEnumerator GetXXXAsync(字符串objectId){
var query=ParseObject.GetQuery(“xxx”)。WhereEqualTo(“yyy”),ParseObject。
createwithout数据(“zzz”,objectId));
List urlList=新列表();
相册=空;
query.FindAsync().ContinueWith(t=>
{
var tasks=新列表();
Task Task=Task.FromResult(0);
foreach(t.result中的var结果)
{
ParseObject obj=结果;
ParseFile file=(ParseFile)obj.Get(“图像”);
如果(文件!=null){
添加(file.Url.ToString());
添加(GetImageAsync(file.Url.ToString(),“image.png”);
}               
}
//完成了。
返回任务。WhenAll(任务);
}).Unwrap().ContinueWith(=>
{
gameManager.SendOk();
});
返回null;
}
私有WWW WaitForImage(字符串url,字符串文件名){
WWW=新的WWW(url);
而(!www.isDone){
Debug.Log(“等待”);
}
Utils.SaveFileFromTexture(www.texture,(gameManager.GetResourcesPath()+“/Textures/”+filename));
Log(“保存文件”);
返回www;
}
公共任务GetImageAsync(字符串url、字符串文件名){
var task=new TaskCompletionSource();
Log(“GetImageAsync”+文件名);
SetResult(WaitForImage(url,文件名));
返回任务。任务;
}
我试图得到一个IEnumerator而不是WWW,但我总是得到“不能在主线程外调用WWW”。我可以在主线程之外调用WWW吗?还是别的什么

Tks,

异步工作完成后,您可以在主线程上运行WWW。也可以使用system.net中的webclient在后台线程上下载。别忘了,你可以在主线程上使用WWW下载,这样下载时就不会锁定你的帧

webclient示例

WebClient webClient = new WebClient();

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

没办法。使用
coroutine
运行
WWW
“异步”(尽可能异步)或查找第三方下载工具。快速提问。如果下载的资源不是已编译的应用程序资源文件的一部分,您打算如何使用这些资源?@Alex您可以在运行时使用www.LoadImageIntoTexture(texTmp)加载图像;这可以用于url或文件路径。或者对于模型,您可以为runtime@shreader2500+1创建一个类似的导入器!你每天都能学到新东西:)