Search Unity

Building player content based on groups

Discussion in 'Addressables' started by Brad-Newman, Jan 2, 2020.

  1. Brad-Newman

    Brad-Newman

    Joined:
    Feb 7, 2013
    Posts:
    185
    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.
     
  2. Brad-Newman

    Brad-Newman

    Joined:
    Feb 7, 2013
    Posts:
    185
    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
    Code (CSharp):
    1.  
    2. using UnityEditor.AddressableAssets.Build;
    3. using UnityEditor.AddressableAssets.Build.DataBuilders;
    4. using UnityEditor.AddressableAssets.Settings;
    5. using UnityEngine;
    6.  
    7. [CreateAssetMenu(fileName = "Assets/AddressableAssetsData/DataBuilders/BuildKioskData.asset", menuName = "Addressables/Custom Build/BuildKioskData")]
    8. public class BuildKioskData : BuildScriptPackedMode
    9. {
    10.     CustomBuilds.Devices device = CustomBuilds.Devices.None;
    11.  
    12.     public override string Name
    13.     {
    14.         get { return "Build Kiosk Data"; }
    15.     }
    16.  
    17.     protected override TResult BuildDataImplementation<TResult>(AddressablesDataBuilderInput context)
    18.     {
    19.         device = CustomBuilds.Device;
    20.         Logger.Log("Building addressables data for device: " + device);
    21.         var result = base.BuildDataImplementation<TResult>(context); //Eventually calls ProcessGroup
    22.         AddressableAssetSettings settings = context.AddressableSettings;
    23.        
    24.         return result;
    25.     }
    26.  
    27.     protected override string ProcessGroup(AddressableAssetGroup assetGroup, AddressableAssetsBuildContext aaContext)
    28.     {
    29.         if (assetGroup.Name == "Built In Data" || assetGroup.Name == "Default Local Group")
    30.         {
    31.             Logger.Log("Processing assetGroup: " + assetGroup.Name);
    32.             return base.ProcessGroup(assetGroup, aaContext);
    33.         }
    34.         else
    35.         {
    36.             if(device == CustomBuilds.Devices.None)
    37.             {
    38.                 Logger.Log("Processing assetGroup: " + assetGroup.Name);
    39.                 return base.ProcessGroup(assetGroup, aaContext);
    40.             }
    41.             else if (device == CustomBuilds.Devices.Pico)
    42.             {
    43.                 if (assetGroup.Name == "clientvideos")
    44.                 {
    45.                     Logger.Log("Processing assetGroup: " + assetGroup.Name);
    46.                     return base.ProcessGroup(assetGroup, aaContext);
    47.                 }
    48.                 else
    49.                 {
    50.                     //Skip group
    51.                     return base.ProcessGroup(null, aaContext);
    52.                 }
    53.             }
    54.             else if (device == CustomBuilds.Devices.Tablet)
    55.             {
    56.                 if (assetGroup.Name == "thumbnails" || assetGroup.Name == "servervideos")
    57.                 {
    58.                     Logger.Log("Processing assetGroup: " + assetGroup.Name);
    59.                     return base.ProcessGroup(assetGroup, aaContext);
    60.                 }
    61.                 else
    62.                 {
    63.                     //Skip group
    64.                     return base.ProcessGroup(null, aaContext);
    65.                 }
    66.             }
    67.         }
    68.        
    69.         return base.ProcessGroup(null, null);
    70.     }
    71. }
    72.  
    73.  
    CustomBuilds.cs
    Code (CSharp):
    1.  
    2. using UnityEngine;
    3. using UnityEditor;
    4. using UnityEditor.AddressableAssets.Settings;
    5.  
    6. public class CustomBuilds : EditorWindow
    7. {
    8.     private static BuildKioskData kioskBuildData;
    9.  
    10.     public enum Devices
    11.     {
    12.         None,
    13.         Pico,
    14.         Tablet
    15.     }
    16.  
    17.     public static Devices Device { get; private set; } = Devices.None;
    18.  
    19.     [MenuItem("Kiosk/Build Window")]
    20.     public static void ShowWindow()
    21.     {
    22.         GetWindow(typeof(CustomBuilds));
    23.     }
    24.  
    25.     public void OnGUI()
    26.     {
    27.         GUILayout.Label("Build APK", EditorStyles.boldLabel);
    28.         if(GUI.Button(new Rect(10,30,100,20),"Pico"))
    29.         {
    30.             BuildPico();
    31.         }
    32.  
    33.         if (GUI.Button(new Rect(10, 60, 100, 20), "Tablet"))
    34.         {
    35.             BuildTablet();
    36.         }
    37.     }
    38.  
    39.     public static void BuildPico()
    40.     {
    41.         SetupPico();
    42.  
    43.         //Build Addressables
    44.         AddressableAssetSettings.CleanPlayerContent();
    45.         AddressableAssetSettings.BuildPlayerContent();
    46.  
    47.         //Build Options
    48.         BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions
    49.         {
    50.             scenes = new[] { "Assets/Scenes/Client.unity" },
    51.             locationPathName = "../../../ Builds/Client.apk",
    52.             target = BuildTarget.Android,
    53.             targetGroup = BuildTargetGroup.Android
    54.         };
    55.         BuildOptions buildOptions = BuildOptions.UncompressedAssetBundle | BuildOptions.ConnectToHost | BuildOptions.AllowDebugging | BuildOptions.AutoRunPlayer | BuildOptions.Development;
    56.         buildPlayerOptions.options = buildOptions;
    57.  
    58.         BuildPipeline.BuildPlayer(buildPlayerOptions);
    59.     }
    60.  
    61.     public static void BuildTablet()
    62.     {
    63.         Device = Devices.Tablet;
    64.         SetupTablet();
    65.  
    66.         //Build Addressables
    67.         AddressableAssetSettings.CleanPlayerContent();
    68.         AddressableAssetSettings.BuildPlayerContent();
    69.  
    70.         //Build Options
    71.         BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions
    72.         {
    73.             scenes = new[] { "Assets/Scenes/Server.unity" },
    74.             locationPathName = "../../../ Builds/Server.apk",
    75.             target = BuildTarget.Android,
    76.             targetGroup = BuildTargetGroup.Android
    77.         };
    78.         BuildOptions buildOptions = BuildOptions.UncompressedAssetBundle | BuildOptions.ConnectToHost | BuildOptions.AllowDebugging | BuildOptions.AutoRunPlayer | BuildOptions.Development;
    79.         buildPlayerOptions.options = buildOptions;
    80.  
    81.         BuildPipeline.BuildPlayer(buildPlayerOptions);
    82.     }
    83.  
    84.     public static void SetupPico()
    85.     {
    86.         Device = Devices.Pico;
    87.         Logger.Log("Device set to: " + Device);
    88.  
    89.         //Player Settings
    90.         PlayerSettings.virtualRealitySupported = true;
    91.  
    92.         //Android Manifest
    93.         AssetDatabase.DeleteAsset("Assets/Plugins/Android/AndroidManifest.xml");
    94.         AssetDatabase.CopyAsset("Assets/Plugins/Android/AndroidManifest_Pico.xml", "Assets/Plugins/Android/AndroidManifest.xml");
    95.     }
    96.  
    97.     public static void SetupTablet()
    98.     {
    99.         Device = Devices.Tablet;
    100.         Logger.Log("Device set to: " + Device);
    101.  
    102.         //Player Settings
    103.         PlayerSettings.virtualRealitySupported = false;
    104.  
    105.         //Android Manifest
    106.         AssetDatabase.DeleteAsset("Assets/Plugins/Android/AndroidManifest.xml");
    107.         AssetDatabase.CopyAsset("Assets/Plugins/Android/AndroidManifest_Tablet.xml", "Assets/Plugins/Android/AndroidManifest.xml");
    108.     }
    109. }
    110. }
     
    Last edited: Jan 7, 2020