Quick answer: Read the AssetBundleManifest, load all dependencies first, then the target bundle. Or use Addressables which manages this automatically.

A character bundle loads cleanly but the model renders pink. The shader bundle wasn’t loaded as a prerequisite. AssetBundles don’t auto-resolve dependencies.

Load Manifest First

var manifestBundle = AssetBundle.LoadFromFile("BundlesRoot");
var manifest = manifestBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

The build output includes a top-level “BundlesRoot” bundle with the manifest. Load it first.

Resolve Dependencies

string[] deps = manifest.GetAllDependencies("character.bundle");
foreach (var dep in deps)
{
    AssetBundle.LoadFromFile($"Bundles/{dep}");
}
var characterBundle = AssetBundle.LoadFromFile("Bundles/character.bundle");

Get all transitive dependencies, load each, then load the target bundle. Order matters.

Async Variant

var loadOps = deps.Select(dep => AssetBundle.LoadFromFileAsync(...)).ToArray();
await Task.WhenAll(loadOps.Select(op => op.ToTask()));

Parallel load reduces total latency.

Reference Counting

Dependencies may be shared. Track load count per bundle; unload only when count hits zero. Or accept that bundles stay resident for the session.

Migrate to Addressables

Addressables wraps the entire dependency dance:

var handle = Addressables.LoadAssetAsync<GameObject>("characterPrefab");
await handle.Task;

Dependencies resolved automatically. Strongly recommended for new projects.

Verifying

Load character; render correctly. No pink. Each dependency confirmed loaded via manifest tracking.

“Manifest tells you what’s needed. Load it first or use Addressables.”

For LiveOps content (DLC, events), Addressables’ remote catalog system makes shipping new bundles dramatically easier than manual bundle management.