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.