1. 程式人生 > >UnityWebRequest下載網路資源,支援斷點續傳、多檔案同時下載

UnityWebRequest下載網路資源,支援斷點續傳、多檔案同時下載

今晚研究了下關於Unity中檔案下載的斷點續傳功能,Unity已經封裝了網路資源的下載API,當然也可以使用C#中的API進行資源下載。
    首先說一下斷點續傳的大概思路:
    1、下載一個檔案時,向伺服器傳送下載請求,傳送一個Range的報文,指定從檔案資料的什麼位置開始獲取資料,把從伺服器路徑接收到的檔案資料,用檔案流操作按順序寫入到本地臨時檔案流,當中斷下載時,儲存已下載的臨時檔案資料,釋放檔案流操作和下載請求。
    2、當再次進行下載時,用檔案流讀取本地已下載的臨時檔案,這時向伺服器傳送下載請求,把當前臨時檔案的大小作為Range報文的資料傳送給伺服器,此時就可以從上次下載的位置繼續進行資料下載。這裡注意的是,檔案流的寫入位置要設定為之前臨時檔案的最後,即Position等於臨時檔案的大小,這樣才會將新的檔案資料與之前的結合起來。
    3、當檔案的全部資料都下載完成時,將臨時檔案重新命名為真正的檔案。

    然後說一下多檔案同時下載的邏輯:多檔案下載就是在單檔案下載的基礎上,每一個下載請求都是獨立進行的,這就類似於多執行緒併發操作,需要注意的是多個下載連線會共同佔用網路頻寬,每個檔案的下載速度都會降低。

    使用C#源生的API下載網路資源,基本上要使用到多執行緒下載機制,而Unity5.3以後的版本中帶了一個UnityWebRequest的API,發現這個API可以真牛逼,應該完全可以代替WWW的所有功能(自己吹的牛逼……)
這個UnityWebRequest可以下載資源、上傳資料、獲取下載進度、中止下載等等,而且是在Unity的主執行緒中進行的。
下面簡單說明下載操作:

    //下載的協程
    public IEnumerator StartDownload(string url, string savePath)
    {
        _DownloadHandler loadHandler = new _DownloadHandler(savePath);
        UnityWebRequest request = UnityWebRequest.Get(url);
        request.chunkedTransfer = true;
        request.disposeDownloadHandlerOnDispose = true;
        request.SetRequestHeader("Range", "bytes = " + loadHandler.DownedLength + "-"); //斷點續傳設定讀取檔案資料流開始索引,成功會返回206

        yield return request.Send(); //協程操作
    }
//下載的協程 public IEnumerator StartDownload(string url, string savePath) { _DownloadHandler loadHandler = new _DownloadHandler(savePath); UnityWebRequest request = UnityWebRequest.Get(url); request.chunkedTransfer = true; request.disposeDownloadHandlerOnDispose = true; request.SetRequestHeader("Range", "bytes = " + loadHandler.DownedLength + "-"); //斷點續傳設定讀取檔案資料流開始索引,成功會返回206 yield return request.Send(); //協程操作 }

以上是下載資源的主要操作,而資料處理和回撥使用的是UnityWebRequest的downloadHandler屬性,這個屬性型別是DownloadHandler,因此需要我們自定義一個類整合DownloadHandler,然後重寫裡面的虛方法。注意裡面的虛方法大部分都是回撥型別的,也就是說都是由UnityWebRequest在下載過程中主動呼叫的,例如virtual void CompleteContent()方法是完成下載時的觸發的回撥,virtual void ReceiveContentLength(int contentLength)是剛開始下載時接收到整個檔案的大小的回撥,virtual bool ReceiveData(byte[] data, int dataLength)是下載中不斷接收到檔案資料的回撥,等等。

我也不多說了,直接給分享簡單的下載框架,主要功能只有兩個指令碼,一看遍明白了
https://download.csdn.net/download/u010377179/10257649