UnityWebRequest是自带的下载资源的api,优点显而易见:封装好,简单用,兼容性跨平台非常好。缺点也显而易见:可拓展性差
下载小文件通常使用下面的方法:
public IEnumerator DownloadFile(string url, string contentName)
{
string downloadFileName = "";
#if UNITY_EDITOR
downloadFileName = Path.Combine(Application.dataPath, contentName);
#elif UNITY_ANDROID
downloadFileName = Path.Combine(Application.persistentDataPath, contentName);
#endif
using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
{
yield return webRequest.SendWebRequest();
if (webRequest.isNetworkError)
{
Debug.LogError(webRequest.error);
}
else
{
DownloadHandler fileHandler = webRequest.downloadHandler;
using (MemoryStream memory = new MemoryStream(fileHandler.data))
{
byte[] buffer = new byte[1024 * 1024];
FileStream file = File.Open(downloadFileName, FileMode.OpenOrCreate);
int readBytes;
while ((readBytes = memory.Read(buffer, 0, buffer.Length)) > 0)
{
file.Write(buffer, 0, readBytes);
}
file.Close();
}
}
}
}
这样的下载方式下载小文件时基本没有任何问题,但如果是大文件特别是移动端下载的时候就有可能直接崩溃了。
解决办法:使用DownloadHandlerFile函数,可以直接将文件下载到外存,即可解决下载大文件崩溃的问题
public IEnumerator DownloadVideoFile01(Uri uri, string downloadFileName, Slider sliderProgress )
{
using (UnityWebRequest downloader = UnityWebRequest.Get(uri))
{
downloader.downloadHandler = new DownloadHandlerFile(downloadFileName);//直接将文件下载到外存
print("开始下载");
downloader.SendWebRequest();
print("同步进度条");
while (!downloader.isDone)
{
//print(downloader.downloadProgress);
sliderProgress.value = downloader.downloadProgress;
sliderProgress.GetComponentInChildren<Text>().text = (downloader.downloadProgress* 100).ToString("F2") + "%";
yield return null;
}
if (downloader.error != null)
{
Debug.LogError(downloader.error);
}
else
{
print("下载结束");
sliderProgress.value = 1f;
sliderProgress.GetComponentInChildren<Text>().text = 100.ToString("F2") + "%";
}
}
}