Exemplo n.º 1
0
        static void CreateVersionFile(string tarFolder)
        {
            string versionPath = string.Format("{0}/{1}", tarFolder, BuildConfig.finalLoadingVersionName);
            int    mainVersion = 0, musicVersion = 0, artVersion = 0;

            if (File.Exists(versionPath))
            {
                string   versionString = File.ReadAllLines(versionPath)[0];
                string[] versionLines  = versionString.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
                mainVersion  = int.Parse(versionLines[0]);
                musicVersion = int.Parse(versionLines[1]);
                artVersion   = int.Parse(versionLines[2]);
            }

            string mainVersionPath  = string.Format("{0}/{1}", tarFolder, BuildConfig.GetLoadingVersionName(BuildConfig.Project.Main));
            string musicVersionPath = string.Format("{0}/{1}", tarFolder, BuildConfig.GetLoadingVersionName(BuildConfig.Project.Music));
            string artVersionPath   = string.Format("{0}/{1}", tarFolder, BuildConfig.GetLoadingVersionName(BuildConfig.Project.Art));

            if (File.Exists(mainVersionPath))
            {
                string mainVersionString = File.ReadAllText(mainVersionPath);
                mainVersion = int.Parse(mainVersionString);
                File.Delete(mainVersionPath);
            }

            if (File.Exists(musicVersionPath))
            {
                string musicVersionString = File.ReadAllText(musicVersionPath);
                musicVersion = int.Parse(musicVersionString);
                File.Delete(musicVersionPath);
            }

            if (File.Exists(artVersionPath))
            {
                string artVersionString = File.ReadAllText(artVersionPath);
                artVersion = int.Parse(artVersionString);
                File.Delete(artVersionPath);
            }

            string finalVersionString = string.Format("{0}.{1}.{2}\n{3},{4},{5}", mainVersion, musicVersion, artVersion,
                                                      BuildConfig.GetLoadingListName(BuildConfig.Project.Main),
                                                      BuildConfig.GetLoadingListName(BuildConfig.Project.Music),
                                                      BuildConfig.GetLoadingListName(BuildConfig.Project.Art));

            CreateDirectory(versionPath);
            File.WriteAllText(versionPath, finalVersionString);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 打包AeestBundle和配置信息等到与Asset同级的AssetBundle目录下
        /// </summary>
        /// <returns></returns>
        public static IEnumerator Build()
        {
            yield return("开始打包...");

            // 1. 读取打包资源列表配置
            yield return("读取打包列表配置...");

            List <BaseAssetManager> managerList = BuildConfig.GetAssetManagerList();

            if (managerList == null || managerList.Count < 1)
            {
                string str = "无任何要打包的资源,请检查配置是否正确。";
                yield return(str);

                EditorUtility.DisplayDialog("错误", str, "确定");
                yield break;
            }

            StringBuilder sb = new StringBuilder("资源列表如下:\n");

            foreach (var c in managerList)
            {
                sb.AppendLine(c.ToString());
            }
            yield return(sb.ToString());

            // 2. 读取上次打包结果
            yield return("读取上次打包结果...");

            List <string> lastBuildConfigList = null;

            if (File.Exists(BuildConfig.buildingListPath))
            {
                string[] lastBuildConfig = File.ReadAllLines(BuildConfig.buildingListPath);
                if (lastBuildConfig != null && lastBuildConfig.Length > 0)
                {
                    lastBuildConfigList = new List <string>(lastBuildConfig);
                    int findIndex;
                    foreach (var manager in managerList)
                    {
                        foreach (var item in manager.items)
                        {
                            findIndex = item.ReadConfig(lastBuildConfigList);
                            //找到对应文件下标则删除该列数据
                            if (findIndex >= 0)
                            {
                                lastBuildConfigList.RemoveAt(findIndex);
                            }
                        }
                    }
                }
            }
            else
            {
                yield return("这是第一次打包。");
            }

            // 3. 计算资源的Md5...
            yield return("计算资源的Md5...");

            foreach (var manager in managerList)
            {
                manager.ComputeMd5();
            }


            bool needBuild = false;

            sb.Length = 0;
            sb.AppendLine("需要重新打包的资源如下:");
            foreach (var manager in managerList)
            {
                if (manager.isChange)
                {
                    needBuild = true;
                    sb.AppendLine(manager.assetFolderPath);
                }
            }

            //lastBuildConfigList还未删除的数据说明已经没有这些资源需要打包,即要删掉对应的AB包
            List <string> removedList = GetFileNeedRemoveArray(lastBuildConfigList);

            // 4. 打包
            if (needBuild)
            {
                UpdateBuildingItemsFlag(managerList);

                yield return(sb.ToString());

                // 打包
                yield return("打包中..." + BuildConfig.tempbuildingAssetBundlesFolder);

                // 先打到一个临时目录
                UnityBuild(BuildConfig.tempbuildingAssetBundlesFolder, managerList);

                // 检查是否所有的包都已正确生成
                bool succeed = IsAllAssetBuildSucceed(managerList, BuildConfig.buildingAssetBundlesFolder);
                if (!succeed)
                {
                    throw new InvalidOperationException("生成失败,未知原因");
                }

                yield return("打包完成!");

                // 打包完成事件
                foreach (var c in managerList)
                {
                    if (c.isChange)
                    {
                        c.OnBuildFinished();
                    }
                }
            }

            sb.Length = 0;
            bool isVersionChanged = IsVersionChanged(managerList, removedList, ref sb);

            string buildResult = sb.ToString();

            yield return(buildResult);

            // 6. 生成列表文件,版本文件,日志文件
            yield return("生成增量文件...");

            if (isVersionChanged)
            {
                SaveBuildingListFile(managerList, BuildConfig.tempBuildingListPath, ref sb);        // 供打包用的列表文件
                int version = UpdateVersion();
                WriteVersionFile(BuildConfig.tempBuildingVersionPath, version);                     // 供打包用的版本文件
            }

            // 供下载用的版本文件(存本地版本号,用于和服务器上最新版本号对比)
            string strVersion = SaveLoadingVersionFile(BuildConfig.tempLoadingVersionPath);

            yield return("最新版本为: " + strVersion);

            // 日志文件
            if (isVersionChanged)
            {
                SaveLog(buildResult, strVersion, BuildConfig.tempBuildingLogPath);
            }

            // 供下载用的列表文件
            SaveLoadingListFile(managerList, BuildConfig.tempLoadingListPath);

            // 将打的包移动到对应目录
            CopyFiles(BuildConfig.tempBuildingRootFolder, BuildConfig.buildingRootFolder);

            // 删除移除的ab包
            DeleteRemovedAssetBundles(removedList);

            // dispose
            foreach (var manager in managerList)
            {
                manager.Dispose();
            }
        }