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