예제 #1
0
        static void BuildResourcesZip()
        {
            string outputPath = Path.Combine(PatchesOutputPath, AssetBundleUtility.GetPlatformName());
            string inputPath  = Path.Combine(outputPath, AssetBundleUtility.ResourcesFolderName);

            //获取资源版本号
            string error;
            Int64  versionID;
            Dictionary <string, AssetBundleInfo> assetBundleInfos = new Dictionary <string, AssetBundleInfo>();

            byte[] bytes = File.ReadAllBytes(Path.Combine(inputPath, AssetBundleUtility.VersionFileName));
            if (!AssetBundleUtility.ResolveEncryptedVersionData(bytes, ref assetBundleInfos, out versionID, out error))
            {
                Debug.LogError("resolve version file failed: " + error);
                return;
            }
            string outputFileName = Path.Combine(outputPath, string.Format("{0}_{1}", AssetBundleUtility.ZipFileName, versionID));

            int           progress = 0;
            DirectoryInfo dirInfo  = new DirectoryInfo(inputPath);

            FileInfo[] fileInfos = dirInfo.GetFiles();
            foreach (var item in fileInfos)
            {
                progress++;
                EditorUtility.DisplayProgressBar("Build Resources Zip", string.Format("{0}/{1}  {2}", progress, fileInfos.Length, item.Name), progress / (float)fileInfos.Length);
                int res = lzip.compress_File(LevelOfCompression, outputFileName, item.FullName, true);
                if (res < 0)
                {
                    EditorUtility.DisplayDialog("Build Resources Zip", string.Format("Build Failed - fileName: {0}, errorCode: {1}", item.FullName, res), "OK");
                    return;
                }
            }
            EditorUtility.ClearProgressBar();
            if (!EditorUtility.DisplayDialog("Build Resources Zip ", "Build Success!", "OK", "Open Contain Folder"))
            {
                System.Diagnostics.Process.Start("explorer.exe", "/select," + Path.GetFullPath(outputFileName));
            }
        }
        public IEnumerator Init()
        {
#if UNITY_EDITOR
            if (AssetBundleUtility.SimulateAssetBundleInEditor)
            {
                yield break;
            }
#endif
            if (mAssetBundleManifest != null)
            {
                Resources.UnloadAsset(mAssetBundleManifest);
                mAssetBundleManifest = null;
            }
            LoadSceneAsyncOpe = null;
            mAssetBundleInfos = null;
            UnloadAllAssetBundles(true);

            //解析version文件
            string error = "";
            Int64  versionID;
            byte[] versionBytes = File.ReadAllBytes(Path.Combine(AssetBundleUtility.LocalAssetBundlePath, AssetBundleUtility.VersionFileName));
            if (!AssetBundleUtility.ResolveEncryptedVersionData(versionBytes, ref mAssetBundleInfos, out versionID, out error))
            {
                Debug.LogErrorFormat("resolve version file failed: {0}", error);
                yield break;
            }

            //加载Manifest
            AssetBundleCreateRequest bundleRequest = AssetBundle.LoadFromFileAsync(AssetBundleName2FilePath(AssetBundleUtility.GetPlatformName() + AssetBundleUtility.AssetBundleExtension));
            yield return(bundleRequest);

            AssetBundleRequest assetRequest = bundleRequest.assetBundle.LoadAssetAsync <AssetBundleManifest>("AssetBundleManifest");
            yield return(assetRequest);

            mAssetBundleManifest = assetRequest.asset as AssetBundleManifest;
            bundleRequest.assetBundle.Unload(false);
        }
 /// <summary>
 /// 设置更新地址
 /// </summary>
 /// <param name="absolutePath"></param>
 public static void SetSourceAssetBundleURL(string absolutePath)
 {
     BaseDownloadingURL = absolutePath + AssetBundleUtility.GetPlatformName() + "/";
 }
