One engine. One structure.
Shot Scope

Unreal Conventions

Content structure, asset naming, and what QC rejects.
Section07
Asset Prefixes23
Version

Unreal Engine 5 is the production's render environment. Every department feeds assets into it. The content tree, asset prefixes, and material setup must be consistent so QC can validate against a single known structure. A file placed in the wrong folder or named with the wrong prefix will block publish. When in doubt, ask the VFX Supervisor before touching the content tree.

Before anything else — what Delivery Specs binds you to

Unreal renders are held to the same show specification as every other department. depth and mv are required AOVs, not optional extras. Every shot and every cache carries 8 frames of handle, head and tail. The show runs at true 24.000 fps — never 23.976; a 23.976 requirement is a conform decision at delivery, never a production one. Full sheet: Delivery Specs.

7.2.1

Content Folder Structure#

Unreal is the one place in the pipeline that does not use the Drive folder structure. It has its own content tree. It must still be predictable, because QC validates against it.
/Content/THS/
├── Assets/
│   ├── _Global/                     ← SHARED. Sorts first. Owned by the VFX Sup.
│   │   ├── MasterMaterials/         ← every M_ on the show lives HERE and nowhere else
│   │   ├── MaterialFunctions/       ← MF_ shared graph fragments
│   │   ├── MaterialCollections/     ← MPC_ show-wide look controls
│   │   ├── TextureLibrary/          ← tiling, trim, noise, utility — anything reusable
│   │   ├── Decals/  HDRs/  IES/     ← lighting and surface libraries
│   │   ├── OCIO/                    ← the ACES 1.2 config asset
│   │   └── LookDev/  Utility/       ← turntable rigs, debug and render helpers
│   ├── Characters/<AssetName>/     ← CHR, CRT
│   ├── Environments/<AssetName>/   ← ENV (incl. splats)
│   ├── Buildings/<AssetName>/      ← BLD
│   ├── Props/<AssetName>/          ← PRO
│   ├── Weapons/<AssetName>/        ← WPN
│   ├── Vehicles/<AssetName>/       ← VHC
│   └── FX/<AssetName>/             ← FX
├── Sequences/
│   └── SEQ<NNN>/
│       └── sh<NNNN>/               ← level, level sequence, shot-local assets
├── Levels/                          ← persistent + sublevels
├── Lookdev/                         ← turntables, calibration, HDRI
└── _Dev/                            ← RnD and tests. NEVER referenced by a shipping shot.
Where does a texture go? — the delete test

Ask one question: if I delete this asset, should this texture die with it? Yes → the asset's own Textures/ folder — a character's UDIM skin, a hero prop's baked maps. NoAssets/_Global/TextureLibrary/ — tiling, trim, decals, noise, utility. Shared across one modular set rather than the whole show? It lives with the kit. Master materials are always _Global; an asset folder carries its MI_ instances and never an M_.

Co-locating a texture does not duplicate it. Unreal assets reference each other by package path, so one texture under Assets/Prp/Crate/Textures/ can be used by fifty materials in fifty other folders. The duplication risk is real on Drive, where a file genuinely gets copied next to each asset; it does not exist inside /Game. So the folder choice is about lifecycle, Migrate, source-control locking and redirectors — never about copies. Type-based layouts suit games and marketplace packs, where almost everything is shared anyway; at series scale they lose on all four.

01

One folder per asset — PascalCase, no type prefix

Named exactly the AssetName from the production asset list. The parent folder carries the type — Characters/Scion/, not Characters/CHR_Scion/.
02

Group by type inside each asset folder

Sub-folders are always Meshes/, Materials/, Textures/, Anim/. No other layout is acceptable inside an asset folder.
03

Nothing outside /Content/THS/

Except engine and plugin content. Marketplace or sample content is quarantined and never referenced by a shot.
04

_Dev/ referenced from Sequences/ = ERROR

QC treats a _Dev/ reference from Sequences/ as a hard error that blocks publish, not a warning. _Dev/ is for RnD only and is never referenced by a shipping shot.
7.2.2

Asset Naming#

