public static BuildPipelineCodes Build(BuildInput input, BuildSettings settings, out BuildDependencyInformation buildInfo, bool useCache = false, BuildProgressTracker progressTracker = null)
        {
            buildInfo = null;

            // Rebuild sprite atlas cache for correct dependency calculation & writing
            var spriteCacher = new SpriteAtlasCacher(useCache, progressTracker);
            var exitCode = spriteCacher.Convert(settings.target);
            if (exitCode < BuildPipelineCodes.Success)
                return exitCode;

            // Generate dependency information for all assets in BuildInput
            var buildInputDependency = new BuildInputDependency(useCache, progressTracker);
            exitCode = buildInputDependency.Convert(input, settings, out buildInfo);
            if (exitCode < BuildPipelineCodes.Success)
                return exitCode;

            return exitCode;
        }
示例#2
0
        internal static AssetBundleManifest BuildAssetBundles_Internal(string outputPath, BuildInput buildInput, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform)
        {
            var playerSettings = PlayerBuildPipeline.GeneratePlayerBuildSettings(targetPlatform);
            ScriptCompilationResult scriptResults;
            var errorCode = PlayerBuildPipeline.BuildPlayerScripts(playerSettings, out scriptResults);

            if (errorCode < BuildPipelineCodes.Success)
            {
                return(null);
            }

            var bundleSettings = BundleBuildPipeline.GenerateBundleBuildSettings(scriptResults.typeDB, targetPlatform);

            BuildCompression compression = BuildCompression.DefaultLZMA;

            if ((assetBundleOptions & BuildAssetBundleOptions.ChunkBasedCompression) != 0)
            {
                compression = BuildCompression.DefaultLZ4;
            }
            else if ((assetBundleOptions & BuildAssetBundleOptions.UncompressedAssetBundle) != 0)
            {
                compression = BuildCompression.DefaultUncompressed;
            }

            var useCache = (assetBundleOptions & BuildAssetBundleOptions.ForceRebuildAssetBundle) == 0;

            BundleBuildResult result;

            errorCode = BundleBuildPipeline.BuildAssetBundles(buildInput, bundleSettings, compression, outputPath, out result, useCache);
            if (errorCode < BuildPipelineCodes.Success)
            {
                return(null);
            }

            // TODO: Unity 5 Manifest
            return(null);
        }
 public static bool GenerateBuildInput(this AddressableAssetSettings settings, out BuildInput input)
 {
     return(new AddressableAssetPacker().Convert(settings.GetEntries(), out input, false));
 }
        public static BuildPipelineCodes BuildAssetBundles(BuildInput input, BuildSettings settings, BuildCompression compression, string outputFolder, out BuildResultInfo result, object callbackUserData = null, bool useCache = true)
        {
            var buildTimer = new Stopwatch();

            buildTimer.Start();

            if (ProjectValidator.HasDirtyScenes())
            {
                result = new BuildResultInfo();
                buildTimer.Stop();
                BuildLogger.LogError("Build Asset Bundles failed in: {0:c}. Error: {1}.", buildTimer.Elapsed, BuildPipelineCodes.UnsavedChanges);
                return(BuildPipelineCodes.UnsavedChanges);
            }

            var exitCode = BuildPipelineCodes.Success;

            result = new BuildResultInfo();

            AssetDatabase.SaveAssets();

            // TODO: Until new AssetDatabaseV2 is online, we need to switch platforms
            EditorUserBuildSettings.SwitchActiveBuildTarget(settings.group, settings.target);

            var stepCount = BundleDependencyStep.StepCount + BundlePackingStep.StepCount + BundleWritingStep.StepCount;

            using (var progressTracker = new BuildProgressTracker(stepCount))
            {
                using (var buildCleanup = new BuildStateCleanup(true, kTempBundleBuildPath))
                {
                    BuildDependencyInfo buildInfo;
                    exitCode = BundleDependencyStep.Build(input, settings, out buildInfo, useCache, progressTracker);
                    if (exitCode < BuildPipelineCodes.Success)
                    {
                        return(exitCode);
                    }

                    if (PostBuildDependency != null)
                    {
                        exitCode = PostBuildDependency.Invoke(buildInfo, callbackUserData);
                        if (exitCode < BuildPipelineCodes.Success)
                        {
                            return(exitCode);
                        }
                    }

                    BuildWriteInfo writeInfo;
                    exitCode = BundlePackingStep.Build(buildInfo, out writeInfo, useCache, progressTracker);
                    if (exitCode < BuildPipelineCodes.Success)
                    {
                        return(exitCode);
                    }

                    if (PostBuildPacking != null)
                    {
                        exitCode = PostBuildPacking.Invoke(buildInfo, writeInfo, callbackUserData);
                        if (exitCode < BuildPipelineCodes.Success)
                        {
                            return(exitCode);
                        }
                    }

                    exitCode = BundleWritingStep.Build(settings, compression, outputFolder, buildInfo, writeInfo, out result, useCache, progressTracker);
                    if (exitCode < BuildPipelineCodes.Success)
                    {
                        return(exitCode);
                    }

                    if (PostBuildWriting != null)
                    {
                        exitCode = PostBuildWriting.Invoke(buildInfo, writeInfo, result, callbackUserData);
                        if (exitCode < BuildPipelineCodes.Success)
                        {
                            return(exitCode);
                        }
                    }
                }
            }

            buildTimer.Stop();
            if (exitCode >= BuildPipelineCodes.Success)
            {
                BuildLogger.Log("Build Asset Bundles successful in: {0:c}", buildTimer.Elapsed);
            }
            else if (exitCode == BuildPipelineCodes.Canceled)
            {
                BuildLogger.LogWarning("Build Asset Bundles canceled in: {0:c}", buildTimer.Elapsed);
            }
            else
            {
                BuildLogger.LogError("Build Asset Bundles failed in: {0:c}. Error: {1}.", buildTimer.Elapsed, exitCode);
            }

            return(exitCode);
        }
        public static BuildCommandSet GenerateBuildCommandSet(BuildInput input, BuildSettings settings)
        {
            // Rebuild sprite atlas cache for correct dependency calculation
            Packer.RebuildAtlasCacheIfNeeded(settings.target, true, Packer.Execution.Normal);

            // Need to specal case sprites as we only want to include the source texutre in certain situations
            m_SpriteMap.Clear();

            // Create commands array matching the size of the input
            var commandSet = new BuildCommandSet();

            commandSet.commands = new BuildCommandSet.Command[input.definitions.Length];
            for (var i = 0; i < input.definitions.Length; ++i)
            {
                var definition = input.definitions[i];

                // Populate each command from asset bundle definition
                var command = new BuildCommandSet.Command();
                command.assetBundleName = definition.assetBundleName;
                command.explicitAssets  = new BuildCommandSet.AssetLoadInfo[definition.explicitAssets.Length];

                // Fill out asset load info and references for each asset in the definition
                var allObjects = new HashSet <ObjectIdentifier>();
                for (var j = 0; j < definition.explicitAssets.Length; ++j)
                {
                    var explicitAsset = new BuildCommandSet.AssetLoadInfo();
                    explicitAsset.asset             = definition.explicitAssets[j];
                    explicitAsset.path              = AssetDatabase.GUIDToAssetPath(explicitAsset.asset.ToString());
                    explicitAsset.includedObjects   = AssetBundleBuildInterface.GetObjectIdentifiersInAsset(definition.explicitAssets[j]);
                    explicitAsset.referencedObjects = AssetBundleBuildInterface.GetPlayerDependenciesForObjects(explicitAsset.includedObjects);

                    // Is this asset a sprite?
                    var type = AssetDatabase.GetMainAssetTypeAtPath(explicitAsset.path);
                    if (type == typeof(Texture2D) && explicitAsset.referencedObjects.Length == 1)
                    {
                        // Source texture should always be the first included object, atlas should always be the first referenced object
                        m_SpriteMap[explicitAsset.referencedObjects[0].guid] = new StriteTextures(explicitAsset.includedObjects[0], explicitAsset.referencedObjects[0], command.assetBundleName);
                    }

                    command.explicitAssets[j] = explicitAsset;
                    allObjects.UnionWith(explicitAsset.includedObjects);
                    allObjects.UnionWith(explicitAsset.referencedObjects);
                }

                command.assetBundleObjects = allObjects.ToArray();
                commandSet.commands[i]     = command;
            }

            // TODO: Debug printing
            DebugPrintCommandSet(ref commandSet);

            // At this point, We have generated fully self contained asset bundles with 0 dependencies.
            // Default implementation is to reduce duplication of objects by declaring dependencies to other asset
            //    bundles if that other asset bundle has an explicit asset declared that contains the objects needed
            // We also remove any built in unity objects as they are built with the player (We may want to change this part in the future)
            CalculateAssetBundleBuildDependencies(ref commandSet);
            // Note: I may, or may not feel dirty doing mutable things to what otherwise should be immutable struct

            // TODO: Debug printing
            DebugPrintCommandSet(ref commandSet);

            return(commandSet);
        }