private List <HotUpdateAssetItem> CheckDifferent(HotUpdateAssetsList localList, HotUpdateAssetsList serverList) { var differentList = new List <HotUpdateAssetItem>(); Dictionary <string, HotUpdateAssetItem> dictionary = new Dictionary <string, HotUpdateAssetItem>(); for (int i = 0; i < localList.assetList.Count; i++) { var item = localList.assetList[i]; dictionary.Add(item.assetPath, item); } for (int i = 0; i < serverList.assetList.Count; i++) { var item = serverList.assetList[i]; if (dictionary.ContainsKey(item.assetPath)) { if (dictionary[item.assetPath].md5 != item.md5) { differentList.Add(item); } } else { differentList.Add(item); } } return(differentList); }
public void CheckNeedUpdate() { //从资源服务器下载,资源列表 _resourceLoader.LoadRemoteAsset(Path.Combine(Application.platform.ToString(), assetsListName), "", (data) => { string jsonStr = System.Text.Encoding.UTF8.GetString(data); HotUpdateAssetsList serverAssetsList = JsonUtility.FromJson <HotUpdateAssetsList>(jsonStr); //读取本地资源维护表 string localAssetOutAppFilePath = Path.Combine(Application.persistentDataPath, localAssetOutAppName); if (File.Exists(localAssetOutAppFilePath)) { localAssetOutAppList = JsonUtility.FromJson <HotUpdateAssetsList>(File.ReadAllText(localAssetOutAppFilePath)); } else { localAssetOutAppList = new HotUpdateAssetsList();//记录本地已经热更新过得资源 } //读取本地资源md5文件 string localListPath = ""; if (!File.Exists(Path.Combine(Application.persistentDataPath, assetsListName)))//应该是没更新过,本地资源列表还在app包内 { // FileStream file = new FileStream(filePath, System.IO.FileMode.Open); localListPath = UrlCombine.GetLocalUrl(assetsListName, true, Application.platform); } else { localListPath = UrlCombine.GetLocalUrl(assetsListName, false, Application.platform); } //加载本地表,加载完成后比较本地和服务器返回表 string localAssetListJsonStr = File.ReadAllText(localListPath); HotUpdateAssetsList localAssetList = JsonUtility.FromJson <HotUpdateAssetsList>(localAssetListJsonStr); List <HotUpdateAssetItem> needUpdateAssetList = CheckDifferent(localAssetList, serverAssetsList); //加在更新资源 int loadedAssetCouint = 0; for (int i = 0; i < needUpdateAssetList.Count; i++) { var assetInfo = needUpdateAssetList[i]; _resourceLoader.LoadRemoteAsset(assetInfo.assetPath, assetInfo.md5, (assetBytes) => { loadedAssetCouint++; UpdateOutAppAssetPath(assetInfo); string assetPath = Path.Combine(Application.persistentDataPath, assetInfo.assetPath); WriteFile(assetPath, assetBytes); if (loadedAssetCouint == needUpdateAssetList.Count) { //全部资源更新完成,更新本地表格 string assetListJsonString = JsonUtility.ToJson(serverAssetsList); WriteFile(Path.Combine(Application.persistentDataPath, assetsListName), assetListJsonString); string assetOutAppJsonString = JsonUtility.ToJson(localAssetOutAppList); WriteFile(localAssetOutAppFilePath, assetOutAppJsonString); } }); } }); }
private static void CreateAssetList(string assetBundleFullPath) { EditorUtility.DisplayProgressBar("CreateAssetsList", "progress: ", 0); //读取所有文件,并创建md5文件 HotUpdateAssetsList hotUpdateAssetsList = new HotUpdateAssetsList(); DirectoryInfo directoryInfo = new DirectoryInfo(assetBundleFullPath); FileInfo[] allAsset = directoryInfo.GetFiles(); for (int i = 0; i < allAsset.Length; i++) { EditorUtility.DisplayProgressBar("CreateAssetsList", "progress: ", 1f * i / allAsset.Length); FileInfo fileInfo = allAsset[i]; string fullName = fileInfo.FullName.Replace("\\", "/"); string rootDirectoryPath = assetBundleFullPath.Replace("\\", "/"); string assetName = fullName.Substring(rootDirectoryPath.Length + 1); if (assetName == assetListName) { continue; } if (assetName.Split('.').Length > 0) { assetName = assetName.Split('.')[0]; } //StreamReader fileStream = fileInfo.OpenText(); //string fileStr = fileStream.ReadToEnd(); //fileStream.Close(); string md5 = MD5Builder.BuildMD5(fileInfo.FullName); HotUpdateAssetItem hotUpdateAssetItem = new HotUpdateAssetItem(assetName, md5); hotUpdateAssetsList.assetList.Add(hotUpdateAssetItem); } EditorUtility.ClearProgressBar(); EditorUtility.DisplayProgressBar("Write \"CreateAssetsList to file\" ", "progress: ", 0); string assetListJsonStr = JsonUtility.ToJson(hotUpdateAssetsList); string assetListPath = Path.Combine(assetBundleFullPath, assetListName); File.WriteAllText(assetListPath, assetListJsonStr); EditorUtility.ClearProgressBar(); }