Unity3d下载大型文件并显示进度
由于WWW.progress在安卓上进度一直显示是0,所以只得自己动手写下载函数了。结合网上同行的代码,加上自己修改,总算完成了。
public class ItemScript : MonoBehaviour { string prompt = "ss"; void OnApplicationQuit() { StopAllCoroutines();//关闭所有协程 } void OnDestroy() { if(request != null) { //以下步骤很重要,用户中止时,放弃请求,如果不放弃,连续多次请求,就会出现卡死。 request.Abort(); UnityEngine.Debug.Log("request.Abort();"); } } //输出进度信息 void output (string strInfo) { GameObject TextRect = GameObject.Find("Canvas/Panel/ProgressBackGround/ProgressRect/ProgressText"); if(TextRect != null) { Text ProgressText = (Text)TextRect.GetComponent<Text>(); ProgressText.text = UserHelp.AddColorAttr(strInfo); } } //点击按钮“开始下载” public void OnClickRescourceItem() { string strTmpFile = "C:/tmp/downloading.srt";//临时文件 if (System.IO.File.Exists(strTmpFile)) { File.Delete(strTmpFile); } //打开进度显示面板 GameObject bg = GameObject.Find("Canvas/Panel").transform.Find("ProgressBackGround").gameObject; bg.SetActive(true); //开始异步下载 StartCoroutine(DownloadFunction("http://localhost/test.jpg", "C:/UnityDownload/test.jpg")); } System.Net.HttpWebRequest request; IEnumerator DownloadFunction(string uri,string saveFile) { //删除本地临时文件 string strTmpFile = "C:/tmp/downloading.srt"; if (System.IO.File.Exists(strTmpFile)) { File.Delete(strTmpFile); } //打开网络连接 request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(uri); request.Timeout = 5000; //获取临时文件大小,注意,不要再创建request,连续请求可能卡死,开启下次请求前请先结束上一次的请求。 //重要的事说三遍:不要连续请求!不要连续请求!不要连续请求! long countLength = request.GetResponse().ContentLength; //打开上次下载的文件或新建文件 long lStartPos = 0; System.IO.FileStream fs; fs = new System.IO.FileStream(strTmpFile, System.IO.FileMode.Create); if (lStartPos > 0) { request.AddRange((int)lStartPos); //设置Range值 print(lStartPos); } //向服务器请求,获得服务器回应数据流 System.Net.WebResponse res = request.GetResponse(); System.IO.Stream ns = res.GetResponseStream(); int len = 1024 * 8; byte[] nbytes = new byte[len]; int nReadSize = 0; nReadSize = ns.Read(nbytes, 0, len); while (nReadSize > 0) { fs.Write(nbytes, 0, nReadSize); nReadSize = ns.Read(nbytes, 0, len); double dDownloadedLength = fs.Length * 1.0 / (1024*1024); double dTotalLength = countLength * 1.0 / (1024*1024); prompt = string.Format("已下载 {0:F}M / {1:F}M", dDownloadedLength, dTotalLength); output(prompt); yield return false; } ns.Close(); fs.Close(); //下载完成重命名 FileInfo fi = new FileInfo(strTmpFile); fi.MoveTo(saveFile); File.Delete(strTmpFile); //关闭进度面板 GameObject bg = GameObject.Find("Canvas/Panel").transform.Find("ProgressBackGround").gameObject; bg.SetActive(false); } }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 浅析:Unity3D开发的游戏如何降低包体大小
- 下一篇: 关于Unity中文件读取