标签:异常 sync load 本地 new t unity3d sha logs sharp
热更新框架:uluaFramework_UIGUI-master,在Unity热更新时,先释放资源(StreamingAssets --> DataPath),再从服务端下载资源(或者其它下载网络文件的时候)
启动一个线程,每隔几毫秒询问队列,队列中下载Action数大于0,则开启异步下载
using UnityEngine;
using System.Collections;
using System.Threading;
using System.Collections.Generic;
using System;
using System.Net;
using System.Diagnostics;
using Debug = UnityEngine.Debug;
using System.ComponentModel;
/// <summary>
/// 下载事务
/// </summary>
public class DownloadEvent
{
/// <summary>
/// 下载事务名称(这里是下载的文件名)
/// </summary>
public string evName;
/// <summary>
/// 下载的远程、本地Url
/// </summary>
public List<object> evParams = new List<object>();
public DownloadEvent(string name, List<object> list)
{
this.evName = name;
this.evParams = list;
}
}
public class ThreadManager : MonoBehaviour
{
public Thread thread;
public Queue<DownloadEvent> events = new Queue<DownloadEvent>();
/// <summary>
/// 计时器
/// </summary>
Stopwatch sw = new Stopwatch();
static readonly object lockObject = new object();
void Start()
{
thread = new Thread(OnUpdate);
thread.Start();
List<object> list1 = new List<object>();
list1.Add("http://localhost/StreamingAssets/StreamingAssets");
list1.Add("d:/StreamingAssets/StreamingAssets");
DownloadEvent ev1 = new DownloadEvent("StreamingAssets", list1);
List<object> list2 = new List<object>();
list2.Add("http://localhost/StreamingAssets/shared_asset.unity3d");
list2.Add("d:/StreamingAssets/shared_asset.unity3d");
DownloadEvent ev2 = new DownloadEvent("shared_asset.unity3d", list2);
events.Enqueue(ev1);
events.Enqueue(ev2);
}
void OnUpdate()
{
while (true)
{
lock (lockObject)
{
if (events.Count > 0)
{
Debug.Log(events.Count);
DownloadEvent ev = events.Dequeue();
DownloadFile(ev);
Debug.Log("开始下载文件:" + ev.evName);
}
}
Thread.Sleep(1);
}
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="ev">下载事务</param>
private void DownloadFile(DownloadEvent ev)
{
//url
string url = ev.evParams[0].ToString();
string localPath = ev.evParams[1].ToString();
using (WebClient client = new WebClient())
{
//sw.Start(); //计时器,可以用于计算下载速度
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProcesChange);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadComplete);
client.DownloadFileAsync(new Uri(url), ev.evName);
}
}
/// <summary>
/// 异常处理回调
/// </summary>
private void DownloadComplete(object sender, AsyncCompletedEventArgs e)
{
if (e.Error!=null)
{
Debug.LogError(e.Error.Message);
}
}
/// <summary>
/// 下载回调
/// </summary>
private void DownloadProcesChange(object sender, DownloadProgressChangedEventArgs e)
{
string received = (e.BytesReceived / 1024d) + "";
Debug.Log("sender:" + sender);
Debug.Log("接收文件大小:" + received + "K");
if (e.ProgressPercentage == 100 && e.BytesReceived == e.TotalBytesToReceive)
{
Debug.Log("下载完成");
}
}
}
标签:异常 sync load 本地 new t unity3d sha logs sharp
原文地址:http://www.cnblogs.com/fuyunzzy/p/6491015.html