Pak File Workflow Tutorial
This guide explains how to use UnrealCV’s Pak file management system for dynamic asset loading at runtime.
Overview
Pak files are UE’s archive format for shipping assets separately from the main application. UnrealCV’s Pak system enables:
Runtime asset loading without recompilation
Dynamic asset pools for dataset generation
Modular content management
On-demand asset registration
Key Components:
UPakMountBPLib- Blueprint library for Pak operationsFPakHandler- TCP command handlerFAssetPoolManager- Asset registration and retrieval
Workflow
::
Pak File Mount Scan Register Asset Pool ──────── ────── ──────── ────── ──────── ────── ──────────── ───────────── Create ─────> Mount ─────> Scan ─────> Register ─────> Available for (.pak) Pak Assets to Pool Spawning
Create Pak files via UE Editor packaging
Mount Pak at runtime
Scan for assets in the mounted Pak
Register to AssetPoolManager
Spawn assets via SceneCompositionBPLib
Creating Pak Files
Editor Method:
Open Package Project dialog: File > Package Project > Pak
Select output directory
Name the Pak file (e.g.,
Assets.pak)Result:
Assets_Win64.pak
Python/Automation Method:
Use UE’s automation tools for batch Pak creation.
Mounting Pak Files
Blueprint API:
.. code-block:: cpp
UFUNCTION(BlueprintCallable, Category = “UnrealCV|PakMount”) static bool MountPakFile(const FString& PakFilePath, int32 PakOrder = 0);
Example:
.. code-block:: cpp
bool bMounted = UPakMountBPLib::MountPakFile( TEXT(“D:/Paks/Assets_Win64.pak”), 0 // PakOrder for loading priority );
TCP Command:
.. code-block:: bash
vset /pak/mount D:/Paks/Assets_Win64.pak 0 ok Mounted: D:/Paks/Assets_Win64.pak (Order: 0)
Parameters:
PakFilePath- Absolute path to the Pak filePakOrder- Loading priority (higher = loaded later, overrides)
Unmounting Pak Files
.. code-block:: cpp
UFUNCTION(BlueprintCallable, Category = “UnrealCV|PakMount”) static bool UnmountPakFile(const FString& PakFilePath);
TCP:
.. code-block:: bash
vset /pak/unmount D:/Paks/Assets_Win64.pak ok Unmounted: D:/Paks/Assets_Win64.pak
Scanning Assets
After mounting, scan to discover available assets:
.. code-block:: cpp
UFUNCTION(BlueprintCallable, Category = “UnrealCV|PakMount”) static void ScanMountedAssets(const FString& MountPoint, bool bForceRescan = true);
TCP:
.. code-block:: bash
vset /pak/scan /Game/Assets 1 ok Scanned: /Game/Assets
Parameters:
MountPoint- Virtual path prefix (e.g.,/Game/Assets)bForceRescan- Force re-scanning cached assets
Listing Assets
Get All Assets in Path:
.. code-block:: cpp
UFUNCTION(BlueprintCallable, Category = “UnrealCV|PakMount”)
static TArray
TCP:
.. code-block:: bash
vget /pak/assets /Game/Assets ok /Game/Assets/Character1 /Game/Assets/Character2 /Game/Assets/Prop1
Filter by Class:
.. code-block:: cpp
// Get only StaticMesh assets
TArray
Loading Assets
Load Single Asset:
.. code-block:: cpp
UFUNCTION(BlueprintCallable, Category = “UnrealCV|PakMount”) static UObject* LoadAssetFromPak(const FString& AssetPath, UClass* AssetClass);
TCP:
.. code-block:: bash
vget /pak/load /Game/Assets/Character1 ok Loaded: /Game/Assets/Character1 (Class: AActor)
Example - Spawn Loaded Actor:
.. code-block:: cpp
UObject* LoadedObj = UPakMountBPLib::LoadAssetFromPak( TEXT(“/Game/Assets/Character1”), AActor::StaticClass() );
if (LoadedObj) { AActor* NewActor = GetWorld()->SpawnActor(LoadedObj->GetClass()); }
Registering to Asset Pool
Assets can be registered to the AssetPoolManager for random selection:
.. code-block:: cpp
UFUNCTION(BlueprintCallable, Category = “UnrealCV|PakMount”) static bool RegisterAssetsToAssetPool(const FString& PackagePath, const FString& Category);
TCP:
.. code-block:: bash
vset /pak/register /Game/Assets/ foreground ok Registered assets from ‘/Game/Assets/’ to category ‘foreground’
Parameters:
PackagePath- Path to scan (e.g.,/Game/Assets)Category- Asset pool category (foreground,occluder,scene)
Asset Pool Categories:
+——————+—————————————————+ | Category | Description | +——————+—————————————————+ | foreground | Primary objects for dataset | | occluder | Objects that can occlude foreground | | scene | Background environment assets | | prop | Small props and details | | character | Human/creature models | +——————+—————————————————+
Checking Mount Status
Is Pak Mounted:
.. code-block:: cpp
UFUNCTION(BlueprintCallable, Category = “UnrealCV|PakMount”) static bool IsPakFileMounted(const FString& PakFilePath);
TCP:
.. code-block:: bash
vget /pak/ismounted D:/Paks/Assets_Win64.pak ok 1
List All Mounted:
.. code-block:: cpp
UFUNCTION(BlueprintCallable, Category = “UnrealCV|PakMount”)
static TArray
TCP:
.. code-block:: bash
vget /pak/mounted ok D:/Paks/Assets1_Win64.pak D:/Paks/Assets2_Win64.pak
Complete Workflow Example
Step 1: Mount Pak
.. code-block:: cpp
void LoadDatasetAssets() { // Mount asset Pak bool bSuccess = UPakMountBPLib::MountPakFile( TEXT(“D:/Datasets/HumanCharacters_Win64.pak”), 0 );
if (!bSuccess)
{
UE_LOG(LogTemp, Error, TEXT("Failed to mount Pak"));
return;
}
}
Step 2: Scan and Register
.. code-block:: cpp
// Scan for all human character assets UPakMountBPLib::ScanMountedAssets(TEXT(“/Game/Characters/Humans”));
// Register to asset pool UPakMountBPLib::RegisterAssetsToAssetPool( TEXT(“/Game/Characters/Humans”), TEXT(“foreground”) );
Step 3: Use in Scene Generation
.. code-block:: cpp
// Later, spawn random from pool FAssetHandle AssetHandle; bool bFound = USceneCompositionBPLib::SpawnRandomForeground( GetWorld(), TEXT(“foreground”), FVector(0, 0, 0), AssetHandle );
Common Issues
Pak won’t mount:
Verify file path exists and is accessible
Check Pak was created for correct platform
Ensure no other process has file locked
Assets not found after scan:
Confirm MountPoint matches Pak’s virtual paths
Try bForceRescan = true
Check Pak was properly created with assets
Registration fails:
Verify AssetPoolManager is initialized
Check category name is valid
Ensure scanned path contains assets
LoadAsset returns nullptr:
Verify asset path is correct
Check asset wasn’t already loaded
Ensure class type matches asset type