Ejemplo n.º 1
0
        public static List <ResVersionInfo> GetDiffInfos(ResVersionFile local, ResVersionFile remote)
        {
            var diffInfos = new List <ResVersionInfo>();

            var localFiles = local.Files.ToList();

            // Compare
            for (int i = 0; i < remote.Files.Length; ++i)
            {
                var remoteFile = remote.Files[i];
                var remoteInfo = remote.Infos[i];
                remoteInfo.File = remoteFile;

                // Is exists ?
                var localIndex = localFiles.IndexOf(remoteFile);
                if (localIndex >= 0 == false)
                {
                    diffInfos.Add(remoteInfo);
                    continue;
                }

                // Is same md5 ?
                var localInfo = local.Infos[localIndex];
                if (localInfo.MD5 != remoteInfo.MD5)
                {
                    diffInfos.Add(remoteInfo);
                }
            }

            return(diffInfos);
        }
Ejemplo n.º 2
0
        public void TryDecompress()
        {
            if (this.IsUnCompressed || this.EnableUncompress == false)
            {
                this.NotifyNoUncompress();
                return;
            }

            _localVersionFile    = GetLocalVersionFile();
            _decompressCoroutine = this.StartCoroutine(this.DecompressAndSave(_localVersionFile.Infos));
        }
Ejemplo n.º 3
0
        ResVersionFile _GetRemoteVersionFile()
        {
            ResVersionFile versionFile;
            var            txt = this.DownloadTxt(ResConfig.VERSION_FILE);

            if (string.IsNullOrEmpty(txt) == false)
            {
                versionFile = ResVersionFile.UnSerialize(txt);
            }
            else
            {
                versionFile = new ResVersionFile(0);
            }
            return(versionFile);
        }
Ejemplo n.º 4
0
        static void BuildVersionFile(BuildTarget targetPlatform, string[] files)
        {
            var versionFile = new ResVersionFile(files.Length);

            for (var i = 0; i < files.Length; ++i)
            {
                var file        = files[i];
                var versionInfo = new ResVersionInfo();
                versionInfo.MD5 = MD5Utility.GetFileMD5(file);

                versionFile.Files[i] = file.ReplaceFirst(_outPath + "/", "");
                versionFile.Infos[i] = versionInfo;
            }
            FileUtility.WriteFile(_outPath + "/" + ResConfig.VERSION_FILE, versionFile.Serialize());
            AssetDatabase.Refresh();
        }
Ejemplo n.º 5
0
        ResVersionFile _GetLocalVersionFile()
        {
            ResVersionFile versionFile;

            byte[] bytes = null;
            var    txt   = this.LoadTxtAtPath(ResConfig.VERSION_FILE, ref bytes);

            if (string.IsNullOrEmpty(txt) == false)
            {
                versionFile = ResVersionFile.UnSerialize(txt);
            }
            else
            {
                versionFile = new ResVersionFile(0);
            }
            return(versionFile);
        }
Ejemplo n.º 6
0
        /**
         * Call HotUpdate when game starting or loading
         */
        public void HotUpdate()
        {
            if (this.EnableHotUpdate == false)
            {
                this.NotifyNoHotUpdate();
                return;
            }

            if (Application.isMobilePlatform == false && this.Simulate == false)
            {
                this.NotifyNoHotUpdate();
                return;
            }

    #if UNITY_DEBUG
            if (Directory.Exists(ResConfig.MOBILE_HOTUPDATE_PATH))
            {
                LogManager.Log(string.Format("HotUpdate: Delete MOBILE_HOTUPDATE_PATH({0})", ResConfig.MOBILE_HOTUPDATE_PATH));
                Directory.Delete(ResConfig.MOBILE_HOTUPDATE_PATH, true);
            }
    #endif

            // 1. Check whether need update assets
            var localVersionFile  = _GetLocalVersionFile();
            var remoteVersionFile = _GetRemoteVersionFile();
            var diffInfos         = ResVersionFile.GetDiffInfos(localVersionFile, remoteVersionFile);

            if (diffInfos.Count <= 0)
            {
                this.NotifyNoHotUpdate();
            }
            // 2. Download and save new assets
            else
            {
                this.StartCoroutine(this.DownloadAndSave(diffInfos));
            }

            // 3. TODO: Compress and Load new assets to memory

            // 4. Save new versionFile
            if (diffInfos.Count > 0)
            {
                FileUtility.WriteFile(ResConfig.MOBILE_HOTUPDATE_PATH + "/" + ResConfig.VERSION_FILE, remoteVersionFile.Serialize());
            }
        }
