Spring Sale: 30% off bundles with SPRINGBUNDLE or 15% off individual products with SPRING15 — ends Apr 15

StraySparkStraySpark
ProductsFree AssetsDocsBlogGamesAbout
StraySparkStraySpark

Game Studio & UE5 Tool Developers. Building professional-grade tools for the Unreal Engine community.

Products

  • Complete Toolkit (Bundle)
  • Procedural Placement Tool
  • Cinematic Spline Tool
  • Blueprint Template Library
  • DetailForge
  • UltraWire
  • Unreal MCP Server
  • Blender MCP Server
  • Godot MCP Server

Resources

  • Free Assets
  • Documentation
  • Blog
  • Changelog
  • Roadmap
  • FAQ
  • Contact

Legal

  • Privacy Policy
  • Terms of Service

© 2026 StraySpark. All rights reserved.

Back to Blog
tutorial
StraySparkMarch 25, 20265 min read
UE5 Project Architecture: Folder Structure, Naming Conventions, and Asset Management 
Unreal EngineBest PracticesTeam WorkflowArchitectureTutorial

Why Organization Matters

A project with 500 assets feels manageable with any structure. A project with 50,000 assets either works because of deliberate organization or collapses into chaos where nobody can find anything.

The cost of bad organization compounds:

  • Time wasted searching for assets
  • Duplicate assets created because the original wasn't found
  • Broken references from ad-hoc moves
  • Build times inflated by unnecessary dependencies
  • Merge conflicts from files in crowded directories

Set your structure at project start. Retrofitting organization onto a messy project is painful.

Folder Structure

The Recommended Structure

Content/
├── _Dev/                     # Personal WIP (excluded from cooking)
│   ├── DevName1/
│   └── DevName2/
├── Audio/
│   ├── Ambience/
│   ├── Music/
│   ├── SFX/
│   └── Voice/
├── Blueprints/
│   ├── Characters/
│   ├── Core/                 # GameMode, GameInstance, GameState
│   ├── Gameplay/             # Interactables, pickups, triggers
│   ├── UI/                   # Widget Blueprints
│   └── Utility/              # Editor utilities, debug tools
├── Characters/
│   ├── Player/
│   │   ├── Meshes/
│   │   ├── Materials/
│   │   ├── Textures/
│   │   └── Animations/
│   └── Enemies/
│       ├── Goblin/
│       └── Dragon/
├── Data/
│   ├── DataTables/
│   ├── Curves/
│   └── GameplayTags/
├── Environment/
│   ├── Architecture/
│   ├── Nature/
│   ├── Props/
│   └── Materials/
├── FX/
│   ├── Niagara/
│   ├── Materials/
│   └── Textures/
├── Maps/
│   ├── Levels/
│   ├── SubLevels/
│   └── TestMaps/
├── Materials/
│   ├── Master/               # Parent materials
│   ├── Functions/            # Shared material functions
│   └── Instances/            # Global material instances
└── UI/
    ├── Textures/
    ├── Fonts/
    └── Styles/

Key Principles

Feature-based grouping for characters: All assets for a character (mesh, materials, textures, animations) live together, not scattered across type-based folders.

Type-based grouping for shared assets: Materials used across many features live in a shared Materials folder, not duplicated per feature.

Separation of concerns: Blueprints in one tree, art in another, data in another. Different team roles work in different directories.

Developer sandbox: _Dev/ folders with underscore prefix sort to the top and are excluded from cooking. Developers experiment freely without polluting production content.

Test maps isolated: Test/debug maps in their own folder, easily excluded from shipping builds.

Naming Conventions

Prefix System

Every asset gets a type prefix for instant identification:

Asset TypePrefixExample
BlueprintBP_BP_PlayerCharacter
Static MeshSM_SM_TreeOak_01
Skeletal MeshSK_SK_PlayerCharacter
MaterialM_M_WoodFloor
Material InstanceMI_MI_WoodFloor_Dark
Material FunctionMF_MF_WindAnimation
TextureT_T_WoodFloor_BC
Animation SequenceAS_AS_Walk_Forward
Animation MontageAM_AM_Attack_Slash
Animation BlueprintABP_ABP_PlayerCharacter
Niagara SystemNS_NS_FireEmber
Sound CueSC_SC_Footstep_Stone
Sound WaveSW_SW_Gunshot_Rifle_01
Widget BlueprintWBP_WBP_MainMenu
Data TableDT_DT_WeaponStats
CurveC_C_DamageFalloff
LevelLV_LV_ForestZone_01
EnumE_E_WeaponType
StructS_S_InventorySlot
InterfaceI_I_Interactable
Game ModeGM_GM_MainGame
Game InstanceGI_GI_MyGame
Player ControllerPC_PC_MainPlayer

Texture Suffix Convention

Textures get additional suffixes for map type:

