docs.unity.cn

Addressables 1.21.14

    Show / Hide Table of Contents

    Start a build from a script

    To start a build from another script, call the AddressableAssetSettings.BuildPlayerContent method.

    Before starting the build, set the active Profile and the active build script. You can also set a different AddressableAssetSettings object than the default.

    BuildPlayerContent takes into consideration the following information when performing the build:

    • AddressableAssetSettingsDefaultObject
    • ActivePlayerDataBuilder
    • The addressables_content_state.bin file.

    Set the AddressableAssetSettings

    The settings defined by AddressableAssetSettings include the list of groups and the profile to use.

    To access the settings that displayed in the Editor (menu: Window > Asset Management > Addressables > Settings), use the static AddressableAssetSettingsDefaultObject.Settings property. However, if desired, you can use a different settings object for a build.

    To load a custom settings object in a build:

    
    static void getSettingsObject(string settingsAsset)
    {
        // This step is optional, you can also use the default settings:
        //settings = AddressableAssetSettingsDefaultObject.Settings;
    
        settings
            = AssetDatabase.LoadAssetAtPath<ScriptableObject>(settingsAsset)
                as AddressableAssetSettings;
    
        if (settings == null)
            Debug.LogError($"{settingsAsset} couldn't be found or isn't " +
                           $"a settings object.");
    }
    
    

    Set the active profile

    A build started with BuildContent uses the variable settings of the active profile. To set the active profile as part of your customized build script, assign the ID of the desired profile to the activeProfileId field of the AddressableAssetSettingsDefaultObject.Settings object.

    The AddressableAssetSettings object contains the list of profiles. Use the name of the desired profile to look up its ID value and then assign the ID to the activeProfileId variable:

    
    static void setProfile(string profile)
    {
        string profileId = settings.profileSettings.GetProfileId(profile);
        if (String.IsNullOrEmpty(profileId))
            Debug.LogWarning($"Couldn't find a profile named, {profile}, " +
                             $"using current profile instead.");
        else
            settings.activeProfileId = profileId;
    }
    
    

    Set the active build script

    The BuildContent method launches the build based on the current ActivePlayerDataBuilder setting. To use a specific build script, assign the index of the IDataBuilder object in the AddressableAssetSetting.DataBuilders list to the ActivePlayerDataBuilderIndex property.

    The build script must be a ScriptableObject that implements IDataBuilder and you must add it to the DataBuilders list in the AddressableAssetSettings instance. Once added to the list, use the standard List.IndexOf method to get the index of the object.

    
    static void setBuilder(IDataBuilder builder)
    {
        int index = settings.DataBuilders.IndexOf((ScriptableObject)builder);
    
        if (index > 0)
            settings.ActivePlayerDataBuilderIndex = index;
        else
            Debug.LogWarning($"{builder} must be added to the " +
                             $"DataBuilders list before it can be made " +
                             $"active. Using last run builder instead.");
    }
    
    

    Launch a build

    After setting the profile and builder to use, you can launch the build:

    
    static bool buildAddressableContent()
    {
        AddressableAssetSettings
            .BuildPlayerContent(out AddressablesPlayerBuildResult result);
        bool success = string.IsNullOrEmpty(result.Error);
    
        if (!success)
        {
            Debug.LogError("Addressables build error encountered: " + result.Error);
        }
    
        return success;
    }
    
    

    To check for success, use BuildPlayerContent(out AddressablesPlayerBuildResult result). result.Error contains any error message returned if the Addressables build failed. If string.IsNullOrEmpty(result.Error) is true, the build was successful.

    Example script to launch build

    The following example adds a couple of menu commands to the Window > Asset Management > Addressables menu in the Editor. The first command builds the Addressable content using the preset profile and build script. The second command builds the Addressable content, and, if it succeeds, builds the Player.

    If your build script makes setting changes that require a domain reload, you should run the build script using Unity command line options, instead of running it interactively in the Editor. Refer to Domain reloads for more information.

    
    #if UNITY_EDITOR
        using UnityEditor;
        using UnityEditor.AddressableAssets.Build;
        using UnityEditor.AddressableAssets.Settings;
        using System;
        using UnityEngine;
    
        internal class BuildLauncher
        {
            public static string build_script
                = "Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset";
    
            public static string settings_asset
                = "Assets/AddressableAssetsData/AddressableAssetSettings.asset";
    
            public static string profile_name = "Default";
            private static AddressableAssetSettings settings;
    
    
            static void getSettingsObject(string settingsAsset)
            {
                // This step is optional, you can also use the default settings:
                //settings = AddressableAssetSettingsDefaultObject.Settings;
    
                settings
                    = AssetDatabase.LoadAssetAtPath<ScriptableObject>(settingsAsset)
                        as AddressableAssetSettings;
    
                if (settings == null)
                    Debug.LogError($"{settingsAsset} couldn't be found or isn't " +
                                   $"a settings object.");
            }
    
    
    
            static void setProfile(string profile)
            {
                string profileId = settings.profileSettings.GetProfileId(profile);
                if (String.IsNullOrEmpty(profileId))
                    Debug.LogWarning($"Couldn't find a profile named, {profile}, " +
                                     $"using current profile instead.");
                else
                    settings.activeProfileId = profileId;
            }
    
    
    
            static void setBuilder(IDataBuilder builder)
            {
                int index = settings.DataBuilders.IndexOf((ScriptableObject)builder);
    
                if (index > 0)
                    settings.ActivePlayerDataBuilderIndex = index;
                else
                    Debug.LogWarning($"{builder} must be added to the " +
                                     $"DataBuilders list before it can be made " +
                                     $"active. Using last run builder instead.");
            }
    
    
    
            static bool buildAddressableContent()
            {
                AddressableAssetSettings
                    .BuildPlayerContent(out AddressablesPlayerBuildResult result);
                bool success = string.IsNullOrEmpty(result.Error);
    
                if (!success)
                {
                    Debug.LogError("Addressables build error encountered: " + result.Error);
                }
    
                return success;
            }
    
    
            [MenuItem("Window/Asset Management/Addressables/Build Addressables only")]
            public static bool BuildAddressables()
            {
                getSettingsObject(settings_asset);
                setProfile(profile_name);
                IDataBuilder builderScript
                    = AssetDatabase.LoadAssetAtPath<ScriptableObject>(build_script) as IDataBuilder;
    
                if (builderScript == null)
                {
                    Debug.LogError(build_script + " couldn't be found or isn't a build script.");
                    return false;
                }
    
                setBuilder(builderScript);
    
                return buildAddressableContent();
            }
    
            [MenuItem("Window/Asset Management/Addressables/Build Addressables and Player")]
            public static void BuildAddressablesAndPlayer()
            {
                bool contentBuildSucceeded = BuildAddressables();
    
                if (contentBuildSucceeded)
                {
                    var options = new BuildPlayerOptions();
                    BuildPlayerOptions playerSettings
                        = BuildPlayerWindow.DefaultBuildMethods.GetBuildPlayerOptions(options);
    
                    BuildPipeline.BuildPlayer(playerSettings);
                }
            }
        }
    #endif
    
    

    Domain reloads

    If your scripted build process involves changing settings that trigger a domain reload before it makes an Addressables build, then you should script such builds to use Unity's command line arguments rather than running a script in the Editor. These types of settings include:

    • Changing the defined compiler symbols
    • Changing platform target or target group

    When you run a script that triggers a domain reload interactively in the Editor, such as using a menu command, your Editor script finishes executing before the domain reload happens. Therefore, if you immediately start an Addressables build, both your code and imported assets are still in their original state. You must wait for the domain reload to complete before you start the content build.

    It's best practice to wait for the domain reload to finish when you run the build from the command line, because it can be difficult or impossible to carry out reliably in an interactive script.

    The following example script defines two functions that can be invoked when running Unity on the command line. The ChangeSettings example sets the specified define symbols. The BuildContentAndPlayer function runs the Addressables build and the Player build.

    
    #if UNITY_EDITOR
        using System;
        using UnityEditor;
        using UnityEditor.AddressableAssets;
        using UnityEditor.AddressableAssets.Build;
        using UnityEditor.AddressableAssets.Settings;
        using UnityEditor.Build.Reporting;
        using UnityEngine;
    
        internal class BatchBuild
        {
            public static string build_script
                = "Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset";
    
            public static string profile_name = "Default";
    
            public static void ChangeSettings()
            {
                string defines = "";
                string[] args = Environment.GetCommandLineArgs();
    
                foreach (var arg in args)
                    if (arg.StartsWith("-defines=", System.StringComparison.CurrentCulture))
                        defines = arg.Substring(("-defines=".Length));
    
                var buildSettings = EditorUserBuildSettings.selectedBuildTargetGroup;
                PlayerSettings.SetScriptingDefineSymbolsForGroup(buildSettings, defines);
            }
    
            public static void BuildContentAndPlayer()
            {
                AddressableAssetSettings settings
                    = AddressableAssetSettingsDefaultObject.Settings;
    
                settings.activeProfileId
                    = settings.profileSettings.GetProfileId(profile_name);
    
                IDataBuilder builder
                    = AssetDatabase.LoadAssetAtPath<ScriptableObject>(build_script) as IDataBuilder;
    
                settings.ActivePlayerDataBuilderIndex
                    = settings.DataBuilders.IndexOf((ScriptableObject)builder);
    
                AddressableAssetSettings.BuildPlayerContent(out AddressablesPlayerBuildResult result);
    
                if (!string.IsNullOrEmpty(result.Error))
                    throw new Exception(result.Error);
    
                BuildReport buildReport
                    = BuildPipeline.BuildPlayer(EditorBuildSettings.scenes,
                        "d:/build/winApp.exe", EditorUserBuildSettings.activeBuildTarget,
                        BuildOptions.None);
    
                if (buildReport.summary.result != BuildResult.Succeeded)
                    throw new Exception(buildReport.summary.ToString());
            }
        }
    #endif
    
    

    To call these functions, use Unity's command line arguments in a terminal or command prompt or in a shell script:

    D:\Unity\2020.3.0f1\Editor\Unity.exe -quit -batchMode -projectPath . -executeMethod BatchBuild.ChangeSettings -defines=FOO;BAR -buildTarget Android
    D:\Unity\2020.3.0f1\Editor\Unity.exe -quit -batchMode -projectPath . -executeMethod BatchBuild.BuildContentAndPlayer -buildTarget Android
    
    Note

    If you specify the platform target as a command line parameter, you can perform an Addressables build in the same command. However, if you wanted to change the platform in a script, you should do it in a separate command, such as the ChangeSettings function in this example.

    In This Article
    • Set the AddressableAssetSettings
    • Set the active profile
    • Set the active build script
    • Launch a build
      • Example script to launch build
    • Domain reloads
    Back to top Copyright © 2023 Unity Technologies — Terms of use
    Generated by DocFX
    on Monday, June 26, 2023