Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
                }
            });
        }