Follows Epic's recommended convention with the Thresholds AssetName as the name token. Format moves from broad to specific: what type, which asset, which detail, which variant.
Unreal asset name anatomy
Prefix_AssetName[_Descriptor][_Variant]
PrefixType prefix — SM_, SK_, M_, T_… Full table below.
AssetNameProduction-assigned name, PascalCase, must match the asset list exactly
[_Descriptor]Optional PascalCase qualifier — _Body, _Skin, _Interior
[_Variant]Optional trailing letter or two-digit number — _A, _01
Examples
SK_Scion
Skeletal mesh for the Scion character
MI_Scion_Skin_Wet
Material instance — Scion skin, wet variant
T_Scion_Skin_ORM
Packed AO/Roughness/Metallic texture for Scion skin
Prefix

Unreal Asset Prefix Table — 37 types

Grouped by discipline, in the order an artist meets them — geometry, then look, then animation, then FX, then assembly, then data. Within a group the most-used prefix comes first. The table is deliberately not alphabetical: you look up a prefix by asking what you are making, not by its first letter.
Geometry and everything that deforms or collides with it.
6 types

Meshes, Rigging & Simulation

SM_
Static Mesh
Non-deforming mesh.
SM_Skiff_Body
SK_
Skeletal Mesh
Deforming mesh, bound to a skeleton.
SK_Scion
SKEL_
Skeleton
Bone hierarchy asset.
SKEL_Scion
PHYS_
Physics Asset
Ragdoll and collision volumes for skeletal meshes.
PHYS_Scion
CR_
Control Rig
Epic ships CR_Mannequin_Body; CR_ is the field standard.
CR_Scion_Body
GRM_
Groom
XGen groom via Alembic. GRMB_ binding, GRMC_ cache.
GRM_Scion_Hair
M_ masters live only in Assets/_Global/MasterMaterials. An asset folder carries MI_ instances, never an M_.
7 types

Materials

M_
Material
Parent material. Do not assign directly to production meshes — use MI_.
M_Scion_Skin
MI_
Material Instance
What meshes actually use. Instanced from an M_.
MI_Scion_Skin_Wet
MF_
Material Function
Shared graph fragment. Lives in Assets/_Global/MaterialFunctions.
MF_TriplanarBlend
MPC_
Material Parameter Collection
Show-wide look controls driven from one place.
MPC_ShowGlobals
PPM_
Post Process Material
Full-screen post-process effects.
PPM_ShotGrade
PM_
Physical Material
Surface physics properties (friction, restitution).
PM_Metal
SSP_
Subsurface Profile
Skin and translucent shading profiles.
SSP_Scion_Skin
Where a texture LIVES is decided by the delete test, not by its prefix — see Texture Placement above.
4 types

Textures

T_
Texture
2D texture asset. Map token required at end — see §7.2.3.
T_Scion_Skin_DIFF
TC_
Texture Cube
Cube map for environment lighting and Lookdev.
TC_RustGorge_Reflection
HDR_
HDRI (content prefix)
Names CONTENT, not an asset class. Legal on a Texture2D long-lat or a TextureCube.
HDR_RustGorge_Key
RT_
Render Target
Runtime capture target. RTC_ for a cube.
RT_MirrorCapture
Authored motion and the assets that blend it.
4 types

Animation

AS_
Animation Sequence
A single baked animation clip.
AS_Scion_Idle
AM_
Animation Montage
Composed sequence for playback control.
AM_Scion_Fall
BS_
Blend Space
Multi-dimensional animation blend.
BS_Scion_Locomotion
ABP_
Animation Blueprint
Controls animation logic for skeletal meshes.
ABP_Scion
NS_/NE_/NM_/NF_ replaced Epic's older FXS_/FXE_/FXF_ on 2026-07-31 — see the note under the table.
5 types

FX — Niagara

NS_
Niagara System
Top-level FX system, assembled from emitters.
NS_RustGorge_Dust
NE_
Niagara Emitter
Reusable emitter module within a system.
NE_Ember
NM_
Niagara Module
The asset an FX TD authors most. Had no prefix at all before 2026-07-31.
NM_SwirlForce
NF_
Niagara Function
Reusable Niagara function / module script.
NF_RemapRange
NSC_
Niagara Sim Cache
Baked FX, so a shot re-renders deterministically.
NSC_SEQ010_sh0010_Dust
Assembly and shot structure. CAM_ names a level ACTOR, not an asset.
4 types

