三国卡牌客户端基础资源仓库
yyl
2025-05-20 ad754b0ed9a65f2ca8d705210beab9b055fe2664
Assets/Launch/Common/DownLoadAndDiscompressTask.cs
@@ -5,120 +5,146 @@
using LaunchCommon;
public class DownLoadAndDiscompressTask : Singleton<DownLoadAndDiscompressTask>
{
    public const int BYTE_PER_KILOBYTE = 1024;
    public class DownLoadAndDiscompressTask : Singleton<DownLoadAndDiscompressTask>
    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;
        public const int BYTE_PER_KILOBYTE = 1024;
                if (downLoadStepChangeEvent != null)
        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)
                {
                    downLoadStepChangeEvent(m_Step);
                    m_Step = value;
                    if (downLoadStepChangeEvent != null)
                    {
                        downLoadStepChangeEvent(m_Step);
                    }
                }
            }
        }
    }
    public void Prepare(List<LaunchCommon.AssetVersion> _downLoadTasks, Action _downLoadOkCallBack)
    {
        tasks = _downLoadTasks;
        downLoadOkCallBack = _downLoadOkCallBack;
        totalCount = tasks.Count;
        step = Step.DownLoadPrepared;
        totalSize = 0;
        for (int i = 0; i < tasks.Count; i++)
        public void Prepare(List<AssetVersion> _downLoadTasks, Action _downLoadOkCallBack)
        {
            var task = tasks[i];
            totalSize += task.size;
        }
            tasks = _downLoadTasks;
            downLoadOkCallBack = _downLoadOkCallBack;
        StartDownLoad();
            totalCount = tasks.Count;
            step = Step.DownLoadPrepared;
            totalSize = 0;
    }
    public void StartDownLoad()
    {
        step = Step.DownLoad;
        DownloadMgr.Instance.StartCoroutine(Co_StartDownLoad());
    }
    IEnumerator Co_StartDownLoad()
    {
        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(ResourcesPath.Instance.ExternalStorePath, assetVersion.relativePath);
                DownloadMgr.Instance.AddTask(new DownloadTask(remoteURL, localURL));
                var task = tasks[i];
                totalSize += task.size;
            }
            DownloadMgr.Instance.Begin();
            StartDownLoad();
            while (!DownloadMgr.Instance.IsFinished)
            {
                yield return null;
            }
            //检查下载完成后的文件是否有效
            var filledTasks = new List<AssetVersion>();//无效的文件
            for (int i = 0; i < tasks.Count; i++)
            {
                var assetVersion = tasks[i];
                var correctFile = assetVersion.CheckLocalFileValid();
                if (correctFile)
                    assetVersion.localValid = true;
                else
                    filledTasks.Add(assetVersion);
            }
            if (filledTasks.Count > 0)
                Debug.LogErrorFormat("资源下载完后有{0}个文件无效({1}),重新开始下载", filledTasks.Count, filledTasks[0].fileName);
            tasks = filledTasks;
        }
        Debug.Log("资源全部下载完成");
        step = Step.Completed;
        if (downLoadOkCallBack != null)
        public void StartDownLoad()
        {
            downLoadOkCallBack();
            downLoadOkCallBack = null;
            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));
                }
    public enum Step
    {
        None,
        DownLoadPrepared,
        DownLoad,
        Completed,
    }
                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,
        }
    }