Version: 2023.1
Language : English
AssetBundles
Preparing Assets for AssetBundles

AssetBundle workflow

To get started with AssetBundles, follow these steps. More detailed information about each piece of the workflow can be found in the other pages in this section of documentation.

Note: This section describes the creation of AssetBundles using the built-in BuildPipeline.BuildAssetBundles() API. A recommended, and more user friendly, alternative is to use the Addressables package.

Assigning Assets to AssetBundles

To assign a given Asset to an AssetBundle, follow these steps:

  1. Select the Asset you want to assign to a bundle from your Project View.
  2. Examine the object in the InspectorA Unity window that displays information about the currently selected GameObject, asset or project settings, allowing you to inspect and edit the values. More info
    See in Glossary
    .
  3. At the bottom of the Inspector, there is a section to assign AssetBundles and Variants. Use the left-hand drop down to assign the AssetBundle, and the right-hand drop down to assign the variant.
  4. Click None on the left-hand drop to reveal the currently registered AssetBundle names.
  5. Click New to create a new AssetBundle
  6. Type in the desired AssetBundle name. Note: AssetBundle names support a type of folder structure depending on what you type. To add sub-folders, separate folder names by a /. For example, use the AssetBundle name environment/forest to create a bundle named forest under an environment sub-folder
  7. Once you’ve selected or created an AssetBundle name, you can repeat this process for the right hand drop down to assign or create a Variant name, if you desire. Variant names are not required to build the AssetBundles

Note: In the Inspector you can assign an AssetBundle to a folder in your Project. By default, all Assets in that folder are assigned to the same AssetBundle as the folder. The AssetBundle assignments for individual Assets takes precedence, however.

To read more information on AssetBundle assignments and accompanying strategies, see documentation on Preparing Assets for AssetBundles.

Build the AssetBundles

Create a folder called Editor in the Assets folders, and place a script with the following contents in the folder:

using UnityEditor;
using System.IO;

public class CreateAssetBundles
{
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string assetBundleDirectory = "Assets/AssetBundles";
        if(!Directory.Exists(assetBundleDirectory))
            Directory.CreateDirectory(assetBundleDirectory);

        BuildPipeline.BuildAssetBundles(assetBundleDirectory, 
                                        BuildAssetBundleOptions.None, 
                                        BuildTarget.StandaloneWindows);
    }
}

This script creates a menu item at the bottom of the Assets menu called Build AssetBundles. When you click Build AssetBundles the BuildAllAssetBundles() function is called. A progress bar appears while the build takes all the Assets you labeled with an AssetBundle name and uses them to populate AssetBundles at the path that assetBundleDirectory defines.

Let’s take a closer look at the arguments passed to BuildPipeline.BuildAssetBundles:

assetBundleDirectory: This is the directory that the AssetBundles will be output to, e.g. “Assets/AssetBundles” within the current Unity project. The folder does not need to be inside the Assets folder, you can change this to any output directory you desire. Notice how our script creates the folder on demand if it does not exist yet.

BuildAssetBundleOptions.None: This is the default value for the build options argument. You can use this argument to specify one or more flags to enable a variety of optional behaviours. For example, this argument controls the choice of compressionA method of storing data that reduces the amount of storage space it requires. See Texture Compression, Animation Compression, Audio Compression, Build Compression.
See in Glossary
algorithm, see AssetBundle compression. See BuildAssetBundleOptions for a full listing of the available options.

BuildTarget.StandaloneWindows: Here we’re telling the build pipeline which target platform we are going to be using these AssetBundles for. You can find a list of the available build targets in the Scripting API Reference for BuildTarget. Alternatively, rather than hardcoding your build target you could call EditorUserBuildSettings.activeBuildTarget, which return the platform currently selected in the Build Settings Window.

Using a Script to Define AssetBundles Contents

The example above describes how to use the Inspector to assign assets to AssetBundles. You can also assign assets to AssetBundles in code, using a signature of BuildPipeline.BuildAssetBundles that accepts an array of AssetBundleBuild structures. If you use this technique, the data you pass in takes priority, and any assignments to AssetBundles made in the Inspector are ignored.

Downloading and Loading AssetBundles and Assets

AssetBundles can be distributed in several ways:

  • Locating the files inside the StreamingAssets folder and including them with your Player build.
  • Hosted by a web service such as Unity’s Cloud Content Delivery and downloaded using UnityWebRequestAssetBundle.
  • Distributed by your own download or installation code. This approach takes more development work but does give flexibility to completely control aspects like compression, caching, patching and validation prior to loading the file using Unity APIs.

Depending how the files are distributed you should either use AssetBundle.Load APIs or UnityWebRequestAssetBundle to load an AssetBundle and access the AssetBundle object in your runtime code.

From the AssetBundle object, you call one of the LoadAsset methods. For example, LoadAsset<T>(string) which takes the type, T, of the asset you’re attempting to load and the name of the Asset (typically its path). You can use the returned object just like any object inside of Unity. For example, if you load a prefab then LoadAsset will return the prefab’s root GameObject, which you can then instantiate into your current scene by calling Instantiate().

You can reclaim memory used by a loaded AssetBundle by calling AssetBundle.Unload(bool) or AssetBundle.UnloadAsync(bool).

For more information on APIs that load and unload AssetBundles, see documentation on Using AssetBundles Natively.

AssetBundles
Preparing Assets for AssetBundles