123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System;
- /// <summary>
- /// 下载器
- /// </summary>
- public class DownloadHelper : MonoBehaviour
- {
- /// <summary>
- /// 单例
- /// </summary>
- private static DownloadHelper _instance;
- /// <summary>
- /// 获得单例
- /// </summary>
- /// <returns>单例</returns>
- public static DownloadHelper GetInstance()
- {
- if (null == _instance)
- {
- GameObject obj = new GameObject("DownloadHelper");
- _instance = obj.AddComponent<DownloadHelper>();
- }
- return _instance;
- }
- /// <summary>
- /// Awake方法
- /// </summary>
- private void Awake()
- {
- _instance = this;
- }
- #region ==========> 资源批量下载临时变量
- /// <summary>
- /// url列表
- /// </summary>
- private List<string> _urls = new List<string>();
- /// <summary>
- /// 总数
- /// </summary>
- private int _count = 0;
- /// <summary>
- /// 当前索引
- /// </summary>
- private int _index = 0;
- /// <summary>
- /// 下载的总字节数
- /// </summary>
- private int _total = 0;
- /// <summary>
- /// 当前www
- /// </summary>
- private WWW _www;
- /// <summary>
- /// 是否中断
- /// </summary>
- private bool _breaking = false;
- /// <summary>
- /// cdn根路径
- /// </summary>
- private string _cdnroot = "http://";
- /// <summary>
- /// 当前WWW组件,用于监听单文件下载进度,有可能为空
- /// </summary>
- public WWW curWWW
- {
- get
- {
- return _www;
- }
- }
- /// <summary>
- /// 当前文件处理流程
- /// </summary>
- public float progress
- {
- get
- {
- return _www == null ? 0 : _www.progress;
- }
- }
- /// <summary>
- /// 递归下载
- /// </summary>
- /// <param name="progress">进程回调</param>
- /// <param name="complete">完成回调</param>
- /// <param name="onError">错误回调</param>
- private void DownLoadItem(ProgressCallback progress, CompleteCallback complete, ErrorCallback onError)
- {
- if (_breaking)
- {
- return;
- }
- string url = _urls[_index];
- DownLoad(_cdnroot, url, (token) =>
- {
- _index++;
- progress.Invoke(_index, _count, _total);
- if (_index >= _count)
- {
- complete.Invoke("complete!");
- }
- else
- {
- DownLoadItem(progress, complete, onError);
- }
- }, onError);
- }
- #endregion
- /// <summary>
- /// 下载资源列表
- /// </summary>
- /// <param name="cdnroot">cnd根目录</param>
- /// <param name="urls">url路径</param>
- /// <param name="progress">进程回调</param>
- /// <param name="complete">完成回调</param>
- /// <param name="onError">错误回调</param>
- public void DownLoadList(string cdnroot, List<string> urls, ProgressCallback progress, CompleteCallback complete, ErrorCallback onError)
- {
- _cdnroot = cdnroot;
- _breaking = false;
- _urls.Clear();
- _urls = urls;
- _count = urls.Count;
- _index = 0;
- _total = 0;
- DownLoadItem(progress, complete, onError);
- }
- /// <summary>
- /// 中断列表下载(仅适用于列表下载)
- /// </summary>
- public void Break()
- {
- _breaking = true;
- }
- /// <summary>
- /// 单文件下载
- /// </summary>
- /// <param name="cdnroot">cdn根路径</param>
- /// <param name="url">url路径</param>
- /// <param name="callback">完成回调</param>
- /// <param name="onError">错误回调</param>
- public void DownLoad(string cdnroot, string url, CompleteCallback callback, ErrorCallback onError)
- {
- _cdnroot = cdnroot;
- StartCoroutine(IDownload(url, callback, onError));
- }
- /// <summary>
- /// 协同
- /// </summary>
- /// <param name="url">url</param>
- /// <param name="callback">回调</param>
- /// <param name="onError">错误回调</param>
- /// <returns>协同句柄</returns>
- private IEnumerator IDownload(string url, CompleteCallback callback, ErrorCallback onError)
- {
- if (_www != null)
- {
- _www.Dispose();
- _www = null;
- }
- WWW w = new WWW(_cdnroot + url);
- _www = w;
- DateTime start = DateTime.Now;
- /*
- // 超时检测
- while (false == w.isDone)
- {
- if (DateTime.Now - start > TimeSpan.FromSeconds(Const.NetDefaultTimeOut / 1000))
- {
- onError("Time out!!");
- yield break;
- }
- else
- {
- yield return null;
- }
- }
- * */
- yield return w;
- if (w.error != null)
- {
- LogHelper.LogWarning(w.error);
- onError(w.error);
- }
- else
- {
- LogHelper.Log("[DownLoad]::" + url);
- CreateFile(FilePath(url), w.bytes);
- _total += w.size;
- callback("ok!");
- }
- }
- /// <summary>
- /// 创建文件
- /// </summary>
- /// <param name="path">路径</param>
- /// <param name="content">内容</param>
- public static void CreateFile(string path, byte[] content)
- {
- string dir = GetDirectoryByPath(path);
- if (!Directory.Exists(dir))
- {
- Directory.CreateDirectory(dir);
- }
- FileStream fs = new FileStream(path, FileMode.Create);
- fs.Write(content, 0, content.Length);
- fs.Flush();
- fs.Close();
- }
- /// <summary>
- /// 根据文件路径截取目录
- /// </summary>
- /// <param name="path">路径</param>
- /// <returns>目录</returns>
- public static string GetDirectoryByPath(string path)
- {
- string[] temps = path.Split('/');
- string dir = string.Empty;
- for (int i = 0; i < temps.Length - 1; i++)
- {
- dir += temps[i] + "/";
- }
- return dir;
- }
- /// <summary>
- /// 获得文件路径
- /// </summary>
- /// <param name="url">url</param>
- /// <returns>路径</returns>
- private string FilePath(string url)
- {
- return Application.persistentDataPath + "/" + url;
- }
- }
- /// <summary>
- /// 错误回调
- /// </summary>
- /// <param name="msg">错误消息</param>
- public delegate void ErrorCallback(string msg);
- /// <summary>
- /// 完成回调
- /// </summary>
- /// <param name="token">token</param>
- public delegate void CompleteCallback(object token);
- /// <summary>
- /// 进程回调
- /// </summary>
- /// <param name="index">当前索引</param>
- /// <param name="count">总数</param>
- /// <param name="total">总字节数</param>
- public delegate void ProgressCallback(int index, int count, int total);
|