Levels, Sequencing & World

L_
Level (World)
Shot level, persistent level, or sublevel.
L_SEQ010_sh0010
LS_
Level Sequence
Sequencer track for a shot or master. Shot codes match Drive.
LS_SEQ010_sh0010
LI_
Level Instance
A reusable arrangement. PLA_ for a Packed Level Actor.
LI_Tenement_CornerA
DL_
Data Layer
Environment variants and streaming groups. HLOD_ for HLOD layers.
DL_RustGorge_Night
Everything that configures the show rather than appearing in frame.
7 types

Data, Blueprints & Pipeline

BP_
Blueprint
Actor Blueprint, game logic.
BP_SkiffRig
WBP_
Widget Blueprint
UMG UI widget used in-engine (e.g. shot HUD).
WBP_ShotHUD
DT_
Data Table
Row-structured data asset.
DT_ShotList
CT_
Curve Table
Curve-driven data asset.
CT_FalloffCurves
DA_
Data Asset
Show config, shot metadata, render presets. PDA_ if primary.
DA_ShotConfig
F_
Struct / Enum / Interface
F_ struct, E_ enum, BPI_ blueprint interface.
F_ShotMeta
OCIO_
OCIO Profile
Colour config asset. One per show, never per artist.
OCIO_Show_ACES12

THS_ never appears in Unreal — and why

Section 6.2 restricts THS_ to whole-document names and delivery masters only. The /Content/THS/ root folder is the project namespace; it is not a filename prefix. Any Unreal asset whose name contains THS_ is a QC error and will be renamed automatically. This is not negotiable — the show code belongs on documents, not assets.

PascalCase, descriptors, variants, and forbidden characters

  • AssetName is PascalCase and matches §6.5 exactly. The asset called Scion on Drive is Scion in Unreal. No abbreviations, no renaming at the border.
  • Descriptors are PascalCase (_Body, _Skin, _Interior). Variants are a trailing letter or two-digit number (_A, _01).
  • ×No spaces, no hyphens, no accents, no double underscores. Lowercase-only asset names are a QC error — Unreal names are PascalCase, unlike the lowercase file tokens in §6.1.
7.2.3

Materials & Textures#

Textures keep the map tokens they were authored with. A map does not change identity crossing from Substance to Maya to Unreal. One vocabulary, end to end.
Texture asset name anatomy
T_AssetName_Part_MAP
T_Texture prefix — always
AssetNameProduction name, PascalCase
PartMaterial part / region — Skin, Rock, Hull…
MAPCanonical map token — see table below
Examples
T_Scion_Skin_DIFF
Scion skin diffuse/base colour
T_Scion_Skin_NRM
Scion skin normal map
T_Scion_Skin_ORM
Scion skin packed AO / Roughness / Metallic
T_RustGorge_Rock_DIFF
RustGorge environment, rock diffuse
T_RustGorge_Rock_DISP
RustGorge rock displacement

Canonical map tokens — the same list used on disk, in Maya, and in Unreal

DIFF — Base colour / albedo SSS — Subsurface scattering NRM — Normal (OpenGL, green-up) THICK — Thickness MTL — Metallic TRANSM — Transmission (glass) RGH — Roughness COAT — Clearcoat DISP — Displacement CAV — Cavity AO — Ambient occlusion EMI — Emissive ORM — Packed AO / Roughness / Metallic OPAC — Opacity / alpha HGT — Height MASK# — Numbered ID / utility mask
Do not rename to Unreal community shorthand (_BC, _N, _R, _M). We use one map vocabulary end to end so a texture is greppable across every DCC. QC enforces our tokens and auto-corrects the common aliases on import.

ORM is expected and correct here

Packed AO(R) · Roughness(G) · Metallic(B). Unreal is where packed maps earn their keep. The channel map is: R = AO, G = Roughness, B = Metallic. For the Maya-side caveat and the decompose wiring, see scene-hierarchy.html.

