Quick answer: Mounting the pak makes the files readable, but the asset registry doesn’t auto-discover them. Load the registry from the pak, or use the chunk-based loading API that does it for you.

DLC ships as a .pak. The game mounts it successfully but LoadObject on an asset inside returns null — the asset registry doesn’t list it.

Mount Is Step One

FCoreDelegates::OnMountPak.Execute(PakPath, 0, nullptr);

This makes files in the pak readable through Unreal’s VFS. But the asset registry — the index Unreal uses for “does this asset exist” — isn’t automatically refreshed.

Load the Registry

IAssetRegistry& Registry = FAssetRegistryModule::GetRegistry();
TArray<FString> PakDirs = { TEXT("/Game/DLC/") };
Registry.ScanPathsSynchronous(PakDirs, true);

Or load the registry blob shipped inside the pak (a packaged .bin file). The engine now knows what lives in the pak and LoadObject can find it.

ChunkID for Async Streaming

If you used Chunk-based packaging, the proper API is UAssetManager::LoadPrimaryAssets or the chunk-download flow — it mounts and refreshes the registry for you. Recommended over manual mount + scan.

Path Match

The asset’s game-relative path inside the pak (e.g. /Game/DLC/Maps/Bonus) must match how you load it. Check with FPaths::FileExists on the mounted path before debugging higher up.

Verifying

Mount the DLC pak. Loading assets by path succeeds. Asset registry queries (FindAssetData) return entries from the pak.

“Mount makes files readable; the asset registry has to learn about them separately.”

For shipping DLC, lean on UAssetManager and Primary Data Assets — the chunk APIs handle mount + registry in one call.