Ejemplo n.º 7
0
        static ResVersionFile BuildVersionFile(string[] files)
        {
            var versionFile = new ResVersionFile(files.Length);

            for (var i = 0; i < files.Length; ++i)
            {
                var file        = files[i];
                var versionInfo = new ResVersionInfo();
                versionInfo.File = file.ReplaceFirst(_outPath + "/", "");
                versionInfo.MD5  = MD5Utility.GetFileMD5(file);

                versionFile.Files[i] = file.ReplaceFirst(_outPath + "/", "");
                versionFile.Infos[i] = versionInfo;
            }

            var filePath = Application.dataPath + "/" + ResConfig.RES_ROOT + "/" + ResConfig.VERSION_FILE;

            FileUtility.WriteFile(filePath, versionFile.Serialize());
            AssetDatabase.Refresh();

            var buildInfo = new AssetBundleBuild();

            buildInfo.assetBundleName = ResConfig.VERSION_FILE;
            var assetName = "Assets/" + ResConfig.RES_ROOT + "/" + ResConfig.VERSION_FILE;

            buildInfo.assetNames = new string[] { assetName };
            ResBuildUtility.ResetBundleName(ref buildInfo);

            var options = _options & (~BuildAssetBundleOptions.ForceRebuildAssetBundle);

            BuildPipeline.BuildAssetBundles(
                _outPath,
                // new AssetBundleBuild[] { buildInfo },
                options,
                _target
                );

            // Remove temp versionFile
            File.Delete(filePath);

            return(versionFile);
        }
Ejemplo n.º 8
0
        ResVersionFile GetLocalVersionFile()
        {
            ResVersionFile versionFile;
            var            txtAsset = this.Load <TextAsset>(ResConfig.VERSION_FILE);
            var            txt      = txtAsset.text;

            if (string.IsNullOrEmpty(txt) == false)
            {
                versionFile = ResVersionFile.UnSerialize(txt);
            }
            else
            {
                versionFile = new ResVersionFile(0);
            }

            // Unload
            this.UnloadAsset(ResConfig.VERSION_FILE);

            return(versionFile);
        }
Ejemplo n.º 9
0
        IEnumerator HotUpdating()
        {
            // Get local version file at first
            var localVersionFile = GetLocalVersionFile();

            // Get remote version file and compare
            // Download remote version file and save to temporary directory
            var file   = ResConfig.ConvertToBundleName(ResConfig.VERSION_FILE) + ResConfig.BUNDLE_EXTENSION;
            var assets = new List <string>();

            assets.Add(file);
            var fileFolder    = "resversionfile_tempfolder";
            var fileDirectory = ResConfig.MOBILE_HOTUPDATE_PATH + "/" + fileFolder;
            var failure       = false;

            byte[] downloadBytes = null;
            yield return(this.StartCoroutine(this.DownloadAssetsAsyncAndSave(
                                                 ResConfig.SERVER_URL + "/",
                                                 assets,
                                                 (processInfo, www) => {
                if (string.IsNullOrEmpty(processInfo.Error) == false)
                {
                    failure = true;
                    processInfo.Index = -1;
                    processInfo.Count = 0;
                    this.NotifyHotUpdate(processInfo);
                }
                else
                {
                    var length = www.bytesDownloaded;
                    // var length = www.bytes.Length;
                    downloadBytes = new byte[length];
                    Array.Copy(www.bytes, 0, downloadBytes, 0, length);
                }
            },
                                                 fileDirectory
                                                 )));

            if (failure)
            {
                yield break;
            }
            var txtAsset = this.Load <TextAsset>(fileFolder + "/" + ResConfig.VERSION_FILE);

            if (txtAsset == null)
            {
                var processInfo = new ProcessInfo();
                processInfo.File  = ResConfig.VERSION_FILE;
                processInfo.Index = -1;
                processInfo.Count = 0;
                processInfo.Error = "Download version file error";
                this.NotifyHotUpdate(processInfo);
                yield break;
            }
            var txt = txtAsset.text;
            var remoteVersionFile = ResVersionFile.UnSerialize(txt);

            // Unload asset bundle
            this.UnloadAsset(fileFolder + "/" + ResConfig.VERSION_FILE);

            // Hotupdating(download and save)
            var diffInfos = ResVersionFile.GetDiffInfos(localVersionFile, remoteVersionFile);

            if (diffInfos.Count <= 0)
            {
                this.NotifyNoHotUpdate();
                yield break;
            }
            assets.Clear();
            for (int i = 0; i < diffInfos.Count; ++i)
            {
                var asset = diffInfos[i].File;
                assets.Add(asset);
            }
            var count           = assets.Count;
            var downloadedCount = 0;

            yield return(this.StartCoroutine(this.DownloadAssetsAsyncAndSave(
                                                 ResConfig.SERVER_URL + "/",
                                                 assets,
                                                 (processInfo, www) => {
                downloadedCount++;
                processInfo.Index = downloadedCount - 1;
                processInfo.Count = assets.Count;
                this.NotifyHotUpdate(processInfo);
            }
                                                 )));

            // Finally replace local version file
            FileUtility.WriteFile(ResConfig.MOBILE_HOTUPDATE_PATH + "/" + file, downloadBytes, downloadBytes.Length, false);
        }