sRGB warning — data maps imported as sRGB silently corrupt all three channels

ORM and every other data map (NRM, RGH, MTL, AO, DISP, HGT, OPAC, CAV, MASK#) must be imported as non-colour — sRGB unchecked. An sRGB transform on packed data corrupts all three channels at once and is easy to miss by eye. QC enforces this as a hard error.

UDIM sets — single import, no tile number in the name

UDIM sets import as a single texture named without the tile number. T_Scion_Skin_DIFF covers all tiles — Unreal handles the tile expansion automatically.

M_ is a parent material. MI_ is what a mesh actually uses.

Assigning a raw M_ directly to a production mesh is a QC warning — it defeats instancing and makes a global change impossible. Always create an MI_ from the parent material and assign that.
7.2.4

Levels & Sequences#

Sequence and shot codes are identical to §6.3SEQ010, sh0010. Unreal does not get its own shot numbering. A shot that is SEQ010_sh0010 on Drive is SEQ010_sh0010 here.
Asset type Pattern / Example Notes
Level (shot) L_SEQ010_sh0010 One level per shot. Contains layout, characters, and all shot-local assets.
Level (persistent) L_RustGorge_P Always-loaded level per environment. Carries streaming config.
Sublevel L_RustGorge_Lighting
L_RustGorge_Set
Streamed in by the persistent level. Suffix names the role.
Level Sequence LS_SEQ010_sh0010 Shot-level Sequencer track. Shot codes match Drive exactly.
Master Sequence LS_SEQ010_Master Container sequence for an entire sequence block.
Camera Actor CAM_SEQ010_sh0010 Virtual camera placed in the shot level. Not prefixed with L_ or LS_.
7.2.5

LODs, Collision & Nanite#

01

Nanite is on by default

Per §7.2, Nanite is enabled for all production meshes. Do not hand-author LODs for Nanite meshes. Hand LODs on a Nanite mesh are a QC warning.
02

Non-Nanite meshes may carry LODs

Translucent materials, deforming meshes, and foliage cards cannot use Nanite and may carry LOD0LOD3. No more than four levels.
03

Collision is not required

Thresholds is a linear render, not a game. Do not author collision unless a Blueprint physics need is signed off by the VFX Supervisor. Unnecessary collision is a QC warning.
7.2.6 — Most Critical Section

What QC Must Reject#

Written as validator intent, ordered by severity. The VFX Supervisor is building a QC tool directly from this list. Errors block publish immediately. Warnings flag for human review before the next milestone gate.

Error Blocks Publish — 9 conditions

  • Any asset outside /Content/THS/ referenced by a shot. Migrating content can break references — requires human decision before fix.
  • Any _Dev/ asset referenced from Sequences/. RnD material must never reach a shipping shot.
  • Missing or wrong type prefix — e.g. Scion instead of SK_Scion. QC renames and fixes up redirectors.
  • THS_ appearing on any Unreal asset. Show code is restricted to documents and delivery masters per §6.2. QC strips THS_.
  • Asset name does not match any known production asset from the asset list. Either misnamed or not on the list — human must resolve.
  • Spaces, hyphens, accents, or double underscores in an asset name. QC converts to PascalCase and strips separators.
  • Texture using a non-canonical map token (e.g. _BC, _N, _R). QC resolves via alias table before failing; unresolvable tokens block.
  • Sequence or shot code not matching the SEQ<NNN> / sh<NNNN> pattern. Requires human correction — do not auto-rename.
  • Asset in the wrong type folder — e.g. SK_Scion under Props/. QC moves to the correct folder and updates redirectors.

Warning Flags for Review — 5 conditions

  • Raw M_ assigned to a production mesh instead of an MI_. QC can create an MI_ from the parent material and reassign automatically.
  • Hand-authored LODs on a Nanite mesh. QC can strip the hand LODs; confirm Nanite output looks correct before doing so.
  • Collision authored on a mesh with no signed-off physics need. QC removes collision primitives on confirmation. This is a linear render, not a game.
  • Empty asset folder. QC can delete the folder on confirmation that the asset is fully retired.
  • Asset not referenced by any level or sequence (orphan). Human decides whether to keep, archive, or delete.