Building player content based on groups

How can you build different player content based on the Addressable group? I have two addressable groups in my project, each for a different device type (Android Tablet vs. Android VR Headset). I only want to build the content from an Addressables group that is necessary for a particular device.

FIgured it out. You can check for the asset group name in a scriptable object by deriving from BuildScriptPackedMode and checking the asset group name in

protected override string ProcessGroup(AddressableAssetGroup assetGroup, AddressableAssetsBuildContext aaContext)

Here is my code. Don’t have time to simplify the example, so there’s a bunch of stuff specific to my case, but posting here in case it’s helpful to someone:

BuildKioskData.cs

using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Build.DataBuilders;
using UnityEditor.AddressableAssets.Settings;
using UnityEngine;

[CreateAssetMenu(fileName = "Assets/AddressableAssetsData/DataBuilders/BuildKioskData.asset", menuName = "Addressables/Custom Build/BuildKioskData")]
public class BuildKioskData : BuildScriptPackedMode
{
    CustomBuilds.Devices device = CustomBuilds.Devices.None;

    public override string Name
    {
        get { return "Build Kiosk Data"; }
    }

    protected override TResult BuildDataImplementation<TResult>(AddressablesDataBuilderInput context)
    {
        device = CustomBuilds.Device;
        Logger.Log("Building addressables data for device: " + device);
        var result = base.BuildDataImplementation<TResult>(context); //Eventually calls ProcessGroup
        AddressableAssetSettings settings = context.AddressableSettings;
       
        return result;
    }

    protected override string ProcessGroup(AddressableAssetGroup assetGroup, AddressableAssetsBuildContext aaContext)
    {
        if (assetGroup.Name == "Built In Data" || assetGroup.Name == "Default Local Group")
        {
            Logger.Log("Processing assetGroup: " + assetGroup.Name);
            return base.ProcessGroup(assetGroup, aaContext);
        }
        else
        {
            if(device == CustomBuilds.Devices.None)
            {
                Logger.Log("Processing assetGroup: " + assetGroup.Name);
                return base.ProcessGroup(assetGroup, aaContext);
            }
            else if (device == CustomBuilds.Devices.Pico)
            {
                if (assetGroup.Name == "clientvideos")
                {
                    Logger.Log("Processing assetGroup: " + assetGroup.Name);
                    return base.ProcessGroup(assetGroup, aaContext);
                }
                else
                {
                    //Skip group
                    return base.ProcessGroup(null, aaContext);
                }
            }
            else if (device == CustomBuilds.Devices.Tablet)
            {
                if (assetGroup.Name == "thumbnails" || assetGroup.Name == "servervideos")
                {
                    Logger.Log("Processing assetGroup: " + assetGroup.Name);
                    return base.ProcessGroup(assetGroup, aaContext);
                }
                else
                {
                    //Skip group
                    return base.ProcessGroup(null, aaContext);
                }
            }
        }
       
        return base.ProcessGroup(null, null);
    }
}

CustomBuilds.cs

using UnityEngine;
using UnityEditor;
using UnityEditor.AddressableAssets.Settings;

public class CustomBuilds : EditorWindow
{
    private static BuildKioskData kioskBuildData;

    public enum Devices
    {
        None,
        Pico,
        Tablet
    }

    public static Devices Device { get; private set; } = Devices.None;

    [MenuItem("Kiosk/Build Window")]
    public static void ShowWindow()
    {
        GetWindow(typeof(CustomBuilds));
    }

    public void OnGUI()
    {
        GUILayout.Label("Build APK", EditorStyles.boldLabel);
        if(GUI.Button(new Rect(10,30,100,20),"Pico"))
        {
            BuildPico();
        }

        if (GUI.Button(new Rect(10, 60, 100, 20), "Tablet"))
        {
            BuildTablet();
        }
    }

    public static void BuildPico()
    {
        SetupPico();

        //Build Addressables
        AddressableAssetSettings.CleanPlayerContent();
        AddressableAssetSettings.BuildPlayerContent();

        //Build Options
        BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions
        {
            scenes = new[] { "Assets/Scenes/Client.unity" },
            locationPathName = "../../../ Builds/Client.apk",
            target = BuildTarget.Android,
            targetGroup = BuildTargetGroup.Android
        };
        BuildOptions buildOptions = BuildOptions.UncompressedAssetBundle | BuildOptions.ConnectToHost | BuildOptions.AllowDebugging | BuildOptions.AutoRunPlayer | BuildOptions.Development;
        buildPlayerOptions.options = buildOptions;

        BuildPipeline.BuildPlayer(buildPlayerOptions);
    }

    public static void BuildTablet()
    {
        Device = Devices.Tablet;
        SetupTablet();

        //Build Addressables
        AddressableAssetSettings.CleanPlayerContent();
        AddressableAssetSettings.BuildPlayerContent();

        //Build Options
        BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions
        {
            scenes = new[] { "Assets/Scenes/Server.unity" },
            locationPathName = "../../../ Builds/Server.apk",
            target = BuildTarget.Android,
            targetGroup = BuildTargetGroup.Android
        };
        BuildOptions buildOptions = BuildOptions.UncompressedAssetBundle | BuildOptions.ConnectToHost | BuildOptions.AllowDebugging | BuildOptions.AutoRunPlayer | BuildOptions.Development;
        buildPlayerOptions.options = buildOptions;

        BuildPipeline.BuildPlayer(buildPlayerOptions);
    }

    public static void SetupPico()
    {
        Device = Devices.Pico;
        Logger.Log("Device set to: " + Device);

        //Player Settings
        PlayerSettings.virtualRealitySupported = true;

        //Android Manifest
        AssetDatabase.DeleteAsset("Assets/Plugins/Android/AndroidManifest.xml");
        AssetDatabase.CopyAsset("Assets/Plugins/Android/AndroidManifest_Pico.xml", "Assets/Plugins/Android/AndroidManifest.xml");
    }

    public static void SetupTablet()
    {
        Device = Devices.Tablet;
        Logger.Log("Device set to: " + Device);

        //Player Settings
        PlayerSettings.virtualRealitySupported = false;

        //Android Manifest
        AssetDatabase.DeleteAsset("Assets/Plugins/Android/AndroidManifest.xml");
        AssetDatabase.CopyAsset("Assets/Plugins/Android/AndroidManifest_Tablet.xml", "Assets/Plugins/Android/AndroidManifest.xml");
    }
}
}