using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using System;
|
using LaunchCommon;
|
|
|
public class DownLoadAndDiscompressTask : Singleton<DownLoadAndDiscompressTask>
|
|
{
|
public const int BYTE_PER_KILOBYTE = 1024;
|
|
public float progress { get { return Mathf.Clamp01((float)DownloadMgr.Instance.DownloadedBytes / totalSize); } }
|
|
List<AssetVersion> tasks = new List<AssetVersion>();
|
public bool isDone { get { return step == Step.Completed; } }
|
public int totalSize { get; private set; }
|
public int totalCount { get; private set; }
|
|
public event Action<Step> downLoadStepChangeEvent;
|
|
Action downLoadOkCallBack;
|
|
Step m_Step = Step.None;
|
public Step step
|
{
|
get { return m_Step; }
|
set
|
{
|
if (m_Step != value)
|
{
|
m_Step = value;
|
|
if (downLoadStepChangeEvent != null)
|
{
|
downLoadStepChangeEvent(m_Step);
|
}
|
}
|
}
|
}
|
|
public void Prepare(List<AssetVersion> _downLoadTasks, Action _downLoadOkCallBack)
|
{
|
tasks = _downLoadTasks;
|
downLoadOkCallBack = _downLoadOkCallBack;
|
|
totalCount = tasks.Count;
|
step = Step.DownLoadPrepared;
|
totalSize = 0;
|
|
for (int i = 0; i < tasks.Count; i++)
|
{
|
var task = tasks[i];
|
totalSize += task.size;
|
}
|
|
StartDownLoad();
|
|
}
|
|
public void StartDownLoad()
|
{
|
step = Step.DownLoad;
|
DownloadMgr.Instance.StartCoroutine(Co_StartDownLoad());
|
|
}
|
|
IEnumerator Co_StartDownLoad()
|
{
|
int downLoadTryCount = 0;
|
List<bool> checkDownFile = new List<bool>();
|
while (tasks.Count > 0)
|
{
|
DownloadMgr.MaxDownLoadTask = 10;
|
DownloadMgr.Instance.Prepare();
|
for (int i = 0; i < tasks.Count; i++)
|
{
|
var assetVersion = tasks[i];
|
var remoteURL = StringUtility.Contact(LocalResManager.Instance.versionInfo.GetResourcesURL(VersionConfigEx.Get().branch), LocalResManager.fixPath, "/", assetVersion.relativePath);
|
var localURL = StringUtility.Contact(LocalResManager.Instance.ExternalStorePath, assetVersion.relativePath);
|
DownloadMgr.Instance.AddTask(new DownloadTask(remoteURL, localURL));
|
}
|
|
DownloadMgr.Instance.Begin();
|
|
while (!DownloadMgr.Instance.IsFinished)
|
{
|
yield return null;
|
}
|
|
checkDownFile = new List<bool>();
|
//检查下载完成后的文件是否有效
|
var filledTasks = new List<AssetVersion>();//无效的文件
|
for (int i = 0; i < tasks.Count; i++)
|
{
|
var assetVersion = tasks[i];
|
var correctFile = assetVersion.CheckLocalFileValid(checkDownFile);
|
if (correctFile)
|
assetVersion.localValid = true;
|
else
|
filledTasks.Add(assetVersion);
|
}
|
|
if (filledTasks.Count > 0)
|
{
|
//文件大小或者MD5不对,1. cdn资源确实错误 2.cdn推送过程中 文件不匹配
|
//需要重新下载LogicVersion文件
|
if (checkDownFile.Count > 0)
|
{
|
downLoadTryCount++;
|
}
|
Debug.LogErrorFormat("资源下载完后有{0}个文件无效({1}),重新开始下载", filledTasks.Count, filledTasks[0].fileName);
|
|
}
|
tasks = filledTasks;
|
if (downLoadTryCount >= 1)
|
{
|
LocalResManager.step = LocalResManager.LoadDllStep.PrepareDownLoad;
|
break;
|
}
|
}
|
|
if (downLoadTryCount >= 1)
|
{
|
Debug.LogError("logic资源下载失败,警告提示,退出协程");
|
LocalResManager.downLoadCount++;
|
yield break;
|
}
|
|
Debug.Log("资源全部下载完成");
|
|
step = Step.Completed;
|
|
if (downLoadOkCallBack != null)
|
{
|
downLoadOkCallBack();
|
downLoadOkCallBack = null;
|
}
|
|
}
|
|
public enum Step
|
{
|
None,
|
DownLoadPrepared,
|
DownLoad,
|
Completed,
|
}
|
|
}
|