Unity之异步下载文件的两种方案
2017-07-28 15:23
267 查看
在游戏中要下载文件莫过于下载增量包了,下载一般都采用异步形式,这样游戏不至于卡住。
下载文件的方案在游戏中我尝试过两种方案,都比较简单,记录下来供自己翻阅以及他人参考。
(一)使用WebClient
使用WebClient是真的很方便,几行代码就可以搞定。代码如下:
使用WebClient就是这么简单!!!
(二)使用HttpWebRequest
这个方案代码稍微多点,但是也很简单,贴出代码,看看就懂了!^_^
(三)注意事宜
打成安卓包后,在手机上运行可能遇到:
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)
下载文件的方案在游戏中我尝试过两种方案,都比较简单,记录下来供自己翻阅以及他人参考。
(一)使用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)
相关文章推荐
- Linux远程下载文件的两种方法之 ftp命令和scp命令
- Cocos2d-3.10 使用Curl异步下载文件(断点续传)
- Unity加载配置文件的两种方式
- IOS学习 info.plist 文件加两行代码 多线程NSThread/GCD 异步下载网络图片
- Android AsyncTask异步实现大文件下载
- Unity——WWW相关知识精要,Get/Post请求,如何判断机型进行本地资源文件下载。
- 数据导出/文件下载 实现方案
- Java读取文件MD5的两种方案
- Unity商店下载的文件保存路径?
- 文件异步下载
- VB.NET中使用FTP下载文件的两种方法。
- C#异步下载文件
- Android编程使用WebView实现文件下载功能的两种方法
- unity本地网络下载工具-HFS文件服务器教程
- 上传文件返回的json数据会被提示下载问题解决方案
- java实现文件下载的两种方式
- SpringMVC实现文件下载的两种方法
- php 下载保存文件保存到本地的两种方法
- PHP下载文件的两种方法与代码
- Ajax请求二进制流进行处理(ajax异步下载文件)的简单方法