예제 #4
0
        static public void Build()
        {
            string outputPath = Path.Combine(AssetBundlesOutputPath, AssetBundleUtility.GetPlatformName());

            if (!Directory.Exists(outputPath))
            {
                Directory.CreateDirectory(outputPath);
            }

            //List<KeyValuePair<string, string>> assetInfos = new List<KeyValuePair<string, string>>();
            //assetInfos.Add(new KeyValuePair<string, string>(AssetBundleUtility.GetPlatformName(), AssetBundleUtility.GetPlatformName() + AssetBundleUtility.AssetBundleExtension));

            List <string> paths = new List <string>();

            paths.Add(AssetBundleUtility.GetPlatformName() + AssetBundleUtility.AssetBundleExtension);

            List <AssetBundleBuild> builds = new List <AssetBundleBuild>();

            //string[] lookFor = new string[] { AssetBundleUtility.AssetBundleResourcesPath };
            //string[] guids = AssetDatabase.FindAssets("", lookFor);
            //foreach (var guid in guids)
            //{
            //    string assetPath = AssetDatabase.GUIDToAssetPath(guid);
            //    if (!AssetDatabase.IsValidFolder(assetPath))//排除文件夹
            //    {
            //        string assetBundleName = AssetPathToAssetBundleName(assetPath).ToLower();
            //        paths.Add(assetBundleName);

            //        AssetBundleBuild build = new AssetBundleBuild();
            //        build.assetBundleName = assetBundleName;
            //        build.assetNames = new string[] { assetPath };
            //        builds.Add(build);
            //        //Debug.Log(build.assetBundleName);
            //        //Debug.Log(assetPath);
            //    }
            //}

            DirectoryInfo dirInfo = new DirectoryInfo(AssetBundleUtility.AssetBundleResourcesPath);

            FileInfo[] fileInfos = dirInfo.GetFiles("*", SearchOption.AllDirectories);
            foreach (var item in fileInfos)
            {
                if (Path.GetExtension(item.Name) != ".meta")
                {
                    //AssetImporter ai = AssetImporter.GetAtPath(item.FullName);
                    //if (string.IsNullOrEmpty(ai.assetBundleName))
                    //{
                    //    ai.assetBundleName = FilePathToAssetBundleName(item.FullName).ToLower();
                    //}
                    //else
                    //{
                    //}
                    string assetBundleName = FilePathToAssetBundleName(item.FullName).ToLower() + AssetBundleUtility.AssetBundleExtension;
                    paths.Add(assetBundleName);

                    AssetBundleBuild build = new AssetBundleBuild();
                    build.assetBundleName = assetBundleName;
                    build.assetNames      = new string[] { FilePathToAssetName(item.FullName) };
                    builds.Add(build);
                }
            }
            BuildPipeline.BuildAssetBundles(outputPath, builds.ToArray(), BuildAssetBundleOptions.DisableWriteTypeTree | BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget);

            string manifestFilePath       = Path.Combine(outputPath, AssetBundleUtility.GetPlatformName());
            string manifestFilePathRename = manifestFilePath + AssetBundleUtility.AssetBundleExtension;

            if (File.Exists(manifestFilePathRename))
            {
                File.Delete(manifestFilePathRename);
            }
            File.Move(manifestFilePath, manifestFilePathRename);

            StringBuilder sb = new StringBuilder(DateTime.Now.ToString("yyyyMMddHHmmss"));

            for (int i = 0; i < paths.Count; i++)
            {
                string     path = paths[i];
                FileStream fs   = new FileStream(Path.Combine(outputPath, path), FileMode.Open);
                sb.AppendFormat("\n{0}\t{1}\t{2}", path, AssetBundleUtility.GetMD5HashFromFileStream(fs), fs.Length);
                fs.Close();
                EditorUtility.DisplayProgressBar("Compute MD5", string.Format("{0}/{1}  {2}", i + 1, paths.Count, path), (i + 1) / (float)paths.Count);
            }
            File.WriteAllBytes(Path.Combine(outputPath, AssetBundleUtility.VersionFileName), Encoding.UTF8.GetBytes(sb.ToString()));
            EditorUtility.ClearProgressBar();

            if (!EditorUtility.DisplayDialog("Build AssetBundles", "Build Success!", "OK", "Open Contain Folder"))
            {
                System.Diagnostics.Process.Start("explorer.exe", "/select," + Path.GetFullPath(outputPath));
            }
        }
