Quick answer: Place mods in Content/Paks/~mods/ for auto-mount. For runtime mounting use FPakPlatformFile::MountPakFile with a priority. Mod must be cooked against the same engine version and project as the host.
Here is how to fix Unreal user mods packaged as .pak files that do not load in shipping builds. Auto-mount has specific path conventions; manual mount needs the right API and priority.
The Symptom
Mod .pak placed in user-discoverable folder. Game starts, mod content not present. No errors in player log.
What Causes This
Wrong path. Auto-mount looks at Content/Paks/~mods/. Other folders are not scanned by default.
Version mismatch. Mod cooked against UE 5.3 will not mount in 5.4 host.
Priority too low. Mod assets need higher priority than base assets to override.
Encryption mismatch. If host uses encrypted paks but mod does not, or vice versa.
The Fix
Step 1: Use the standard auto-mount path. Tell players to place mods in <GameDir>/Content/Paks/~mods/ (note the tilde). Auto-mount scans this folder at engine startup.
Step 2: Manual mount in C++ for custom layouts.
void UMyModSubsystem::LoadMod(const FString& PakPath)
{
FPakPlatformFile* PakFile = (FPakPlatformFile*)FPlatformFileManager::Get().FindPlatformFile(TEXT("PakFile"));
if (!PakFile)
{
UE_LOG(LogTemp, Warning, TEXT("PakFile platform missing"));
return;
}
if (PakFile->Mount(*PakPath, /*PakOrder*/ 100))
{
FCoreDelegates::OnMountPak.Broadcast(*PakPath, 100, nullptr);
UE_LOG(LogTemp, Log, TEXT("Mounted: %s"), *PakPath);
}
}
Priority 100 typically beats default game paks (priority 0–10).
Step 3: Verify version compatibility. Provide a mod SDK matching your engine version. Document required UE version in mod readmes. Reject mods packaged for other versions.
Step 4: Handle encryption consistently. If host uses encryption, distribute the encryption key with the SDK so modders can cook compatible paks. Or build host without encryption for mod-friendly distribution.
Step 5: Refresh asset registry after mount.
IAssetRegistry& AR = FAssetRegistryModule::GetRegistry();
AR.SearchAllAssets(/*bSync*/ true);
Newly mounted paks add assets; force a registry rescan so they are visible.
“~mods folder for auto-mount. Manual mount with priority for custom paths. Same engine version always.”
Related Issues
For asset registry empty, see AssetRegistry Empty. For data asset cook, see Data Asset Soft Refs.
~mods path. Manual mount with priority. Asset registry refresh. Mods load.