三国卡牌客户端基础资源仓库
yyl
2025-05-20 ad754b0ed9a65f2ca8d705210beab9b055fe2664
launch部分的修改(重复检验下载的bytes的问题)
4个文件已修改
282 ■■■■■ 已修改文件
Assets/Launch/Common/AssetVersion.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/DownLoadAndDiscompressTask.cs 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Launch.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Manager/LocalResManager.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/AssetVersion.cs
@@ -1,5 +1,6 @@
using UnityEngine;
using System.IO;
using System.Collections.Generic;
namespace LaunchCommon
{
@@ -52,9 +53,8 @@
            }
        }
        public bool CheckLocalFileValid()
        //checkList 用于外部检查文件下载后是否一致,不包含没有文件的情况
        public bool CheckLocalFileValid(List<bool> checkList = null)
        {
            string path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath);
            var fileInfo = new FileInfo(path);
@@ -66,12 +66,20 @@
            }
            if (fileInfo.Length != size)
            {
                if (checkList != null && checkList.Count == 0)
                {
                    checkList.Add(false);
                }
                Debug.LogFormat("{0}文件大小不对{1}-{2}", path, size, fileInfo.Length);
                return false;
            }
            var fileMD5 = FileExtersion.GetMD5HashFromFile(path);
            if (fileMD5 != md5)
            {
                if (checkList != null && checkList.Count == 0)
                {
                    checkList.Add(false);
                }
                Debug.LogFormat("{0}文件md5不对{1}-{2}", path, md5, fileMD5);
                return false;
            }
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,
        }
    }
Assets/Launch/Launch.cs
@@ -265,6 +265,14 @@
    private void PrepareDownLoad()
    {
        if (LocalResManager.downLoadCount > 3)
        {
            LocalResManager.step = LocalResManager.LoadDllStep.None;
            stop = true;
            HttpBehaviour.ConnectAllTimes = 9999;
            return;
        }
        LocalResManager.Instance.RequestLogicBytes();
    }
Assets/Launch/Manager/LocalResManager.cs
@@ -64,6 +64,8 @@
    public bool isPCTestDownLoad = false;
    public static int downLoadCount = 0;
    public static readonly string[] VERSION_URL = new string[] {
        "http://gamecenter.secondworld.net.cn:11000/center/appversion_new.php/?"};
@@ -275,34 +277,38 @@
    }
    static Dictionary<string, string> languageShowDict = new Dictionary<string, string>();//射中显示的多语言版本
    Dictionary<string, string> languageDict = new Dictionary<string, string>();// unity语言配置对应的约定字符
    string defaultLanguage = string.Empty;
    public void InitDefaultLanguage()
    {
        var config = InitialFunctionConfig.Get("Language").Numerical1;
        Debug.LogFormat("系统语言:{0} {1}", Application.systemLanguage, config);
        if (string.IsNullOrEmpty(config))
            return;
        if (languageShowDict == null || languageShowDict.Count == 0)
        {
            var config = InitialFunctionConfig.Get("Language");
            Debug.LogFormat("系统语言:{0} {1}", Application.systemLanguage, config.Numerical1);
            if (string.IsNullOrEmpty(config.Numerical1))
                return;
            languageShowDict = JsonMapper.ToObject<Dictionary<string, string>>(config.Numerical1);
            languageDict = JsonMapper.ToObject<Dictionary<string, string>>(config.Numerical5);
            defaultLanguage = config.Numerical2;
            if (!languageShowDict.ContainsKey(defaultLanguage))
                defaultLanguage = string.Empty;
        }
        var id = LocalSave.GetString("LANGUAGE_ID1");
        if (!string.IsNullOrEmpty(id))
            return;
        switch (Application.systemLanguage)
        string languageMark = ((int)Application.systemLanguage).ToString();
        if (languageDict.ContainsKey(languageMark))
        {
            case SystemLanguage.Chinese:
            case SystemLanguage.ChineseSimplified:
            case SystemLanguage.ChineseTraditional:
                {
                    id = "zh";
                    break;
                }
            id = languageDict[languageMark];
        }
        var json = JsonMapper.ToObject(config);
        if (json.Keys.Contains(id))
            Id = id;
        else
        {
            //开启的情况下必须要有个默认值
            Id = InitialFunctionConfig.Get("Language").Numerical2;
        }
        Id = languageShowDict.ContainsKey(id) ? id : defaultLanguage;
        Debug.LogFormat("系统语言:{0} 设置为{1}", Application.systemLanguage, Id);
    }
    
    //LogicBytes文件的MD5信息