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)

原创粉丝点击