Skip to main content

UGC Best Practices

Supporting User-Generated Content (UGC) in Unreal Engine is a powerful way to extend the lifespan of your game. However, it presents significant technical challenges ranging from platform-specific cooking to dynamic asset discovery.

This guide provides a technical overview of the Unreal Engine UGC lifecycle and best practices for building a robust integration.

Architecture: UGC as Plugins

The most effective way to handle UGC in Unreal Engine is to treat each mod as a Content-Only Plugin. This approach leverages native engine systems and provides several key benefits:

  • Isolation: Each mod is self-contained with its own content directory and mount point.
  • Metadata: The .uplugin file provides a standard way to store versioning, author info, and dependencies.
  • Native Support: Unreal already understands the lifecycle of a plugin (loading, unloading, and remapping).
  • Ease of Creation: Modders can author content in an editor environment that mirrors the base game's structure.

Content Cooking

Unreal Engine's assets must be "cooked" to convert raw source files into platform-specific, optimized formats. For UGC, this introduces several requirements:

  • Platform Specificity: Assets must be cooked specifically for each target platform (Windows, Mac, Android etc.).
  • Version Matching: UGC must be cooked using the same engine version and release version as the base game.
  • Asset References: UGC assets must correctly reference base game assets without duplicating them in the packaged output.

Invoking Cooks

The easiest way to package a mod into a PAK or IoStore archive is to create a plugin containing the mod's data. You can then invoke the engine's DLC Cooker via the Project Launcher (standard in the Vanilla UE Editor).

For automated pipelines, you can use UnrealPak.exe (located in ...\Engine\Binaries\Win64) to package cooked assets manually.

Example: Packaging a PAK file

"C:\Program Files\Epic Games\UE_5.6\Engine\Binaries\Win64\UnrealPak.exe" "C:\Game\MyPakFile.pak" -Create="C:\Path\To\ResponseFile.txt"
tip

You can use the -List command to view the contents of an existing PAK file, which is highly useful for verifying the directory structure and ensuring no raw source files were accidentally included.

"C:\Program Files\Epic Games\UE_5.6\Engine\Binaries\Win64\UnrealPak.exe" "C:\Game\MyPakFile.pak" -List

PAK vs. IoStore

There are two types of archives that UGC cooks can target.

PAK Files (.pak)

Traditional PAK files are the long-standing engine standard for packaging content. They are archives that store cooked assets and an index for the Unreal File System (UFS).

IoStore (.ucas / .utoc)

Unreal Engine 5 (and late UE4) introduced IoStore. It separates the content data (.ucas) from the metadata (.utoc), allowing for faster I/O and improved performance.

Recommendation: While PAK files are still widely used, new projects should target IoStore for better performance and alignment with modern engine defaults.

Runtime Mounting

To make external content available to the engine, it must be mounted to the Unreal File System (UFS):

  1. Locate the Archive: Find the .pak or .utoc/.ucas files on the user's storage.
  2. Mounting: Use the engine's IPakFile or custom I/O interfaces to mount the archive to a specific path (e.g. /MyMod/).
  3. Root Registration: Register the mount point so the engine knows where to look for assets prefixed with that root.
tip

ModioUGC is an example of an implementation that automates this entire mounting and registration process. You can use it as a ready-made solution or as a reference for your own DIY implementation.

Asset Discovery & Loading

After mounting, the game needs to find and use the new assets.

  • Asset Registry: Use the IAssetRegistry to scan the new mount points and discover assets by type, tag, or path.
  • Asset Manager: If your game uses UAssetManager, ensure you register the primary asset types from the mod so they are discoverable through standard queries.
// Example: Querying discovered UGC maps
UAssetManager& AssetManager = UAssetManager::Get();
TArray<FPrimaryAssetId> MapIds;
AssetManager.GetPrimaryAssetIdList(FPrimaryAssetType("Map"), MapIds);

Uncooked Assets (Interchange)

For simple mods (e.g., textures or basic meshes), you can use the Interchange module to import source files (PNG, FBX) at runtime without a cook step.

warning

Interchange is a PC-only approach. It is not compatible with cross-platform (consoles) due to performance constraints and platform-specific security requirements.

UGC Creation Tools

Choosing a tooling strategy depends on your game's complexity and target audience:

StrategyProsConsExamples
In-Game EditorHighly accessible, simple data types (e.g JSON/CSV).Limited power, no custom assets.Earth vs Mars
Vanilla UE EditorMore content possibilities, zero dev effort.Minimal base-game interfacing, limited content possibilities.Ready or Not (Community-driven modding).
Vanilla UE + Mod ToolkitTailored experience, easier for modders.Maintenance overhead for the dev team.Torque Drift 2 (Studio-provided plugin).
Custom UE EditorMaximum power, full game integration.Moderate effort, requires Epic approval.Homeworld 3 (Released via Epic Store).

Cross-Platform Considerations

Supporting mods on consoles adds significant complexity due to platform security and NDAs:

  • Console Tooling & Remote Cooking: You cannot distribute official console dev tools to creators. To support these platforms, you need a solution that hosts the target platform's build tools in secure cloud VMs to process source assets remotely.
  • Storage Sandbox: Consoles have strict rules about where files can be written and read. Your mounting logic must account for these platform-specific paths.
tip

mod.io provides ready-made solutions for these challenges:

  • Cloud Cooking handles the remote cooking of source assets in secure, console-compatible environments.
  • ModioUGC automates the complex mounting and root registration within the restricted storage sandboxes of each platform.

General "Dos and Don’ts"

DoDon't
Do use TSubclassOf or TSoftObjectPtr to allow late-binding and asset replacement.Don't hard-reference specific assets in C++ that creators might want to override.
Do use the Asset Registry to discover content dynamically across all mount points.Don't rely on hardcoded paths or a strictly manual "load by filename" approach.
Do handle mod loading/unloading without requiring a full game restart.Don't rely on the engine's default Mods directory, as it requires the engine to restart to make changes and is inaccessible on consoles.
Do validate UGC checksums and metadata before mounting to ensure compatibility.Don't assume that all downloaded files are valid or safe engine archives.

Next Steps


For enquiries regarding your UGC strategy, contact developers@mod.io.