使用 WebClient 在 Unity3d 中下载大文件
Downloading large file in Unity3d using WebClient
我正在寻找有关使用 WebClient 在 Unity3d 中下载大型 (100mg+) 文件的任何想法。 WWW 运行 是异步的,除了它 returns 内存错误并使应用程序崩溃外,它是完美的,所以我已经转向此处概述的解决方案:
how to download a file from url and save in location using unity3d in C sharp?
这就像做梦一样 除了 它会关闭我应用程序中的所有脚本,直到下载完成。在下载进行的同时,我什至无法 运行 加载栏。我尝试通过添加一个协程来处理下载来处理这个问题,但到目前为止,运气不好。
如有任何帮助,我们将不胜感激。我的代码目前(经过多次迭代)看起来像:
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 事件知道它何时完成。
无需使用协程来使用 WebClient,并确保只调用此方法一次:
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 的更多信息:
https://msdn.microsoft.com/en-us/library/system.net.webclient.downloadfileasync%28v=vs.110%29.aspx
和 DownloadFileCompleted 事件:
我正在寻找有关使用 WebClient 在 Unity3d 中下载大型 (100mg+) 文件的任何想法。 WWW 运行 是异步的,除了它 returns 内存错误并使应用程序崩溃外,它是完美的,所以我已经转向此处概述的解决方案:
how to download a file from url and save in location using unity3d in C sharp?
这就像做梦一样 除了 它会关闭我应用程序中的所有脚本,直到下载完成。在下载进行的同时,我什至无法 运行 加载栏。我尝试通过添加一个协程来处理下载来处理这个问题,但到目前为止,运气不好。
如有任何帮助,我们将不胜感激。我的代码目前(经过多次迭代)看起来像:
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 事件知道它何时完成。
无需使用协程来使用 WebClient,并确保只调用此方法一次:
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 的更多信息:
https://msdn.microsoft.com/en-us/library/system.net.webclient.downloadfileasync%28v=vs.110%29.aspx
和 DownloadFileCompleted 事件: