unity 資源熱更新+顯示進度條:根據uri下資源
阿新 • • 發佈:2019-01-29
實現傳入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);
}
}
根據傳遞過來的資料顯示:百分比,下載速度,已下載量與總量