예제 #5
0
        static public void UpdateResourcesFiles()
        {
            string patchesOutputPathPlatform = Path.Combine(PatchesOutputPath, AssetBundleUtility.GetPlatformName());
            string resourcesOutputPath       = Path.Combine(patchesOutputPathPlatform, AssetBundleUtility.ResourcesFolderName);
            string assetBundlesOutputPath    = Path.Combine(AssetBundlesOutputPath, AssetBundleUtility.GetPlatformName());

            if (!Directory.Exists(resourcesOutputPath))
            {
                Directory.CreateDirectory(resourcesOutputPath);
            }

            //获取资源目录下现有文件列表
            DirectoryInfo dirInfo = new DirectoryInfo(resourcesOutputPath);

            FileInfo[] fileInfos = dirInfo.GetFiles();
            Dictionary <string, FileInfo> files = new Dictionary <string, FileInfo>();

            foreach (var item in fileInfos)
            {
                files.Add(item.Name, item);
            }
            if (files.ContainsKey(AssetBundleUtility.VersionFileName))
            {
                files.Remove(AssetBundleUtility.VersionFileName);
            }

            string error = string.Empty;

            //获取现有文件的资源版本
            Int64  versionIDOld       = 0;
            string oldVersionFilePath = Path.Combine(resourcesOutputPath, AssetBundleUtility.VersionFileName);

            if (File.Exists(oldVersionFilePath))
            {
                Dictionary <string, AssetBundleInfo> assetBundleInfosOld = new Dictionary <string, AssetBundleInfo>();
                byte[] bytesOld = File.ReadAllBytes(oldVersionFilePath);
                if (!AssetBundleUtility.ResolveEncryptedVersionData(bytesOld, ref assetBundleInfosOld, out versionIDOld, out error))
                {
                    Debug.LogError("resolve old version file failed: " + error);
                    return;
                }
            }

            //获取最新AssetBundle文件信息
            Int64 versionID;
            Dictionary <string, AssetBundleInfo> assetBundleInfos = new Dictionary <string, AssetBundleInfo>();

            byte[] bytes = File.ReadAllBytes(Path.Combine(assetBundlesOutputPath, AssetBundleUtility.VersionFileName));
            if (!AssetBundleUtility.ResolveDecryptedVersionData(bytes, ref assetBundleInfos, out versionID, out error))
            {
                Debug.LogError("resolve version file failed: " + error);
                return;
            }

            //StringBuilder keepFilesSB = new StringBuilder("Keep Files:\n");
            StringBuilder addFilesSB    = new StringBuilder("Add Files:\n");
            StringBuilder deleteFilesSB = new StringBuilder("Delet Files:\n");

            List <AssetBundleInfo> addFiles = new List <AssetBundleInfo>();

            int index = 0;

            foreach (var item in assetBundleInfos)
            {
                index++;
                if (files.ContainsKey(item.Value.MD5))//已有文件
                {
                    files.Remove(item.Value.MD5);
                    //keepFilesSB.AppendFormat("\t{0}\t{1}\n", item.Key, item.Value.MD5);
                }
                else//新文件
                {
                    File.Copy(Path.Combine(assetBundlesOutputPath, item.Key), Path.Combine(resourcesOutputPath, item.Value.MD5), true);
                    addFiles.Add(item.Value);
                    addFilesSB.AppendFormat("\t{0}\t{1}\n", item.Key, item.Value.MD5);
                }
                EditorUtility.DisplayProgressBar("Copy New File", string.Format("{0}/{1}  {2}", index, assetBundleInfos.Count, item.Value.MD5), index / (float)assetBundleInfos.Count);
            }
            //删除旧文件
            index = 0;
            foreach (var item in files)
            {
                index++;
                File.Delete(item.Value.FullName);
                deleteFilesSB.AppendFormat("\t{0}\n", item.Key);
                EditorUtility.DisplayProgressBar("Delete Old File", string.Format("{0}/{1}  {2}", index, files.Count, item.Value.Name), index / (float)files.Count);
            }

            string hintText = "Already up-to-date";

            //有增加文件或删除文件,则认为文件有变动
            if (addFiles.Count > 0 || files.Count > 0)
            {
                //写入version文件
                File.WriteAllBytes(Path.Combine(resourcesOutputPath, AssetBundleUtility.VersionFileName), AssetBundleUtility.Encrypt(bytes, AssetBundleUtility.SecretKey));

                //生成补丁包
                string pathFileName = Path.Combine(patchesOutputPathPlatform, string.Format("{0}-{1}.zip", versionIDOld, versionID));
                index = 0;
                foreach (var item in addFiles)
                {
                    index++;
                    EditorUtility.DisplayProgressBar("Build Patch File", string.Format("{0}/{1}  {2}", index, addFiles.Count, item.MD5), index / (float)addFiles.Count);
                    int res = lzip.compress_File(LevelOfCompression, pathFileName, Path.Combine(resourcesOutputPath, item.MD5), true);
                    if (res < 0)
                    {
                        EditorUtility.DisplayDialog("Update Resources Files", string.Format("Compression Failed - fileName: {0}, errorCode: {1}", item.MD5, res), "OK");
                        return;
                    }
                }
                int res1 = lzip.compress_File(LevelOfCompression, pathFileName, Path.Combine(resourcesOutputPath, AssetBundleUtility.VersionFileName), true);
                if (res1 < 0)
                {
                    EditorUtility.DisplayDialog("Update Resources Files", string.Format("Compression Failed - fileName: {0}, errorCode: {1}", AssetBundleUtility.VersionFileName, res1), "OK");
                    return;
                }

                //patchList
                string patchFileMD5  = AssetBundleUtility.GetMD5HashFromFile(pathFileName);
                long   patchFileSize = new FileInfo(pathFileName).Length;
                File.AppendAllText(Path.Combine(patchesOutputPathPlatform, AssetBundleUtility.PatchListFileName),
                                   string.Format("{0}\t{1}\t{2}\t{3}\n", versionIDOld, versionID, patchFileMD5, patchFileSize));

                //changelog
                string changeLog = string.Format("Version.{0} - Version.{1}\n\n{2}{3}\n\n\n", versionIDOld, versionID, addFilesSB.ToString(), deleteFilesSB.ToString());
                File.AppendAllText(Path.Combine(patchesOutputPathPlatform, ChangeLogFileName), changeLog, Encoding.UTF8);

                hintText = string.Format("Update Success: {0}", pathFileName);
            }

            EditorUtility.ClearProgressBar();
            if (!EditorUtility.DisplayDialog("Update Resources Files", hintText, "OK", "Open Contain Folder"))
            {
                System.Diagnostics.Process.Start("explorer.exe", "/select," + Path.GetFullPath(patchesOutputPathPlatform));
            }
        }