Пример #1
0
 // 获取需要更新的资源路径
 private void GetUpdateResPaths(ResListInfo onlineResListInfo, ResListInfo curResListInfo, ref List <SingleResInfo> updateList)
 {
     if (curResListInfo != null)
     {
         if (!onlineResListInfo.Ver.Equals(curResListInfo.Ver))
         {
             // TODO  需要测试一下Linq性能
             updateList = onlineResListInfo.Info.Where(onlineData => !curResListInfo.Info.Where(curData => onlineData.Md5 == curData.Md5 &&
                                                                                                onlineData.Path == curData.Path && onlineData.Status == curData.Status && onlineData.Size == curData.Size).Any()).ToList();
         }
         else
         {
             foreach (var item in onlineResListInfo.Info) // TODO 检测文件是否需要更新的计算方式 感觉不是很好(后续有更好的方案再改)
             {
                 stringBuilder.Clear();
                 stringBuilder.Append(PathUtility.Instance.GetPersistentDataPath());
                 stringBuilder.Append("/");
                 stringBuilder.Append(item.Path);
                 string localFileMd5 = ToolUtility.GetFileMD5Str(stringBuilder.ToString());
                 if (localFileMd5 != item.Md5)
                 {
                     updateList.Add(item);
                 }
             }
         }
     }
     else
     {
         updateList.AddRange(onlineResListInfo.Info);
     }
 }
Пример #2
0
    // 下载资源列表文件
    public async void DownloadResListFile()
    {
        using (UnityWebRequest webRequest = new UnityWebRequest($"{PathUtility.Instance.GetResListFileUrl()}/{m_ResListFileName}"))
        {
            await webRequest.SendWebRequest();

            if (webRequest.isDone && !webRequest.isNetworkError)
            {
                ResListInfo          onlineResListInfo = ResListInfo.Descriptor.Parser.ParseFrom(webRequest.downloadHandler.data) as ResListInfo;
                List <SingleResInfo> updateList        = new List <SingleResInfo>(onlineResListInfo.Info.Count); // 预先设置容量
                FileStream           fs = new FileStream(PathUtility.Instance.GetResListFilePath(), FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
                if (File.Exists(PathUtility.Instance.GetResListFilePath()))                                      // 之前更新过小版本
                {
                    int    count    = (int)fs.Length;
                    byte[] fileData = new byte[count];
                    fs.Read(fileData, 0, count);
                    ResListInfo curResListInfo = ResListInfo.Descriptor.Parser.ParseFrom(fileData) as ResListInfo;
                    GetUpdateResPaths(onlineResListInfo, curResListInfo, ref updateList);
                }
                else // 第一次更新小版本
                {
                    GetUpdateResPaths(onlineResListInfo, null, ref updateList);
                }
                ModifyLocalResFile(updateList, () => {
                    byte[] onlineData = onlineResListInfo.ToByteArray();
                    fs.Write(onlineData, 0, onlineData.Length);
                    fs.Seek(0, SeekOrigin.Begin);
                    fs.Close();
                    fs.Dispose();
                });
            }
            else
            {
                DebugUtility.Instance.Error("请求资源列表文件失败,失败原因为: " + webRequest.error);
            }
        }
    }