internal Object Load(string path, Type type) { Object obj = null; if (CachedObjects.TryGetValue(path, out obj)) // 尝试在缓存中查找 { return(obj); } else // 尝试从外部文件中加载asset bundle { var fileName = path.Replace("/", DIR_SPLIT); //替换目录分隔符 if (DownloadedFiles.ContainsKey(fileName)) { FileInfo file = DownloadedFiles[fileName]; var bytes = File.ReadAllBytes(file.FullName); var ab = AssetBundle.LoadFromMemory(bytes); string objectName = Path.GetFileName(path); obj = ab.LoadAsset(objectName, type); ab.Unload(false); //一旦加载完毕,立即释放assetbundle,但不释放bundle中的物体,物体会在场景切换时释放 if (obj == null) { UpdaterLog.LogError(string.Format("the resource {0} load from ab is null", path)); return(null); } CachedObjects.Add(path, obj); } else { obj = Resources.Load(path, type); } } return(obj); }
IEnumerator AsyncCreateABReqObj(string path, Type type, byte[] bytes) { var abCreateReq = AssetBundle.LoadFromMemoryAsync(bytes); //异步创建ab yield return(abCreateReq); string objectName = Path.GetFileName(path); var abReq = abCreateReq.assetBundle.LoadAssetAsync(objectName, type); //异步读取物体 yield return(abReq); Object obj = abReq.asset; abCreateReq.assetBundle.Unload(false); //一旦加载完毕,立即释放assetbundle,但不释放bundle中的物体,物体会在场景切换时释放 if (obj == null) { UpdaterLog.LogError(string.Format("the resource {0} load async from ab is null", path)); } else { UpdaterLog.Log(string.Format("load async the resource {0} from ab", path)); if (!CachedObjects.ContainsKey(path)) { CachedObjects.Add(path, obj); } } Queue <Action <Object> > onDoneQueue = AsyncLoadingQueue[path]; if (onDoneQueue == null) { UpdaterLog.LogException(new Exception("internal error , the AsyncLoadingQueue have no queue named :" + path)); yield break; } while (onDoneQueue.Count > 0) { onDoneQueue.Dequeue()(obj); } this.AsyncLoadingQueue.Remove(path); }
public Dictionary <string, Patch> VerifyPatches() { var ret = new Dictionary <string, Patch>(); //验证本地补丁 foreach (var patchKV in Patches) { var name = patchKV.Key; var patch = patchKV.Value; FileInfo file = UResources.ReqFile(name); if (patch.NeedDelete) //如果这个补丁是删除补丁,验证他是否真的被删除 { if (file != null) { UpdaterLog.LogError(string.Format("{0} 这个文件理应被删除,但验证发现没有被删除,将更新", name)); ret.Add(name, patch); } } else //这是更新补丁,检测是否存在,并验证md5 { if (file == null) { UpdaterLog.LogError(string.Format("{0} 这个文件验证时发现应该存在,但实际不存在,将更新", name)); ret.Add(name, patch); } else { string fileMd5 = MD5Util.GetMD5ForFile(file.FullName); string recordMd5 = patch.MD5; if (!fileMd5.EqualIgnoreCase(recordMd5)) { UpdaterLog.LogError(string.Format("{0} 这个文件验证的md5和记录的md5不一致{1}//{2},将更新", name, fileMd5, recordMd5)); ret.Add(name, patch); } } } } return(ret); }
void DownloadPatch(Dictionary <string, Patch> .Enumerator enumerator, int i, int totalToDownload) { if (!enumerator.MoveNext()) { //下载完毕,将新版本号写入patchIndex,并保存 _patchIndexLocal.Version = VersionCode; _patchIndexLocal.PatchVersion = _patchIndexNew.PatchVersion; _patchIndexLocal.WriteToFile(); ResManager.Ins.ReadDownloadDir(); if (Listener != null) { Listener.OnPatchDownloadFinish(); } CheckUpdate(); //补丁更新结束后再次检查更新 return; } i++; var patchKV = enumerator.Current; var name = patchKV.Key; var patch = patchKV.Value; if (patch.NeedDelete) //如果这个补丁是删除更新,则删除 { FileInfo file = UResources.ReqFile(name); if (file != null) { File.Delete(file.FullName); } if (Listener != null) { Listener.OnPatchDownloadProgress(name, 1, i, totalToDownload); } _patchIndexLocal.UpdatePatch(name, patch); _patchIndexLocal.WriteToFile(); DownloadPatch(enumerator, i, totalToDownload); return; } //下载更新 string url = String.Format(_patchIndexNew.PatchBaseURL, name, patch.Version); HttpManager.Get(url, (error, www) => { if (!string.IsNullOrEmpty(error)) { UpdaterLog.LogError("下载补丁包出错" + name + " " + www.error + " url:" + www.url); if (Listener != null) { Listener.OnPatchDownloadFail(error); } return; } string filePath = ResManager.FullDownloadDir + name; File.WriteAllBytes(filePath, www.bytes); //下载完一个文件后立刻写入PatchIndex,这样中途断开网络后重新下载可以不下载该文件 _patchIndexLocal.UpdatePatch(name, patch); _patchIndexLocal.WriteToFile(); DownloadPatch(enumerator, i, totalToDownload); return; }, progress => { if (Listener != null) { Listener.OnPatchDownloadProgress(name, progress, i, totalToDownload); } }); }