/// <summary> /// 打包Asset Bundle /// </summary> /// <param name="buildingAssetInfos"></param> /// <param name="buildParams"></param> /// <param name="platform"></param> private void BuildAssetBundle(List <AssetBundleItem> assetBundleItemList, BuildingAssetInfos buildingAssetInfos, BuildAssetBundleParams buildParams, RuntimePlatform platform) { //----------------------------开始设置build ab name------------------------------- //根据传进来的资源,设置AB name foreach (var buildInfoItem in buildingAssetInfos.AssetInfoMap) { var assetPath = buildInfoItem.Key; var assetData = buildInfoItem.Value; //设置ab name var ai = GetAssetImporter(assetPath); if (ai) { ai.SetAssetBundleNameAndVariant(assetData.ABName, null); } } //----------------------------生成AssetBundle------------------------------- var platformOutputPath = Path.Combine(buildParams.OutputPath, BApplication.GetPlatformPath(platform)); string abOutputPath = IPath.Combine(platformOutputPath, BResources.ART_ASSET_ROOT_PATH); if (!Directory.Exists(abOutputPath)) { Directory.CreateDirectory(abOutputPath); } //配置 var buildTarget = BApplication.GetBuildTarget(platform); BuildAssetBundleOptions buildOpa = BuildAssetBundleOptions.ChunkBasedCompression | //压缩 BuildAssetBundleOptions.DeterministicAssetBundle | //保证一致 //BuildAssetBundleOptions.DisableWriteTypeTree| //关闭TypeTree BuildAssetBundleOptions.DisableLoadAssetByFileName | BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension; //关闭使用filename加载 //关闭TypeTree var buildAssetConf = BDEditorApplication.BDFrameworkEditorSetting?.BuildAssetBundleSetting; if (buildAssetConf.IsDisableTypeTree) { buildOpa |= BuildAssetBundleOptions.DisableWriteTypeTree; //关闭TypeTree } UnityEditor.BuildPipeline.BuildAssetBundles(abOutputPath, buildOpa, buildTarget); Debug.LogFormat("【编译AssetBundle】 output:{0} ,buildTarget:{1}", abOutputPath, buildTarget.ToString()); //3.检测本地Assetbundle // allAbList = Directory.GetFiles(abOutputPath, "*", SearchOption.AllDirectories); // foreach (var abpath in allAbList) // { // if (abpath.Contains(".")) // { // continue; // } // // var depend = AssetDatabase.GetAssetBundleDependencies(abpath,true); // } GlobalAssetsHelper.GenBasePackageAssetBuildInfo(buildParams.OutputPath, platform); }
/// <summary> ///生成Runtime下的Art.Config /// </summary> private List <AssetBundleItem> GenAssetBundleConfig(BuildingAssetInfos buildingAssetInfos, BuildAssetBundleParams buildParams, RuntimePlatform platform) { //根据buildinfo 生成加载用的 Config //runtime下的全部保存配置,其他的只保留一个ab名即可 //1.导出配置 var assetDataItemList = new List <AssetBundleItem>(); //占位,让id和idx恒相等 assetDataItemList.Add(new AssetBundleItem(0, null, null, -1, new int[] { })); //搜集runtime的 ,分两个for 让序列化后的数据更好审查 foreach (var item in buildingAssetInfos.AssetInfoMap) { //runtime路径下,写入配置 if (item.Key.Contains(RUNTIME_PATH, StringComparison.OrdinalIgnoreCase)) { var loadPath = GetAbsPathFormRuntime(item.Key); //添加 var abi = new AssetBundleItem(assetDataItemList.Count, loadPath, item.Value.ABName, item.Value.Type, new int[] { }); // abi.EditorAssetPath = item.Key; assetDataItemList.Add(abi); //.ManifestMap[key] = mi; item.Value.ArtConfigIdx = abi.Id; } } //搜集非runtime的,进一步防止重复 foreach (var item in buildingAssetInfos.AssetInfoMap) { //非runtime的只需要被索引AB if (!item.Key.Contains(RUNTIME_PATH, StringComparison.OrdinalIgnoreCase)) { var ret = assetDataItemList.FirstOrDefault((ab) => ab.AssetBundlePath == item.Value.ABName); if (ret == null) //不保存重复内容 { var abi = new AssetBundleItem(assetDataItemList.Count, null, item.Value.ABName, item.Value.Type, new int[] { }); // abi.EditorAssetPath = item.Key; assetDataItemList.Add(abi); item.Value.ArtConfigIdx = abi.Id; } } } //将depend替换成Id,减少序列化数据量 foreach (var assetbundleData in assetDataItemList) { if (!string.IsNullOrEmpty(assetbundleData.LoadPath)) { //dependAsset 替换成ID var buildAssetData = buildingAssetInfos.AssetInfoMap.Values.FirstOrDefault((asset) => asset.ABName == assetbundleData.AssetBundlePath); for (int i = 0; i < buildAssetData.DependAssetList.Count; i++) { var dependAssetName = buildAssetData.DependAssetList[i]; //寻找保存列表中依赖的id(可以认为是下标) var dependAssetBuildData = assetDataItemList.FirstOrDefault((asset) => asset.AssetBundlePath == dependAssetName); //向array添加元素,editor 略冗余,目的是为了保护 runtime 数据源readonly var templist = assetbundleData.DependAssetIds.ToList(); templist.Add(dependAssetBuildData.Id); assetbundleData.DependAssetIds = templist.ToArray(); } } } #region 检查生成的数据 //检查config是否遗漏 foreach (var assetDataItem in buildingAssetInfos.AssetInfoMap) { var ret = assetDataItemList.Find((abi) => abi.AssetBundlePath == assetDataItem.Value.ABName); if (ret == null) { Debug.LogError("【生成配置】ab配置遗漏 - " + assetDataItem.Key + " ab:" + assetDataItem.Value.ABName); } } #endregion // return(assetDataItemList); }
/// <summary> /// 打包Asset Bundle /// </summary> /// <param name="buildAssetsInfo"></param> /// <param name="buildParams"></param> /// <param name="platform"></param> private void BuildAssetBundle(List <AssetBundleItem> assetBundleItemList, BuildAssetsInfo buildAssetsInfo, BuildAssetBundleParams buildParams, RuntimePlatform platform) { //----------------------------开始设置build ab name------------------------------- //根据传进来的资源,设置AB name foreach (var buildInfoItem in buildAssetsInfo.AssetDataMaps) { var assetPath = buildInfoItem.Key; var assetData = buildInfoItem.Value; //设置ab name var ai = GetAssetImporter(assetPath); if (ai) { ai.SetAssetBundleNameAndVariant(assetData.ABName, null); } } //----------------------------生成AssetBundle------------------------------- var platformOutputPath = Path.Combine(buildParams.OutputPath, BApplication.GetPlatformPath(platform)); string abOutputPath = IPath.Combine(platformOutputPath, BResources.ART_ASSET_ROOT_PATH); if (!Directory.Exists(abOutputPath)) { Directory.CreateDirectory(abOutputPath); } //配置 var buildTarget = BApplication.GetBuildTarget(platform); BuildAssetBundleOptions buildOpa = BuildAssetBundleOptions.ChunkBasedCompression | //压缩 BuildAssetBundleOptions.DeterministicAssetBundle | //保证一致 //BuildAssetBundleOptions.DisableWriteTypeTree| //关闭TypeTree BuildAssetBundleOptions.DisableLoadAssetByFileName | BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension; //关闭使用filename加载 //关闭TypeTree var buildAssetConf = BDEditorApplication.BDFrameWorkFrameEditorSetting?.BuildAssetBundle; if (buildAssetConf.IsDisableTypeTree) { buildOpa |= BuildAssetBundleOptions.DisableWriteTypeTree; //关闭TypeTree } UnityEditor.BuildPipeline.BuildAssetBundles(abOutputPath, buildOpa, buildTarget); Debug.LogFormat("【编译AssetBundle】 output:{0} ,buildTarget:{1}", abOutputPath, buildTarget.ToString()); //----------------------------清理------------------------------------- //1.移除所有的ab RemoveAllAssetbundleName(); //2.删除本地没有的资源 var allABList = Directory.GetFiles(abOutputPath, "*", SearchOption.AllDirectories).Where((p) => string.IsNullOrEmpty(Path.GetExtension(p))); foreach (var abpath in allABList) { var abname = Path.GetFileName(abpath); var ret = assetBundleItemList.FirstOrDefault((abdata) => abdata.AssetBundlePath == abname); if (ret == null) { // File.Delete(abpath); File.Delete(abpath + ".manifest"); // var path = AssetDatabase.GUIDToAssetPath(abname); Debug.Log("【删除旧ab:】" + abname + " - " + path); } } //3.检测本地Assetbundle // allAbList = Directory.GetFiles(abOutputPath, "*", SearchOption.AllDirectories); // foreach (var abpath in allAbList) // { // if (abpath.Contains(".")) // { // continue; // } // // var depend = AssetDatabase.GetAssetBundleDependencies(abpath,true); // } BasePackageAssetsHelper.GenBasePackageAssetBuildInfo(buildParams.OutputPath, platform); }