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);
	}
}


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值