Exemple #1
0
        private static void BuildAssetBundle(AssetBundleBuildSetting dirSetting)
        {
            var projectInfo = ProjectInfoDati.GetActualInstance();
            var startTime   = DateTime.Now;

            Debug.Log($"应用{projectInfo.DevelopProjectName}在{DateTime.Now}开始执行AssetBundle打包!");
            var assetBundleOutPutDir = projectInfo.AssetBundleBuildDir;

            IOUtility.EnsureDirExist(assetBundleOutPutDir);
            try
            {
                BuildPipeline.BuildAssetBundles(assetBundleOutPutDir,
                                                BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget);
            }
            catch (Exception e)
            {
                Debug.Log($"应用{projectInfo.DevelopProjectName}的AssetBundle打包操作发生异常," +
                          $"异常信息为{e.Message}!");
                throw;
            }

            var endTime       = DateTime.Now;
            var costTimeStamp = (endTime - startTime);
            var minutes       = costTimeStamp.Minutes;
            var seconds       = costTimeStamp.Seconds;

            buildTotalSecond += costTimeStamp.TotalSeconds;
            Debug.Log($"应用{projectInfo.DevelopProjectName}在{DateTime.Now}结束执行AssetBundle打包!");
            Debug.Log($"应用{projectInfo.DevelopProjectName}的AssetBundle打包操作已完成," +
                      $"耗时为{minutes}分{seconds}秒!");
            Debug.Log($"应用{projectInfo.DevelopProjectName}的AssetBundle打包操作已完成," +
                      $"当前总耗时为{buildTotalSecond}秒!");
        }
Exemple #2
0
        private static void SetBundleIdANdBuild_AtSize(AssetBundleBuildSetting dirSetting, bool isBuild = true)
        {
            var sizeInfo      = dirSetting.GetSizeInfo();
            var appBundleInfo = currentAssetBundleInfo;

            foreach (var kv in sizeInfo.BundlePaths)
            {
                SetAssetBundleIdAtSizeAssetBundle(dirSetting, kv.Value, appBundleInfo, kv.Key);
            }

            foreach (var overSizeFileAssetIdAndPath in sizeInfo.OutPaths)
            {
                var bundleName = string.Format("{0}_{1}",
                                               IOUtility.GetSomeDirPath(dirSetting.Dir, 3).ToLower(), overSizeFileAssetIdAndPath.Value);
                SetAssetBundleIdAtSizeAssetBundle(
                    dirSetting,
                    new List <string> {
                    overSizeFileAssetIdAndPath.Key
                },
                    appBundleInfo,
                    bundleName);
            }

            if (isBuild)
            {
                BuildAssetBundle(dirSetting);
            }
        }
Exemple #3
0
        private static void SetBundleIdANdBuild_AtDirTree(AssetBundleBuildSetting dirSetting, bool isBuild = true)
        {
            var paths    = dirSetting.GetFullPathsAtDirTree();
            var bundleId = IOUtility.GetSomeDirPath(dirSetting.Dir, 3).ToLower();

            SetAssetBundleId(dirSetting, paths, null);
            if (isBuild)
            {
                BuildAssetBundle(dirSetting);
            }
        }
Exemple #4
0
        private static void SetBundleIdANdBuild_AtEveryFile(AssetBundleBuildSetting dirSetting, bool isBuild = true)
        {
            var everyPaths = dirSetting.SelfDirPaths();
            var bundleId   = IOUtility.GetSomeDirPath(dirSetting.Dir, 4).ToLower();

            SetAssetBundleId(dirSetting, everyPaths, bundleId, true);
            if (isBuild)
            {
                BuildAssetBundle(dirSetting);
            }
        }
Exemple #5
0
        private static void SetBundleIdANdBuild_AtDirSelf(AssetBundleBuildSetting dirSetting,
                                                          bool isBuild = true)
        {
            var dirSelfPaths = dirSetting.SelfDirPaths();

            var selfBundleId = IOUtility.GetSomeDirPath(dirSetting.Dir, 3).ToLower();

            SetAssetBundleId(dirSetting, dirSelfPaths, selfBundleId);
            if (isBuild)
            {
                BuildAssetBundle(dirSetting);
            }
        }
        //Todo:目录打包宏
        #endregion

        private void AddSetting(string dir)
        {
            var existSetting = BundleDirSettings.Find(s => s.Dir == dir);

            if (existSetting != null)
            {
                return;
            }
            var setting = new AssetBundleBuildSetting {
                Dir = dir
            };

            BundleDirSettings.Add(setting);
        }
Exemple #7
0
        private static void MoveAssetBundleAtEveryBuild(List <string> paths,
                                                        AssetBundleBuildSetting dirSetting)
        {
            var bundleIds = paths.Select(p => Path.GetFileNameWithoutExtension(p)?.ToLower())
                            .ToList();
            var locApp = ProjectInfoDati.GetActualInstance();
            var assetBundleOutPaths = IOUtility.GetPathDictionary(locApp.AssetBundleBuildDir, s => !s.EndsWith(".manifest"));
            var targetDirId         = IOUtility.GetLastDir(dirSetting.Dir);
            var moveDir             = locApp.AssetBundleBuildDir + targetDirId;

            moveDir = moveDir.EnsureDirEnd();
            foreach (var bundleId in bundleIds)
            {
                var sourcePath = assetBundleOutPaths[bundleId];
                var targetPath = moveDir + bundleId + ASSETBUNDLE_SHORT_SUFFIX;
                IOUtility.Move(sourcePath, targetPath);
            }
        }
Exemple #8
0
        /// <summary>
        /// 设置 Bundle 包名
        /// 设置 AssetId To Bundle 映射信息
        /// </summary>
        /// <param name="dirSetting"></param>
        /// <param name="paths"></param>
        /// <param name="bundleId"></param>
        /// <param name="plusFileName"></param>
        private static void SetAssetBundleId(AssetBundleBuildSetting dirSetting,
                                             List <string> paths, string bundleId = null, bool plusFileName = false)
        {
            var appBundleInfo = currentAssetBundleInfo;

            var bundleIds = new List <string>();

            foreach (var path in paths)
            {
                var assetId = Path.GetFileNameWithoutExtension(path);
                if (string.IsNullOrEmpty(assetId))
                {
                    Debug.LogError($"路径{path}获取文件名失败!");
                    continue;
                }

                var assetLowerId  = assetId.ToLower();
                var finalBundleId = bundleId ?? assetLowerId;
                if (plusFileName)
                {
                    finalBundleId = string.Format("{0}_{1}", finalBundleId, assetLowerId);
                }
                finalBundleId = finalBundleId.ToLower();
                if (!bundleIds.Contains(finalBundleId))
                {
                    bundleIds.Add(finalBundleId);
                }

                appBundleInfo.AddMap(assetLowerId, finalBundleId);
                var assetsPath = UnityIOUtility.GetAssetsPath(path);
                var importer   = AssetImporter.GetAtPath(assetsPath);
                if (importer == null)
                {
                    Debug.LogError($"资源{assetsPath}获取导入器失败!");
                    continue;
                }

                dirSetting.UpdateBundleIds(bundleIds);
                importer.assetBundleName    = finalBundleId;
                importer.assetBundleVariant = ASSETBUNDLE_SHORT_SUFFIX;
            }
        }
Exemple #9
0
        private static void TryMoveAssetBundle(AssetBundleBuildSetting dirSetting,
                                               List <string> paths)
        {
            switch (dirSetting.BuildType)
            {
            case AssetBundleBuildType.EveryBuild:
                MoveAssetBundleAtEveryBuild(paths, dirSetting);
                break;

            case AssetBundleBuildType.BuildAtSize:
            case AssetBundleBuildType.BuildAtList:
                break;

            case AssetBundleBuildType.BuildAtDirSelf:
            case AssetBundleBuildType.BuildAtDirTree:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Exemple #10
0
        private static void SetAssetBundleIdAtSizeAssetBundle(AssetBundleBuildSetting dirSetting,
                                                              List <string> paths,
                                                              ProjectAssetsToBundleMapInfo appBundleInfo,
                                                              string bundleId = null)
        {
            var bundleIds = new List <string>();

            foreach (var path in paths)
            {
                var assetId = Path.GetFileNameWithoutExtension(path);
                if (assetId == null)
                {
                    Debug.LogError($"路径{path}获取文件名失败!");
                    continue;
                }

                var assetLowerId  = assetId.ToLower();
                var finalBundleId = bundleId ??
                                    ($"({IOUtility.GetSomeDirPath(dirSetting.Dir, 3).ToLower()}_{assetLowerId}");
                finalBundleId = finalBundleId.ToLower();
                if (bundleIds.Contains(finalBundleId))
                {
                    bundleIds.Add(finalBundleId);
                }

                appBundleInfo.AddMap(assetLowerId, finalBundleId);
                var assetsPath = UnityIOUtility.GetAssetsPath(path);
                var importer   = AssetImporter.GetAtPath(assetsPath);
                if (importer == null)
                {
                    Debug.LogError($"资源{assetsPath}获取导入器失败!");
                    continue;
                }

                dirSetting.UpdateBundleIds(bundleIds);
                importer.assetBundleName    = finalBundleId;
                importer.assetBundleVariant = ASSETBUNDLE_SHORT_SUFFIX;
            }
        }
        public void SetBuildAtTargetBuildType(string dir, AssetBundleBuildType buildType)
        {
            var locAppId   = UnityEditorUtility.GetLocAppIdAtSelectDir();
            var appSetting = ProjectInfoDati.GetActualInstance();

            if (locAppId == null)
            {
                Debug.LogError($"目标目录{dir}不是一个应用下的目录!");
                return;
            }

            if (!AssetBundleBuilder.IsLegalAssetBundleDir(dir))
            {
                Debug.LogError($"目标目录{dir}不是一个有效的AssetBundle目录!");
                return;
            }

            var existSetting = BundleDirSettings.Find(s => s.Dir == dir);

            if (existSetting == null)
            {
                existSetting = new AssetBundleBuildSetting
                {
                    BuildType = buildType,
                    Dir       = dir,
                    //LocAppId = Unity3DEditorUtility.GetLocAppIdAtSelectDir()
                };
                BundleDirSettings.Add(existSetting);
                BundleDirSettings = BundleDirSettings.OrderBy(s => s.Dir).ToList();
                Debug.Log($"目录{dir}当前不存在配置数据,已新建配置!");
            }
            else
            {
                existSetting.BuildType = buildType;
                Debug.Log($"目录{dir}已设置为基于{buildType}打包方式!");
            }
        }
Exemple #12
0
        /// <summary>
        /// 设置给定配置下资源的AssetBundle名并选择是否打包。
        /// </summary>
        /// <param name="dirSetting">打包配置</param>
        /// <param name="isBuild">是否在设置完AssetBundle名后进行打包,默认进行打包。</param>
        /// <param name="isRefresh">是否在操作全部完毕后进行刷新,默认不刷新。</param>
        /// <param name="isSaveBundleSetting">是否在设置完AssetBundle名进行全局AssetBundle配置的保存,默认保存。</param>
        public static void SetBundleIdAndSelectIsBuild(AssetBundleBuildSetting dirSetting,
                                                       bool isBuild             = true,
                                                       bool isRefresh           = true,
                                                       bool isSaveBundleSetting = true)
        {
            switch (dirSetting.BuildType)
            {
            case AssetBundleBuildType.EveryBuild:
                SetBundleIdANdBuild_AtEveryFile(dirSetting, isBuild);
                break;

            case AssetBundleBuildType.BuildAtSize:
                SetBundleIdANdBuild_AtSize(dirSetting, isBuild);
                break;

            case AssetBundleBuildType.BuildAtDirSelf:
                SetBundleIdANdBuild_AtDirSelf(dirSetting, isBuild);
                break;

            case AssetBundleBuildType.BuildAtDirTree:
                SetBundleIdANdBuild_AtDirTree(dirSetting, isBuild);
                break;

            case AssetBundleBuildType.BuildAtList:
                break;
            }

            if (isSaveBundleSetting)
            {
                AssetBundleEditorDati.GetSingleDati().Save();
            }

            if (isRefresh)
            {
                AssetDatabase.Refresh();
            }
        }