using System.IO; using UnityEditor.Build.Content; using UnityEditor.Build.Pipeline.Interfaces; using UnityEngine; using UnityEngine.Build.Pipeline; namespace UnityEditor.Build.Pipeline { #if UNITY_2018_3_OR_NEWER using BuildCompression = UnityEngine.BuildCompression; #else using BuildCompression = UnityEditor.Build.Content.BuildCompression; #endif /// /// Static class exposing convenient methods that match the BuildPipeline method, suitable /// for porting existing projects to the Scriptable Build Pipeline quickly. /// New projects could consider calling directly. /// public static class CompatibilityBuildPipeline { /// /// Wrapper API to match BuildPipeline API but use the Scriptable Build Pipeline to build Asset Bundles. /// /// /// /// Not all BuildAssetBundleOptions are supported in the Scriptable Build Pipeline. /// Supported options are: ForceRebuildAssetBundle, AppendHashToAssetBundleName, ChunkBasedCompression, UncompressedAssetBundle, and DisableWriteTypeTree. /// In addition, existing BuildPipeline callbacks are not yet supported. /// /// Output path for the AssetBundles. /// AssetBundle building options. /// Chosen target build platform. /// CompatibilityAssetBundleManifest object exposing information about the generated asset bundles. public static CompatibilityAssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform) { // Retrieve the AssetBundle definitions as defined through the Inspector and saved in the AssetDatabase var buildInput = ContentBuildInterface.GenerateAssetBundleBuilds(); return BuildAssetBundles_Internal(outputPath, new BundleBuildContent(buildInput), assetBundleOptions, targetPlatform); } /// /// Wrapper API to match BuildPipeline API but use the Scriptable Build Pipeline to build Asset Bundles. /// /// /// /// Not all BuildAssetBundleOptions are supported in the Scriptable Build Pipeline. /// Supported options are: ForceRebuildAssetBundle, AppendHashToAssetBundleName, ChunkBasedCompression, UncompressedAssetBundle, and DisableWriteTypeTree. /// In addition, existing BuildPipeline callbacks are not yet supported. /// /// Output path for the AssetBundles. /// AssetBundle building map. /// AssetBundle building options. /// Chosen target build platform. /// CompatibilityAssetBundleManifest object exposing information about the generated asset bundles. public static CompatibilityAssetBundleManifest BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform) { return BuildAssetBundles_Internal(outputPath, new BundleBuildContent(builds), assetBundleOptions, targetPlatform); } internal static CompatibilityAssetBundleManifest BuildAssetBundles_Internal(string outputPath, IBundleBuildContent content, BuildAssetBundleOptions options, BuildTarget targetPlatform) { var group = BuildPipeline.GetBuildTargetGroup(targetPlatform); var parameters = new BundleBuildParameters(targetPlatform, group, outputPath); if ((options & BuildAssetBundleOptions.ForceRebuildAssetBundle) != 0) parameters.UseCache = false; if ((options & BuildAssetBundleOptions.AppendHashToAssetBundleName) != 0) parameters.AppendHash = true; #if UNITY_2018_3_OR_NEWER if ((options & BuildAssetBundleOptions.ChunkBasedCompression) != 0) parameters.BundleCompression = BuildCompression.LZ4; else if ((options & BuildAssetBundleOptions.UncompressedAssetBundle) != 0) parameters.BundleCompression = BuildCompression.Uncompressed; else parameters.BundleCompression = BuildCompression.LZMA; #else if ((options & BuildAssetBundleOptions.ChunkBasedCompression) != 0) parameters.BundleCompression = BuildCompression.DefaultLZ4; else if ((options & BuildAssetBundleOptions.UncompressedAssetBundle) != 0) parameters.BundleCompression = BuildCompression.DefaultUncompressed; else parameters.BundleCompression = BuildCompression.DefaultLZMA; #endif if ((options & BuildAssetBundleOptions.DisableWriteTypeTree) != 0) parameters.ContentBuildFlags |= ContentBuildFlags.DisableWriteTypeTree; IBundleBuildResults results; ReturnCode exitCode = ContentPipeline.BuildAssetBundles(parameters, content, out results); if (exitCode < ReturnCode.Success) return null; var manifest = ScriptableObject.CreateInstance(); manifest.SetResults(results.BundleInfos); File.WriteAllText(parameters.GetOutputFilePathForIdentifier(Path.GetFileName(outputPath) + ".manifest"), manifest.ToString()); return manifest; } } }