1. 程式人生 > >unity 資源熱更新+顯示進度條:根據uri下資源

unity 資源熱更新+顯示進度條:根據uri下資源

實現傳入uri,下載對應的資源,並且能支援多個uri的下載
例如:

        List<string> listUri = new List<string>();
        List<string> listToPath = new List<string>();
        listUri.Add(AppConst.WebUrlVideo + "/2.mp4");
        listToPath.Add(AppConst.DataPath + "/2.mp4");

        listUri.Add(AppConst.WebUrlVideo
+ "/3.mp4"); listToPath.Add(AppConst.DataPath + "/3.mp4"); DownMgr.Instance.DownResMulti(listUri, listToPath);

下載2個視訊,

實現效果

這裡寫圖片描述
這裡寫圖片描述

DownMgr.cs 下載管理器

public void DownResMulti(List<string> listUri,List<string> listToPath,UnityEvent onDownOk = null)
    {
        DataMgr.m_isMultiDown = true
; StartCoroutine(YieldDownResMulti(listUri, listToPath, onDownOk)); } IEnumerator YieldDownResMulti(List<string> listUri,List<string> listToPath,UnityEvent onDownOk = null) { long countLength = 0; int cnt = 0; for (int i = 0; i < listUri.Count; i++) { System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(listUri[i]); request.Method = "HEAD"
; countLength += request.GetResponse().ContentLength; cnt++; } PrecentMgr.m_instance.m_totalLen = countLength; Debug.Log("總下載量:" + countLength); Debug.Log("下載個數:" + cnt); for (int i = 0; i < listUri.Count; i++) { BeginDownload(listUri[i], listToPath[i]); while( !(IsDownOK(listToPath[i]))) { yield return new WaitForEndOfFrame(); } } yield return new WaitForEndOfFrame(); if (onDownOk != null) onDownOk.Invoke(); } void BeginDownload(string url, string file) { //執行緒下載 object[] param = new object[2] { url, file }; ThreadEvent ev = new ThreadEvent(); ev.Key = NotiConst.UPDATE_DOWNLOAD; ev.evParams.AddRange(param); ThreadManager.Instance.AddEvent(ev, OnThreadCompleted); //執行緒下載 } void OnThreadCompleted(NotiData data) { switch (data.evName) { case NotiConst.UPDATE_EXTRACT: //解壓一個完成 // break; case NotiConst.UPDATE_DOWNLOAD: //下載一個完成 downloadFiles.Add(data.evParam.ToString()); break; } } /// <summary> /// 是否下載完成 /// </summary> bool IsDownOK(string file) { return downloadFiles.Contains(file); }

1.遍歷uri,使用System.Net.HttpWebRequest得到下載的總量
2.放入執行緒中進行依次下載,(下載完一個再下載另一個)
3.全部下載完執行UnityEvent事件

ThreadManager.cs 下載執行緒

   /// <summary>
    /// 下載檔案
    /// </summary>
    void OnDownloadFile(List<object> evParams) {
        string url = evParams[0].ToString();    
        currDownFile = evParams[1].ToString();

        using (WebClient client = new WebClient()) {
            sw.Start();
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
            client.DownloadFileAsync(new System.Uri(url), currDownFile);
        }
    }

    private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        DataMgr.m_downCur += (e.BytesReceived - m_lastDown);
        m_lastDown = e.BytesReceived;
        string value = string.Format("{0} kb/s", (e.BytesReceived / 1024d / sw.Elapsed.TotalSeconds).ToString("0.00"));

        if (DataMgr.m_isMultiDown == false)
        {
            //下載的總量
            PrecentData preData = new PrecentData();
            preData.total = string.Format("{0} MB / {1} MB", (e.BytesReceived / 1024d / 1024d).ToString("0.00"), (e.TotalBytesToReceive / 1024d / 1024d).ToString("0.00"));
            preData.precent = (float)e.BytesReceived / (float)e.TotalBytesToReceive;

            preData.speed = value;

            Loom.QueueOnMainThread((param) =>
          {
              NotificationCenter.Get().ObjDispatchEvent(KEventKey.m_evDownload, preData);
          }, null);
        }
        else if (DataMgr.m_isMultiDown == true)
        {
            Loom.QueueOnMainThread((param) =>
           {
               PrecentMgr.m_instance.UpdateMultiDown(value);
           }, null);
        }
        //正在下載顯示進度
        //NotiData data = new NotiData(NotiConst.UPDATE_PROGRESS, value);
        //if (m_SyncEvent != null) m_SyncEvent(data);

        //下載一個完成
        if (e.ProgressPercentage == 100 && e.BytesReceived == e.TotalBytesToReceive) {
            sw.Reset();
            m_lastDown = 0;
            NotiData data = new NotiData(NotiConst.UPDATE_DOWNLOAD, currDownFile);
            if (m_SyncEvent != null) m_SyncEvent(data);
        }
    }

1.執行緒中每次取下載佇列中的隊頭進行下載
2.使用WebClient得到當前下載檔案的資訊,包括當前下載速度,每一時刻下載量(傳遞給ui顯示)
3.噹噹前檔案下載完成時呼叫委託m_SyncEvent,告訴DownMgr此檔案下載完,進行下一個下載uri的迴圈

PrecentMgr.cs 進度條顯示

    public void UpdateMultiDown(string speed)
    {
        float precent = (float)DataMgr.m_downCur / (float)m_totalLen;
        m_imgPrecent.fillAmount = precent;
        string sPrecent = string.Format("{0} MB / {1} MB", (DataMgr.m_downCur / 1024d / 1024d).ToString("0.00"), (m_totalLen / 1024d / 1024d).ToString("0.00"));
        m_textSpeed.text = speed;
        m_textPrecent.text = sPrecent;
        if (precent >= 1.0f)
        {
            Destroy(gameObject);
        }
    }

根據傳遞過來的資料顯示:百分比,下載速度,已下載量與總量