using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using LaunchCommon; using Cysharp.Threading.Tasks; public class DownLoadAndDiscompressTask : Singleton { public const int BYTE_PER_KILOBYTE = 1024; public float progress { get { return Mathf.Clamp01((float)DownloadMgr.Instance.DownloadedBytes / totalSize); } } List tasks = new List(); public bool isDone { get { return step == Step.Completed; } } public int totalSize { get; private set; } public int totalCount { get; private set; } public event Action 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 _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; Co_StartDownLoad().Forget(); } async UniTask Co_StartDownLoad() { int downLoadTryCount = 0; List checkDownFile = new List(); 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) { await UniTask.Yield(); } checkDownFile = new List(); //检查下载完成后的文件是否有效 var filledTasks = new List();//无效的文件 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++; return; } Debug.Log("资源全部下载完成"); step = Step.Completed; if (downLoadOkCallBack != null) { downLoadOkCallBack(); downLoadOkCallBack = null; } } public enum Step { None, DownLoadPrepared, DownLoad, Completed, } }