public void BuildPipeline_AssetBundleBuild_WritesLinkXMLFile() { IBundleBuildParameters buildParameters = GetBuildParameters(); buildParameters.WriteLinkXML = true; IBundleBuildContent buildContent = GetBundleContent(); IBundleBuildResults results; ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out results); Assert.AreEqual(ReturnCode.Success, exitCode); var assemblies = new HashSet <Assembly>(); var types = new HashSet <Type>(); foreach (var writeResult in results.WriteResults) { foreach (var type in writeResult.Value.includedTypes) { assemblies.Add(type.Assembly); types.Add(type); } } var xml = LinkXMLGeneratorTests.ReadLinkXML(buildParameters.GetOutputFilePathForIdentifier("link.xml"), out int assemblyCount, out int typeCount); Assert.AreEqual(assemblyCount, assemblies.Count); Assert.AreEqual(typeCount, types.Count); foreach (var t in types) { LinkXMLGeneratorTests.AssertTypePreserved(xml, t); } }
public IEnumerator BuildPipeline_AssetBundleBuild_DoesNotResetUnsavedScene() { Scene s = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene); yield return(null); EditorSceneManager.SaveScene(s, k_ScenePath); GameObject.CreatePrimitive(PrimitiveType.Cube); EditorSceneManager.MarkSceneDirty(s); GameObject objectWeAdded = GameObject.Find("Cube"); Assert.IsNotNull(objectWeAdded, "No object before entering playmode"); Assert.AreEqual("testScene", SceneManager.GetActiveScene().name); IBundleBuildParameters buildParameters = GetBuildParameters(); IBundleBuildContent buildContent = GetBundleContent(); IBundleBuildResults results; ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out results); Assert.AreEqual(ReturnCode.UnsavedChanges, exitCode); Assert.AreEqual("testScene", SceneManager.GetActiveScene().name); objectWeAdded = GameObject.Find("Cube"); Assert.IsNotNull(objectWeAdded, "No object after entering playmode"); EditorSceneManager.SaveScene(s, k_ScenePath); }
public void BuildAssetBundles_WithCache_Succeeds() { IBundleBuildParameters buildParameters = GetBuildParameters(); IBundleBuildContent buildContent = GetBundleContent(true); ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out IBundleBuildResults results); Assert.AreEqual(ReturnCode.Success, exitCode); }
public void DefaultBuildTasks_GenerateBundlePacking() { IBundleBuildContent buildContent = GetBundleContent(); IDependencyData dep = GetDependencyData(); IBundleWriteData writeData = new BundleWriteData(); IDeterministicIdentifiers deterministicId = new PrefabPackedIdentifiers(); ReturnCode exitCode = RunTask <GenerateBundlePacking>(buildContent, dep, writeData, deterministicId); Assert.AreEqual(ReturnCode.Success, exitCode); }
public void BuildAssetBundles_WhenBuildLogProvided_DoesNotCreatePerformanceLogReport() { IBundleBuildParameters buildParameters = GetBuildParameters(); IBundleBuildContent buildContent = GetBundleContent(); IBundleBuildResults results; var taskList = DefaultBuildTasks.Create(DefaultBuildTasks.Preset.AssetBundleCompatible); ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out results, taskList, new BuildLog()); string tepBuildLog = buildParameters.GetOutputFilePathForIdentifier("buildlogtep.json"); FileAssert.DoesNotExist(tepBuildLog); }
public void BuildAssetBundles_WhenNoBuildInContextLog_CreatesPerformanceLogReport() { IBundleBuildParameters buildParameters = GetBuildParameters(); IBundleBuildContent buildContent = GetBundleContent(); IBundleBuildResults results; buildParameters.Group = EditorUserBuildSettings.selectedBuildTargetGroup; ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out results); string tepBuildLog = buildParameters.GetOutputFilePathForIdentifier("buildlogtep.json"); FileAssert.Exists(tepBuildLog); }
/// <summary> /// Default implementation of generating Asset Bundles using the Scriptable Build Pipeline. /// </summary> /// <param name="parameters">Set of parameters used for building asset bundles.</param> /// <param name="content">Set of content and explicit asset bundle layout to build.</param> /// <param name="result">Results from building the content and explicit asset bundle layout.</param> /// <param name="taskList">Custom task list for building asset bundles.</param> /// <param name="contextObjects">Additional context objects to make available to the build.</param> /// <returns>Return code with status information about success or failure causes.</returns> public static ReturnCode BuildAssetBundles(IBundleBuildParameters parameters, IBundleBuildContent content, out IBundleBuildResults result, IList <IBuildTask> taskList, params IContextObject[] contextObjects) { // Avoid throwing exceptions in here as we don't want them bubbling up to calling user code if (parameters == null) { result = null; BuildLogger.LogException(new ArgumentNullException("parameters")); return(ReturnCode.Exception); } // Avoid throwing exceptions in here as we don't want them bubbling up to calling user code if (taskList.IsNullOrEmpty()) { result = null; BuildLogger.LogException(new ArgumentException("Argument cannot be null or empty.", "taskList")); return(ReturnCode.Exception); } // Don't run if there are unsaved changes if (ValidationMethods.HasDirtyScenes()) { result = null; return(ReturnCode.UnsavedChanges); } AssetDatabase.SaveAssets(); ReturnCode exitCode; result = new BundleBuildResults(); // using (new SceneStateCleanup()) using (new BuildInterfacesWrapper()) using (var progressTracker = new ProgressTracker()) using (var buildCache = new BuildCache(parameters.CacheServerHost, parameters.CacheServerPort)) { Directory.CreateDirectory(parameters.TempOutputFolder); BuildContext buildContext; try { buildContext = new BuildContext(contextObjects); buildContext.SetContextObject(parameters); buildContext.SetContextObject(content); buildContext.SetContextObject(result); buildContext.SetContextObject(progressTracker); buildContext.SetContextObject(buildCache); buildContext.SetContextObject(new Unity5PackedIdentifiers()); buildContext.SetContextObject(new BuildDependencyData()); buildContext.SetContextObject(new BundleWriteData()); buildContext.SetContextObject(BuildCallbacks); } catch (Exception e) { // Avoid throwing exceptions in here as we don't want them bubbling up to calling user code result = null; BuildLogger.LogException(e); return(ReturnCode.Exception); } exitCode = BuildTasksRunner.Validate(taskList, buildContext); if (exitCode >= ReturnCode.Success) { exitCode = BuildTasksRunner.Run(taskList, buildContext); } if (Directory.Exists(parameters.TempOutputFolder)) { Directory.Delete(parameters.TempOutputFolder, true); } } return(exitCode); }
/// <summary> /// Default implementation of generating Asset Bundles using the Scriptable Build Pipeline. /// </summary> /// <param name="parameters">Set of parameters used for building asset bundles.</param> /// <param name="content">Set of content and explicit asset bundle layout to build.</param> /// <param name="result">Results from building the content and explicit asset bundle layout.</param> /// <returns>Return code with status information about success or failure causes.</returns> public static ReturnCode BuildAssetBundles(IBundleBuildParameters parameters, IBundleBuildContent content, out IBundleBuildResults result) { var taskList = DefaultBuildTasks.Create(DefaultBuildTasks.Preset.AssetBundleCompatible); return(BuildAssetBundles(parameters, content, out result, taskList)); }
/// <summary> /// Default implementation of generating Asset Bundles using the Scriptable Build Pipeline. /// </summary> /// <param name="parameters">Set of parameters used for building asset bundles.</param> /// <param name="content">Set of content and explicit asset bundle layout to build.</param> /// <param name="result">Results from building the content and explicit asset bundle layout.</param> /// <param name="taskList">Custom task list for building asset bundles.</param> /// <param name="contextObjects">Additional context objects to make available to the build.</param> /// <returns>Return code with status information about success or failure causes.</returns> public static ReturnCode BuildAssetBundles(IBundleBuildParameters parameters, IBundleBuildContent content, out IBundleBuildResults result, IList <IBuildTask> taskList, params IContextObject[] contextObjects) { // Avoid throwing exceptions in here as we don't want them bubbling up to calling user code if (parameters == null) { result = null; BuildLogger.LogException(new ArgumentNullException("parameters")); return(ReturnCode.Exception); } // Avoid throwing exceptions in here as we don't want them bubbling up to calling user code if (taskList.IsNullOrEmpty()) { result = null; BuildLogger.LogException(new ArgumentException("Argument cannot be null or empty.", "taskList")); return(ReturnCode.Exception); } // Don't run if there are unsaved changes if (ValidationMethods.HasDirtyScenes()) { result = null; return(ReturnCode.UnsavedChanges); } AssetDatabase.SaveAssets(); ReturnCode exitCode; result = new BundleBuildResults(); using (new BuildInterfacesWrapper()) #if !CI_TESTRUNNER_PROJECT using (new SceneStateCleanup()) using (var progressTracker = new ProgressTracker()) #else using (var progressTracker = new ProgressLoggingTracker()) #endif using (var buildCache = new BuildCache(parameters.CacheServerHost, parameters.CacheServerPort)) { Directory.CreateDirectory(parameters.TempOutputFolder); BuildContext buildContext; try { buildContext = new BuildContext(contextObjects); buildContext.SetContextObject(parameters); buildContext.SetContextObject(content); buildContext.SetContextObject(result); buildContext.SetContextObject(progressTracker); buildContext.SetContextObject(buildCache); // If IDeterministicIdentifiers was passed in with contextObjects, don't add the default if (!buildContext.ContainsContextObject(typeof(IDeterministicIdentifiers))) { buildContext.SetContextObject(new Unity5PackedIdentifiers()); } buildContext.SetContextObject(new BuildDependencyData()); buildContext.SetContextObject(new BundleWriteData()); buildContext.SetContextObject(BuildCallbacks); } catch (Exception e) { // Avoid throwing exceptions in here as we don't want them bubbling up to calling user code result = null; BuildLogger.LogException(e); return(ReturnCode.Exception); } exitCode = BuildTasksRunner.Validate(taskList, buildContext); if (exitCode >= ReturnCode.Success) #if SBP_PROFILER_ENABLE { exitCode = BuildTasksRunner.RunProfiled(taskList, buildContext); } #else { exitCode = BuildTasksRunner.Run(taskList, buildContext); } #endif if (Directory.Exists(parameters.TempOutputFolder)) { Directory.Delete(parameters.TempOutputFolder, true); } } int maximumSize = EditorPrefs.GetInt("BuildCache.maximumSize", 200); long maximumCacheSize = maximumSize * 1073741824L; // gigabytes to bytes ThreadPool.QueueUserWorkItem(PruneCache, maximumCacheSize); return(exitCode); }
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 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 <CompatibilityAssetBundleManifest>(); manifest.SetResults(results.BundleInfos); File.WriteAllText(parameters.GetOutputFilePathForIdentifier(Path.GetFileName(outputPath) + ".manifest"), manifest.ToString()); return(manifest); }
/// <summary> /// Default implementation of generating Asset Bundles using the Scriptable Build Pipeline. /// </summary> /// <param name="parameters">Set of parameters used for building asset bundles.</param> /// <param name="content">Set of content and explicit asset bundle layout to build.</param> /// <param name="result">Results from building the content and explicit asset bundle layout.</param> /// <param name="taskList">Custom task list for building asset bundles.</param> /// <param name="contextObjects">Additional context objects to make available to the build.</param> /// <returns>Return code with status information about success or failure causes.</returns> public static ReturnCode BuildAssetBundles(IBundleBuildParameters parameters, IBundleBuildContent content, out IBundleBuildResults result, IList <IBuildTask> taskList, params IContextObject[] contextObjects) { if (BuildPipeline.isBuildingPlayer) { result = null; BuildLogger.LogException(new InvalidOperationException("Cannot build asset bundles while a build is in progress")); return(ReturnCode.Exception); } // Avoid throwing exceptions in here as we don't want them bubbling up to calling user code if (parameters == null) { result = null; BuildLogger.LogException(new ArgumentNullException("parameters")); return(ReturnCode.Exception); } // Avoid throwing exceptions in here as we don't want them bubbling up to calling user code if (taskList.IsNullOrEmpty()) { result = null; BuildLogger.LogException(new ArgumentException("Argument cannot be null or empty.", "taskList")); return(ReturnCode.Exception); } // Don't run if there are unsaved changes if (ValidationMethods.HasDirtyScenes()) { result = null; return(ReturnCode.UnsavedChanges); } ThreadingManager.WaitForOutstandingTasks(); BuildContext buildContext = new BuildContext(contextObjects); BuildLog buildLog = null; IBuildLogger logger; if (!buildContext.TryGetContextObject <IBuildLogger>(out logger)) { logger = buildLog = new BuildLog(); buildContext.SetContextObject(buildLog); } using (logger.ScopedStep(LogLevel.Info, "AssetDatabase.SaveAssets")) AssetDatabase.SaveAssets(); ReturnCode exitCode; result = new BundleBuildResults(); BuildCacheUtility.ClearCacheHashes(); using (var interfacesWrapper = new BuildInterfacesWrapper()) #if !CI_TESTRUNNER_PROJECT using (new SceneStateCleanup()) using (var progressTracker = new ProgressTracker()) #else using (var progressTracker = new ProgressLoggingTracker()) #endif using (var buildCache = new BuildCache(parameters.CacheServerHost, parameters.CacheServerPort)) { Directory.CreateDirectory(parameters.TempOutputFolder); Directory.CreateDirectory(parameters.ScriptOutputFolder); try { buildContext.SetContextObject(parameters); buildContext.SetContextObject(content); buildContext.SetContextObject(result); buildContext.SetContextObject(interfacesWrapper); buildContext.SetContextObject(progressTracker); buildContext.SetContextObject(buildCache); // If IDeterministicIdentifiers was passed in with contextObjects, don't add the default if (!buildContext.ContainsContextObject(typeof(IDeterministicIdentifiers))) { buildContext.SetContextObject(parameters.ContiguousBundles ? new PrefabPackedIdentifiers() : (IDeterministicIdentifiers) new Unity5PackedIdentifiers()); } buildContext.SetContextObject(new BuildDependencyData()); buildContext.SetContextObject(new BundleWriteData()); buildContext.SetContextObject(BuildCallbacks); buildCache.SetBuildLogger(logger); } catch (Exception e) { // Avoid throwing exceptions in here as we don't want them bubbling up to calling user code result = null; BuildLogger.LogException(e); return(ReturnCode.Exception); } exitCode = BuildTasksRunner.Validate(taskList, buildContext); if (exitCode >= ReturnCode.Success) #if SBP_PROFILER_ENABLE { exitCode = BuildTasksRunner.RunProfiled(taskList, buildContext); } #else { exitCode = BuildTasksRunner.Run(taskList, buildContext); } #endif if (Directory.Exists(parameters.TempOutputFolder)) { Directory.Delete(parameters.TempOutputFolder, true); } if (buildLog != null) { string buildLogPath = parameters.GetOutputFilePathForIdentifier("buildlogtep.json"); Directory.CreateDirectory(Path.GetDirectoryName(buildLogPath)); File.WriteAllText(parameters.GetOutputFilePathForIdentifier("buildlogtep.json"), buildLog.FormatForTraceEventProfiler()); } } long maximumCacheSize = ScriptableBuildPipeline.maximumCacheSize * BuildCache.k_BytesToGigaBytes; BuildCache.PruneCache_Background(maximumCacheSize); return(exitCode); }
internal static LegacyAssetBundleManifest 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 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); } return(new LegacyAssetBundleManifest(results)); }