Unity之异步下载文件的两种方案
来源:互联网 发布:宽带已连接但是无网络 编辑:程序博客网 时间:2024/05/18 06:14
在游戏中要下载文件莫过于下载增量包了,下载一般都采用异步形式,这样游戏不至于卡住。
下载文件的方案在游戏中我尝试过两种方案,都比较简单,记录下来供自己翻阅以及他人参考。
(一)使用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)
阅读全文
1 0
- Unity之异步下载文件的两种方案
- 图片的两种异步下载方式
- unity中代码添加按钮事件的两种方案
- 文件下载的两种方式
- python下载文件的两种方法
- 文件下载的两种方式
- angualr2 下载文件的两种方式
- Java读取文件MD5的两种方案
- Java读取文件MD5的两种方案
- Java读取文件MD5的两种方案
- Java读取文件MD5的两种方案
- Java读取文件MD5的两种方案
- Java读取文件MD5的两种方案
- Java读取文件MD5的两种方案
- Linux远程下载文件的两种方法之 ftp命令和scp命令
- Linux远程下载文件的两种方法之 ftp命令和scp命令
- Linux远程下载文件的两种方法之 ftp命令和scp命令
- linux远程下载文件 的两种方法之 ftp命令和scp命令
- C++常见面试题-30道
- Azure上部署的资源公网连通性测试工具-psping
- java 基础
- 使用 libevent 和 libev 提高网络应用性能——I/O模型演进变化史
- 树的子结构
- Unity之异步下载文件的两种方案
- MaterialDesign学习篇(三),AppBarLayout、CollapsingToolbarLayout的使用
- Unity IOS打包,定制UnityAppController,添加微信支付宝SDK库
- 子进程异步等待方式
- 动画操作指南
- redis-JedisPoolConfig配置
- 小白对EF框架CodeFirst的理解
- 解决powerdesigner连接mysql时连接不上的问题
- 【VS开发】【C/C++开发】memcpy和memmove的区别