Map TypeSuffixExample
Base Color (Albedo)_BCT_WoodFloor_BC
Normal_NT_WoodFloor_N
Roughness_RT_WoodFloor_R
Metallic_MT_WoodFloor_M
Ambient Occlusion_AOT_WoodFloor_AO
Emissive_ET_WoodFloor_E
Height/Displacement_HT_WoodFloor_H
Opacity/Alpha_AT_Leaf_A
Packed ORM_ORMT_WoodFloor_ORM

Numbering Convention

For variant assets: _01, _02, _03 (two digits, zero-padded).

For LODs: _LOD0, _LOD1, _LOD2 (Nanite makes manual LODs less common).

For sizes: _S, _M, _L (small, medium, large variants).

Asset Management

Redirectors

When you move or rename an asset, UE5 leaves a redirector — a pointer from the old path to the new path. Redirectors prevent broken references but clutter the project.

Clean redirectors regularly:

  • Right-click a folder → Fix Up Redirectors in Folder
  • Or run from command line: UnrealEditor-Cmd.exe YourProject.uproject -run=ResavePackages -fixupredirects

When to clean:

  • After major folder reorganization
  • Before packaging a build
  • Weekly during active development

Reference Tracking

Use the Reference Viewer (right-click any asset → Reference Viewer) to understand dependencies:

  • Hard references: Loading this asset loads all hard-referenced assets
  • Soft references: Referenced by path but not loaded automatically
  • Size map: Shows the total memory footprint including all dependencies

Unused Asset Detection

Find assets that aren't referenced by anything:

// In Editor: Tools → Audit → Asset Audit
// Filter for "No References" to find orphaned assets

Or use the Size Map tool to find assets with no inbound references.

Warning: Some assets are referenced only at runtime (loaded by path string). Don't mass-delete "unused" assets without checking for string-based references.

Asset Validation

Set up validation rules that catch organizational violations:

// Custom asset validation
UCLASS()
class UMyAssetValidator : public UEditorValidatorBase
{
    GENERATED_BODY()

    virtual EDataValidationResult IsValid(TArray<FText>& ValidationErrors) override
    {
        // Check naming convention
        FString AssetName = GetAsset()->GetName();
        if (IsStaticMesh() && !AssetName.StartsWith("SM_"))
        {
            ValidationErrors.Add(FText::FromString(
                FString::Printf(TEXT("%s: Static mesh should start with SM_"), *AssetName)));
            return EDataValidationResult::Invalid;
        }
        return EDataValidationResult::Valid;
    }
};

Run validation as part of your CI/CD pipeline to catch violations automatically.

Scaling for Teams

Ownership Boundaries

Define which team members own which directories:

DirectoryOwnerOthers
Blueprints/Core/Lead programmerRead, PR review
Characters/Player/Character artistRead, request changes
Environment/Nature/Environment artistRead, use assets
Data/DataTables/Game designerRead, use values
Maps/Levels/Level designerRead, add actors

Ownership doesn't mean exclusive access — it means one person is responsible for organization and quality within that directory.

Content Creation Workflow

1. Artist creates asset in _Dev/TheirName/ (personal sandbox)
2. Asset is reviewed for quality and naming convention
3. Asset moves to production directory (e.g., Environment/Props/)
4. Redirector is created automatically
5. Fix up redirectors weekly

Avoiding Binary Merge Conflicts

UE5 assets are binary files that can't be merged:

  • File locking (Perforce/Git LFS): Only one person edits a file at a time
  • Directory ownership: Reduces the chance two people need the same file
  • Communication: "I'm working on the main level" in team chat prevents conflicts
  • Small, focused changes: Commit frequently so locks are held briefly

Automation

Editor Utility Scripts

Automate organizational tasks:

Bulk rename to convention:

import unreal

# Rename all static meshes without SM_ prefix
assets = unreal.EditorAssetLibrary.list_assets("/Game/Environment", recursive=True)
for path in assets:
    asset = unreal.EditorAssetLibrary.load_asset(path)
    if isinstance(asset, unreal.StaticMesh):
        name = asset.get_name()
        if not name.startswith("SM_"):
            new_path = path.rsplit("/", 1)[0] + "/SM_" + name
            unreal.EditorAssetLibrary.rename_asset(path, new_path)

Folder structure validation: Check that assets are in the correct directories based on their type.

Dependency report: Generate reports showing the most-referenced assets (optimization candidates) and assets with no references (cleanup candidates).

Good project architecture is invisible infrastructure. You don't notice it when it's working — you only notice when it's not. Invest the time upfront, enforce conventions consistently, and your project will scale smoothly from prototype to shipped game.

Tags

Unreal EngineBest PracticesTeam WorkflowArchitectureTutorial

Continue Reading

tutorial

World Partition Deep Dive: Streaming, Data Layers, and HLOD for Massive Open Worlds

Read more
tutorial

Motion Matching and Control Rig in UE5: The Future of Character Animation

Read more
tutorial

CI/CD Build Pipelines for UE5: Unreal Horde, GitHub Actions, and Jenkins

Read more
All posts