您的位置:首页 > 移动开发 > Unity3D

Unity之异步下载文件的两种方案

2017-07-28 15:23 267 查看
在游戏中要下载文件莫过于下载增量包了,下载一般都采用异步形式,这样游戏不至于卡住。

下载文件的方案在游戏中我尝试过两种方案,都比较简单,记录下来供自己翻阅以及他人参考。

(一)使用WebClient

使用WebClient是真的很方便,几行代码就可以搞定。代码如下:

/******************************************************
@brief 下载文件
@param url:要下载的文件的网络路径
@param file:保存路径
******************************************************/
void BeginDownloadSmallPackage(string url, string file)
{
using (WebClient client = new WebClient())
{
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ResPackageDownloadProgress);

client.DownloadFileAsync(new System.Uri(url), file);
}
}

private void ResPackageDownloadProgress(object sender, DownloadProgressChangedEventArgs e)
{
// 异步操作放到Unity主线程上运行
Loom.QueueOnMainThread(() =>
{
if (e.ProgressPercentage >= 100 && e.BytesReceived == e.TotalBytesToReceive)
{
Debug.Log("下载增量包成功");
}
else
{
Debug.Log("进度条代码放在这里");
}
});
}


使用WebClient就是这么简单!!!

(二)使用HttpWebRequest

这个方案代码稍微多点,但是也很简单,贴出代码,看看就懂了!^_^

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;

public class HttpRequestState
{
const int mBufferSize = 1024;
public byte[] mBufferRead;

public HttpWebRequest mRequest;
public HttpWebResponse mResponse;
public Stream mStreamResponse;

public HttpRequestState()
{
mBufferRead = new byte[mBufferSize];
mRequest = null;
mStreamResponse = null;
}
}

public class HttpRequest
{
private const int mBufferSize = 1024;

private string mUri = string.Empty;
private string mSaveFilePath = string.Empty;
private FileStream mFileStream = null;
private System.Action mDownloadCompleted = null;

public HttpRequest(string uri, string path, System.Action downloadCompleted)
{
mUri = uri;
mSaveFilePath = path;
mDownloadCompleted = downloadCompleted;
}

public void StartDownloadAsyn()
{
try
{
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(mUri);

HttpRequestState hrs = new HttpRequestState();
hrs.mRequest = hwr;

System.IAsyncResult result = (System.IAsyncResult)hwr.BeginGetResponse(new System.AsyncCallback(RespCallback), hrs);
}
catch(System.Exception e)
{
}
}

void RespCallback(System.IAsyncResult result)
{
try
{
HttpRequestState hrs = (HttpRequestState)result.AsyncState;
HttpWebRequest hwr = hrs.mRequest;

hrs.mResponse = (HttpWebResponse)hwr.EndGetResponse(result);

Stream responseStream = hrs.mResponse.GetResponseStream();
hrs.mStreamResponse = responseStream;

System.IAsyncResult ret = responseStream.BeginRead(hrs.mBufferRead, 0, mBufferSize, new System.AsyncCallback(ReadCallBack), hrs);
}
catch (System.Exception e)
{
}
}

void ReadCallBack(System.IAsyncResult result)
{
try
{
HttpRequestState hrs = (HttpRequestState)result.AsyncState;
Stream responseStream = hrs.mStreamResponse;
int read = responseStream.EndRead(result);

if (read > 0)
{
if (mFileStream == null)
mFileStream = new FileStream(mSaveFilePath, FileMode.OpenOrCreate);

mFileStream.Write(hrs.mBufferRead, 0, mBufferSize);
mFileStream.Flush();

Debug.Log("进度处理");

hrs.mBufferRead = new byte[mBufferSize];
System.IAsyncResult ret = responseStream.BeginRead(hrs.mBufferRead, 0, mBufferSize, new System.AsyncCallback(ReadCallBack), hrs);
}
else
{
Debug.Log("下载完成");

mFileStream.Flush();
mFileStream.Close();
mDownloadCompleted();
}
}
catch(System.Exception e)
{
}
}
}


(三)注意事宜

打成安卓包后,在手机上运行可能遇到:

1、 WebClient 中的DownloadProgressChanged事件根本没有被调用

2 、HttpWebRequest抛出System.NotSupportedException异常

这些都是Unity设置问题,解决方案有两种:

1、 将File->Build Settings->Player Settings->Optimization->Stripping Level置为Disabled

2、 在link.xml中添加被屏蔽的类(自行搜索link.xml以及Stripping Level)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: