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}秒!"); }
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); } }
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); } }
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); } }
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); }
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); } }
/// <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; } }
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(); } }
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}打包方式!"); } }
/// <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(); } }