In this example below, I will demonstrate how to add new asset called "dog" to our AssetBundle named "animals" and build it then load it during run-time.
Setting Up Build Folders:
1. Select the asset such as image file. In this case, that's the "dog.jpeg" file. See the menu in the "Inspector" tab. Sometimes, the AssetBundle option it is hidden, drag it up to show it. See the animated gif below for how to do this. The default AssetBundle is "None". Click on the "None" option then go to the "New" option and create new AssetBundle and name it "animals"
2. Create a folder named
StreamingAssets in the Assets folder. This is the folder we are going to build the AssetBundle into. Spelling counts and it's case sensitive so make sure to name it correctly.
3. Create sub-folder in the
StreamingAssets folder to hold the AssetBundle. For this example, name this folder
AssetBundles so that you can use it to recognize what's in it.
4. Below is the build script.
A. Create a script named
ExportAssetBundles and put it in a folder named "Editor" in the Assets folder then copy the code below inside it:
public class ExportAssetBundles
static void ExportResource()
string folderName = "AssetBundles";
string filePath = Path.Combine(Application.streamingAssetsPath, folderName);
//Build for Windows platform
BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
//Uncomment to build for other platforms
//BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.iOS);
//BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.Android);
//BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.WebGL);
//BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX);
//Refresh the Project folder
B. Build your AssetBudle by going to Assets --> Build AssetBundle menu.
You should see the built AssetBundles inside the
Assets/StreamingAssets/AssetBundles directory. If not, refresh the Project tab.
Loading the AssetBundle during run-time:
5. When loading it,
Application.streamingAssetsPath should be used to access the
StreamingAssets folder. To access all the folders use,
Application.streamingAssetsPath + "/AssetBundle/" + assetbunlenameWithoutExtension;. The
AssetBundleRequest API are used to load the AssetBundle. Since this is an image,
Texture2D is passed to them. If using a prefab, pass
GameObject instead then instantiate it. See comment in code for where these changes should be made. It is recommended to use
Path.Combine to combine path names so the code below should use that instead.
Below is a simple loading function:
IEnumerator LoadAsset(string assetBundleName, string objectNameToLoad)
string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "AssetBundles");
filePath = System.IO.Path.Combine(filePath, assetBundleName);
//Load "animals" AssetBundle
var assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(filePath);
yield return assetBundleCreateRequest;
AssetBundle asseBundle = assetBundleCreateRequest.assetBundle;
//Load the "dog" Asset (Use Texture2D since it's a Texture. Use GameObject if prefab)
AssetBundleRequest asset = asseBundle.LoadAssetAsync<Texture2D>(objectNameToLoad);
yield return asset;
//Retrieve the object (Use Texture2D since it's a Texture. Use GameObject if prefab)
Texture2D loadedAsset = asset.asset as Texture2D;
//Do something with the loaded loadedAsset object (Load to RawImage for example)
image.texture = loadedAsset;
Things to before loading note:
A. Name of Assetbundle is
B. Name of the asset/object we want to load from the animals Assetbundle is
dog This is a simple jpg of a dog.
C. The loading is simple as this:
string nameOfAssetBundle = "animals";
string nameOfObjectToLoad = "dog";
public RawImage image;