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.
To assign a given Asset to an AssetBundle, follow these steps:
/
. For example, use the AssetBundle name environment/forest
to create a bundle named forest
under an environment
sub-folderNote: 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.
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.
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.
AssetBundles can be distributed in several ways:
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.