使用WebClient下载Unity3d中的大文件 [英] Downloading large file in Unity3d using WebClient

查看:335
本文介绍了使用WebClient下载Unity3d中的大文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找有关使用WebClient在Unity3d中下载大型(100mg +)文件的任何想法。 WWW异步运行,除非它返回内存错误并且崩溃了应用程序,所以我已经转到了解决方案:

I am looking for any ideas regarding downloading large (100mg+) files in Unity3d using WebClient. WWW runs asynchronously and would be perfect except it returns a memory error and crashes the app, so I have moved to the solution as outlined here:

如何从url并保存在c sharp中使用unity3d的位置?

这样做就像一个梦想,除了,它关闭所有的脚本我的应用程序,直到下载完成。在下载的同时,我似乎甚至不能运行一个加载栏。我已经尝试处理这个通过添加协同程序来处理下载,但到目前为止,没有运气。

This works like a dream except it shuts down all the scripts in my app until the download is complete. I cannot seem to even run a loading bar at the same time as the download is going on. I have tried handling this by adding a coroutine to handle the download, but so far, no luck.

任何帮助将不胜感激。我的代码目前(经过多次迭代)看起来像:

Any help would be appreciated. My code currently (after many iterations) looks like:

C#

 void Update()
    {
    //Sets up the timer so I can use it to watch the debugging
        timer += Time.deltaTime;
        Debug.Log (timer);

//Checks to see if the file was already downloaded and saved.  If not, it begins downloading.
    if (FileExists == 0 && timer >= 5) {
        StartCoroutine ("DOWNLOAD");

    } 
//If the file already exists, it jumps straight to the next scene.
    else if (FileExists == 1) {
        Application.LoadLevelAsync ("Different_Level");
    }

    //These are the buttons.  One should stop the download if the player decides they don't want to wait.
    if (Input.GetMouseButtonUp (0)) {

        RaycastHit rc_hit;
        Ray hud_ray = Camera.main.ScreenPointToRay (Input.mousePosition);

    if (Physics.Raycast (hud_ray, out rc_hit, Mathf.Infinity, 1 << LayerMask.NameToLayer ("HUD"))) {

    if (rc_hit.transform.gameObject == b_BackButton) {

        StopCoroutine ("EN_Loop");
        Application.LoadLevelAsync ("Other_Level"); 
                            }
                    }
            }

}

//This is what should happen when the video is done downloading
void AllDone ()

{
    Debug.Log ("Download Complete");
    Application.LoadLevelAsync ("Next_Level");
}

////This is the coroutine I created int he hopes that I could get the download to run in the background.
IEnumerator DOWNLOAD()
{
    Debug.Log("downloading_EN");
    WebClient client = new WebClient();
    client.DownloadFile ("http://ServerInfo.net/moviefile.mp4", Application.persistentDataPath + "/" + "moviefile.mp4");
    yield return null;

    AllDone ();

}


推荐答案

WebClient.DownloadFileAsync不锁定主线程(因此您的其他脚本仍将运行),并使用WebClient.DownloadFileCompleted事件来知道它何时完成。

Try using WebClient.DownloadFileAsync to not lock up the main thread (so your other scripts will still run) and use the WebClient.DownloadFileCompleted event to know when it's completed.

没有必要使用Coroutine来使用WebClient,并确保只调用此方法一次:

There's no need to use a Coroutine for using the WebClient and make sure to only call this Method once:

void DownloadFile()
{
    WebClient client = new WebClient();
    client.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler( DownloadFileCompleted );
    client.DownloadFileAsync ((new Uri ("http://ServerInfo.net/moviefile.mp4", Application.persistentDataPath + "/" + "moviefile.mp4"));
}

void DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    if (e.Error == null)
    {
        AllDone ();
    }
}

有关DownloadFileAsync的更多信息:

More information on DownloadFileAsync:

https://msdn.microsoft.com/en-us/library/system.net.webclient.downloadfileasync%28v=vs.110%29.aspx

和DownloadFileCompleted事件:

And DownloadFileCompleted Event:

https://msdn.microsoft.com/en-us/library/system.net.webclient.downloadfilecompleted%28v=vs.110%29 .aspx

这篇关于使用WebClient下载Unity3d中的大文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