using XGame.Editor.Asset; using System; using System.IO; using UnityEditor; using UnityEditor.Build.Pipeline; using UnityEngine; using UnityEngine.Build.Pipeline; namespace XGame.Editor.Build.AssetBundles { public class SbpBuildPipeline : IBuildPipeline { public bool BuildAssetBundles(UnityEditor.AssetBundleBuild[] builds) { var outputPath = PathDefine.AssetBundleOutputPath; // KFADF.FileUtil.WorkPath + "/AssetBundles"; if (!Directory.Exists(outputPath)) { Directory.CreateDirectory(outputPath); } //LZ4压缩 | 报错中断 //剔除文件头的Unity版本号信息 BuildAssetBundleOptions.AssetBundleStripUnityVersion var bundleOptions = BuildAssetBundleOptions.ChunkBasedCompression | BuildAssetBundleOptions.StrictMode; // bool shouldCheckODR = EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS; //#if UNITY_TVOS // shouldCheckODR |= EditorUserBuildSettings.activeBuildTarget == BuildTarget.tvOS; //#endif // if (shouldCheckODR) // { //#if ENABLE_IOS_ON_DEMAND_RESOURCES // if (PlayerSettings.iOS.useOnDemandResources) // bundleOptions |= BuildAssetBundleOptions.UncompressedAssetBundle; //#endif //#if ENABLE_IOS_APP_SLICING // bundleOptions |= BuildAssetBundleOptions.UncompressedAssetBundle; //#endif // } return BuildAssetBundles(outputPath, builds, bundleOptions, EditorUserBuildSettings.activeBuildTarget); } public bool BuildAssetBundles(string outputPath, UnityEditor.AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform) { BuildLog.Log($"SbpBuildPipeline. Target: {EditorUserBuildSettings.activeBuildTarget} Time: {DateTime.Now}"); var manifest = CompatibilityBuildPipeline.BuildAssetBundles(outputPath, builds, assetBundleOptions, targetPlatform); if (manifest != null) { BuildLog.Log($"SbpBuildPipeline success. Time: {DateTime.Now}"); PostBuildAssetBundles(manifest, outputPath); return true; } else { BuildLog.Error($"SbpBuildPipeline failed. Time: {DateTime.Now}"); } return false; } /// /// SBP的ab没有后缀,手动补上后缀,并且没有了 *.bunle.manifest文件,crc值需要manifest里获取 /// /// private void PostBuildAssetBundles(CompatibilityAssetBundleManifest manifest, string outputPath) { var bundleNames = manifest.GetAllAssetBundles(); var count = bundleNames.Length; var crcManifest = new BundleCrcInfoManifest() { bundleInfos = new BundleCrcInfo[count] }; var noVariant = string.IsNullOrEmpty(Framework.Asset.Define.BUNDLE_VARIANT); for (var i = 0; i < count; i++) { var bundleName = bundleNames[i]; // bundleName不包含后缀,把子文件夹名字也去掉,方便直接拿文件名比对 var sepIndex = bundleName.LastIndexOf('/'); var bundleInfo = new BundleCrcInfo() { bundleName = sepIndex >= 0 ? bundleName.Substring(sepIndex + 1) : bundleName, bundleCRC = manifest.GetAssetBundleCrc(bundleName).ToString() }; crcManifest.bundleInfos[i] = bundleInfo; if (noVariant) { continue; } try { var filePath = Path.Combine(outputPath, bundleName); if (File.Exists(filePath)) { UnityEditor.FileUtil.MoveFileOrDirectory(filePath, $"{filePath}.{Framework.Asset.Define.BUNDLE_VARIANT}"); } } catch (Exception ex) { Debug.LogException(ex); } } var crcManifestPath = Path.Combine(outputPath, "BundleCrcInfoManifest.manifest"); if (File.Exists(crcManifestPath)) { File.Delete(crcManifestPath); } File.WriteAllText(crcManifestPath, crcManifest.ToString()); BuildLog.Log($"PostBuildAssetBundles Completed. Manifest Path:{crcManifestPath}"); } } }