Naming Conventions

The tables on this page are generated

They come from Asset Rules (Generated), which is written from the JSON that the Blender
add-on, the Unity postprocessor and the Bubbly Asset Editor actually enforce. A table here
cannot disagree with the tools, because it is the tools' own copy.

To change a rule, change it in the bubbly-asset-rules repo and re-run npm run docs && npm run vault.
Editing a table on this page does nothing.

Pattern

All names follow this pattern:

[Type]_[Category]_[SubCategory?]_[Set_SetNum?]_[Descriptor]_[Num]_[Action?]_[Var?]_[RoleSuffix?]

Token order

Type_Category_SubCategory_Set_SetNum_Descriptor_Descriptor2_Descriptor3_Num_Action_Var_Version_RoleSuffix

Token Required Accepts
Type yes SM, T, M, SMM, VFX, SMA, AU, P, SC, CAM, LGT, VOL, SYS, DA
Category yes Character, Effect, Kit, Prop
SubCategory optional PascalCase
Set optional PascalCase, paired with SetNum
SetNum optional /^\d{2}$/
Descriptor yes PascalCase
Descriptor2 optional PascalCase
Descriptor3 optional PascalCase
Num yes /^\d{2}$/
Action optional PascalCase, defined per type
Var optional /^\d{2}$/
Version optional /^V\d+$/
RoleSuffix optional defined per type

Three parts of that are worth reading twice:

  • Descriptor can span up to three parts. A kit piece is usually more than one word.
    Wall_Interior_HalfHeight is a single descriptor, not three tokens.
  • Action only exists for the types that declare it (audio, animation, VFX, data). Without
    that, a trailing part on a mesh name would be read as an action instead of a role, and the
    texture importer keys on the role.
  • Var is a two-digit number, for randomised pools. A named variant is a RoleSuffix.

Name Parts

Type

Type prefixes

Prefix Meaning Applies to Note
SM_ 3D Model model Meshes carry SM_ so they are never mistaken for the prefab that usually accompanies them.
T_ Texture or Sprite texture
M_ Material (Unity) material Named for the texture set it is built from, not for the mesh it lands on. See rules/material.json.
SMM_ Material (.fbx/.blend) material Authored in Blender; replaced in Unity by a proper M_ material.
VFX_ Visual Effect vfx
SMA_ Static Mesh Animation animation
AU_ Audio Clip audio
P_ Prefab prefab A prefab wrapping one model carries that model's name with SM swapped for P. See rules/prefab.json.
SC_ Scene scene SC[Level][Layer]; see the Scene Structure doc.
CAM_ Camera sceneObject
LGT_ Light sceneObject
VOL_ Volume sceneObject
SYS_ System sceneObject An important, mostly singleton system such as a dialogue system.
DA_ Data Asset data NOT in Naming Conventions.md. Added so .bgasset ids can follow the same pattern; rename or remove if the studio picks a different prefix.

SMM_ materials live inside a .blend or .fbx and are replaced in Unity by a proper M_
material. Meshes carry SM_ so they are never confused with the prefab that usually accompanies
them. Unity treats the two almost identically in the project window.

Category

Each type draws from one list, and every category is a capitalised word (Prop, Kit,
Surface, Music). Model and texture categories are also the names of the folders the assets live
in, under Assets/Source/Meshes, Assets/Exported/Meshes and Assets/Exported/Textures.

The all-caps codes are gone

Until 2026-10-13, texture, audio and data categories were short codes in capitals (T_SURF_,
AU_MUS_, DA_ACH_). They are now words like every other category (T_Surface_, AU_Music_,
DA_Achievement_). An old name fails NAM003, and the message says what to use instead. UI and
SFX stay in capitals because they are acronyms.

3D Models

Model categories

Character · Effect · Kit · Prop

Which one a thing is in is a ladder, read top to bottom, first yes wins. See
Naming Conventions > Which category is it below.

Textures

These are the only valid categories for textures.

Texture categories

Sprite · Effect · Mask · Trim · Cutout · Surface

They are not one axis, which is why a ladder is needed here too: Surface is what a texture is for,
Cutout is how it is authored, Trim is how it is laid out, Mask is what it carries,
Sprite is where it is drawn and Effect is what reads it. A leaf atlas answers to two of those at
once. See Naming Conventions > Which texture category is it below.

Audio Clips

These are the only valid categories for audio clips. All fall into one of these.

Audio categories

SFX · Music · Ambience · VoiceOver · UI

Category Note Example
SFX Sound effect Gunshots, footsteps
Music Music
Ambience Ambient sounds Wind, rain, chatter
VoiceOver Voice over NPC dialogue, player voice
UI User interface Clicks, hovers, scrolls

Data Assets

Ids of .bgasset files, authored in the Bubbly Asset Editor.

Data categories

Achievement · Action · Audio · Brain · Character · Condition · Craft · Goal · Item · Narrative · Progression · Quest · Taxonomy · Thought · UI · World

Sub-Category

Optional, PascalCase, free-form. A level of detail below the category. Player, Wpn, Enemy,
Menu, Forest.

Set + Set-Number

For a set, like a kit. PascalCase name, two-digit number, and the two always travel together.
A Set without a SetNum is not a valid name.

Descriptor

What the asset actually is. Player, Shotgun, Goblin, Btn, Rain. Up to three parts, so a
kit piece can say Wall_Interior_HalfHeight without inventing a token for it.

Num

Two-digit number. Always present, even for something there will only ever be one of. That way,
the day there is a second one, nothing has to be renamed.

Action/State

Optional. What the thing is doing: Fire, Reload, Hit, Hover, Loop, Open.

It sits after the number: SMA_Kit_FrontDoor_01_Open.

Variation

Optional two-digit number, for randomised pools. AU_SFX_Wpn_Shotgun_01_Fire_02.

Role-Suffix

The role a file plays in a set of files. For a texture that means the map type, from a closed list;
for a SMM_ material it is the part of the mesh it belongs to, and it is required there.

Per-type overrides

Where a type needs something the single pattern cannot say.

SM_: 3D Model

Token Required Accepts
RoleSuffix optional PascalCase

Regex: ^SM_(?:Character|Effect|Kit|Prop)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:[A-Z][A-Za-z0-9]*))?$

SMM_: Material (.fbx/.blend)

Token Required Accepts
$note optional any part
RoleSuffix yes PascalCase

Regex: ^SMM_(?:Character|Effect|Kit|Prop)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?_(?:[A-Z][A-Za-z0-9]*)$

M_: Material (Unity)

Token Required Accepts
$note optional any part
Category yes Sprite, Effect, Mask, Trim, Cutout, Surface
RoleSuffix optional PascalCase

Regex: ^M_(?:Sprite|Effect|Mask|Trim|Cutout|Surface)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:[A-Z][A-Za-z0-9]*))?$

P_: Prefab

Token Required Accepts
$note optional any part
Category yes Character, Effect, Kit, Prop, UI, System, Gameplay, Audio
RoleSuffix optional PascalCase

Regex: ^P_(?:Character|Effect|Kit|Prop|UI|System|Gameplay|Audio)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:[A-Z][A-Za-z0-9]*))?$

T_: Texture or Sprite

Token Required Accepts
$roleNote optional any part
Category yes Sprite, Effect, Mask, Trim, Cutout, Surface
RoleSuffix optional Albedo, Roughness, Normal, AO, Metallic, Emissive, Height, Damage, EdgeMask, Packed, Flipbook, Noise, Gradient, Distortion, MotionVector

Regex: ^T_(?:Sprite|Effect|Mask|Trim|Cutout|Surface)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:Albedo|Roughness|Normal|AO|Metallic|Emissive|Height|Damage|EdgeMask|Packed|Flipbook|Noise|Gradient|Distortion|MotionVector))?$

SMA_: Static Mesh Animation

Token Required Accepts
Action optional PascalCase

Regex: ^SMA_(?:Character|Effect|Kit|Prop)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?(?:_(?:V\d+))?$

VFX_: Visual Effect

Token Required Accepts
Action optional PascalCase

Regex: ^VFX_(?:Character|Effect|Kit|Prop)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?(?:_(?:V\d+))?$

AU_: Audio Clip

Token Required Accepts
Category yes SFX, Music, Ambience, VoiceOver, UI
Action optional PascalCase

Regex: ^AU_(?:SFX|Music|Ambience|VoiceOver|UI)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?(?:_(?:V\d+))?$

SC_: Scene

Token order: Type_Descriptor_RoleSuffix

Token Required Accepts
$layerNote optional any part
RoleSuffix optional Base, Environment, Gameplay, Lighting, Audio, UI

Regex: ^SC_(?:[A-Z][A-Za-z0-9]*)(?:_(?:Base|Environment|Gameplay|Lighting|Audio|UI))?$

CAM_: Camera

Token order: Type_Descriptor_Descriptor2_Descriptor3_Num

Token Required Accepts
Num optional /^\d{2}$/

Regex: ^CAM_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?$

LGT_: Light

Token order: Type_Descriptor_Descriptor2_Descriptor3_Num

Token Required Accepts
Num optional /^\d{2}$/

Regex: ^LGT_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?$

VOL_: Volume

Token order: Type_Descriptor_Descriptor2_Descriptor3_Num

Token Required Accepts
Num optional /^\d{2}$/

Regex: ^VOL_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?$

SYS_: System

Token order: Type_Descriptor_Descriptor2_Descriptor3_Num

Token Required Accepts
Num optional /^\d{2}$/

Regex: ^SYS_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?$

DA_: Data Asset

Token Required Accepts
Category yes Achievement, Action, Audio, Brain, Character, Condition, Craft, Goal, Item, Narrative, Progression, Quest, Taxonomy, Thought, UI, World
Action optional PascalCase
RoleSuffix optional PascalCase

Regex: ^DA_(?:Achievement|Action|Audio|Brain|Character|Condition|Craft|Goal|Item|Narrative|Progression|Quest|Taxonomy|Thought|UI|World)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:[A-Z][A-Za-z0-9]*))?$

Version

Optional _V1, _V2, … for hand-kept old versions. See Project Folder Structure. The active
file is always the one without a suffix.

Examples

Examples

Name Reads as
SM_Prop_OldTable_01 Type=SM, Category=Prop, Descriptor=OldTable, Num=01
SM_Prop_Plant_01 Type=SM, Category=Prop, Descriptor=Plant, Num=01
T_Surface_Tree_01 Type=T, Category=Surface, Descriptor=Tree, Num=01
SM_Kit_House_01_Basement_01 Type=SM, Category=Kit, Set=House, SetNum=01, Descriptor=Basement, Num=01
T_Surface_WoodPlanks_01_Albedo Type=T, Category=Surface, Descriptor=WoodPlanks, Num=01, RoleSuffix=Albedo
T_Surface_OldChair_01_EdgeMask Type=T, Category=Surface, Descriptor=OldChair, Num=01, RoleSuffix=EdgeMask
T_Mask_OldChair_01_EdgeMask Type=T, Category=Mask, Descriptor=OldChair, Num=01, RoleSuffix=EdgeMask
SM_Prop_Kitchen_Mixer_01 Type=SM, Category=Prop, SubCategory=Kitchen, Descriptor=Mixer, Num=01
SMM_Prop_Kitchen_Mixer_01_Handle Type=SMM, Category=Prop, SubCategory=Kitchen, Descriptor=Mixer, Num=01, RoleSuffix=Handle
SMA_Kit_FrontDoor_01_Open Type=SMA, Category=Kit, Descriptor=FrontDoor, Num=01, Action=Open

Which category is it

The category lists say which words are legal. They cannot say which thing is which word, and that
is the question people actually have.

Read top to bottom. Stop at the first yes.

The decision ladder

Applies to model and prefab categories. Read top to bottom and stop at the first yes.

# Ask Then it is
1 Does it deform? Is it skinned to a skeleton, or worn by something that is? Character
2 Is it geometry for an effect rather than an object? Does it only make sense with a particle system, VFX graph or decal projector driving it? Effect
3 Is it a piece of a modular set? Does it snap to the grid and connect to its siblings? Kit
4 Anything still here. Prop

Tiebreakers

  • Two answers still standing: take the one HIGHER on the ladder. Each step up asks more of the mesh than the step below it, so stopping early never asks less of an asset than it should.
  • Kit is a yes/no question and the answer is about the SET, not the piece. A wall built to tile against the other walls of AbandonedTavern is Kit. The same wall modelled once, for one building, connecting to nothing, is a Prop.
  • One mesh, one category. If a thing genuinely needs to be two, it is two meshes. The wall segment that is part of a kit and the one-off feature wall are not the same asset with a placement question.
  • A Kit piece carries a Set and a SetNum and no SubCategory, and that is what puts it in Kit/. A name with no Set is not a Kit piece, whatever it depicts (see CAT003).
  • Held items are Props. Swords, pans, brooms and lanterns are Props with a SubCategory that says what they are for. Where the hand goes is a socket on the prefab, set up in Unity, and it is not a property of the mesh.

Every category is an answer to one question: where does its origin go, and what holds it there?
The names read like a taxonomy of things, but they are not one. That mix-up is where most arguments about this
start.

Model categories in detail

Character

Anything rigged and animated as a creature or a person, plus everything skinned onto one.

  • Test. Does it deform when it moves? Does it have a skeleton with .L/.R bones?
  • Includes. Player characters · NPCs · Creatures · Body parts and heads · Hair · Clothing · Armour · Anything skinned to a character rig
  • Not. A rigid thing a character holds is a Prop, even though a hand is touching it. The line is skinning: a Character part deforms with bones, a held Prop is parented to a socket and stays rigid.
  • Authoring. vertexDensityTier character, pivot world origin, feet at Y=0

Effect

A mesh that exists to be rendered by an effect system rather than to be an object in the world.

  • Test. Does it only make sense with a particle system, VFX graph or decal projector driving it?
  • Includes. Particle meshes · Trail and ribbon geometry · Beam and cone shells · Flipbook cards and billboard planes · Decal meshes · Force-field and shield shells · Splash and impact sheets
  • Not. The effect asset itself is VFX, not SM. Effect covers only the meshes an effect needs. A puddle that is part of the level is a Prop; the splash that lands in it is Effect.
  • Authoring. vertexDensityTier mobile, pivot at the emission point

Kit

A piece of a modular set. It snaps to the grid, it connects to its siblings, and it is never the only one of its kind.

  • Test. Is it part of a set of pieces designed to tile and connect? Does it snap to grid.primary or grid.sub, with flat connecting faces?
  • Includes. Walls, floors, ceilings and roof sections of a kit · Stairs, ramps and railings that tile along a run · Doors and windows that fill a grid opening · Pillars, beams and trim runs · The panels, inserts, trim and corner pieces one split element is made of · Fence and wall runs · Pipe, cable and ducting runs · Built-in counters and cabinetry that snap to a wall segment · Road and bridge segments · Roof slopes, ridges, hips, valleys, verges and dormers · Gable walls, which are walls and belong with the wall pieces · Balcony slabs, balustrades and the corbels under them
  • Not. A one-off building modelled whole, a landmark, a statue, a tree, a cliff. None of those tile against anything, none of them snap, and putting them in Kit means Kit/ holds a set of one.
  • Authoring. vertexDensityTier environment, pivotClasses wall, floor, ceiling, fence, door, insert, trim, corner, hatch, roof, gable, stair, balcony

Prop

A standalone object. Everything that is not skinned, not driven by an effect system, and not a piece of a modular set.

  • Test. Is it its own thing rather than a piece of something else?
  • Includes. Furniture · Containers and crates · Clutter and tableware · Books and paper · Signage and pictures · Appliances and machines · Debris · Collectibles and pickups · Vehicles · Weapons, hand tools, utensils and anything else a character holds · Trees and plants · Cliffs, boulders and rock formations · Street lamps, hydrants, benches · One-off buildings and landmarks that are not built from a kit
  • Not. A piece that tiles against its siblings is Kit. Something skinned to a rig is Character.
  • Authoring. vertexDensityTier prop, pivot bottom-center

Settled edge cases

Thing Category Why
Vase, bowl, jug on a surface Prop The question that started the rewrite. Nothing skins it, no effect drives it, and it is not a piece of a set, so it falls to step 4. Bottom-center, and done.
Sword, axe, any weapon Prop Held or decorative, it is the same mesh with the same pivot. The hand attaches to a socket on the prefab, so the decision that used to cost a re-pivot now costs nothing.
Kitchen knife, rolling pin, frying pan Prop Same. SubCategory Utensil if it helps the folder; the category never depended on whether a character picks it up.
Broom, shovel, wrench Prop Same again. There is no longer a category that these could be arguing with.
Car, cart, drivable vehicle Prop It stands on the ground and it is not a piece of a set. If it is skinned to a rig and animated as a creature would be, the ladder catches it at step 1 and it is a Character instead.
Car as a piece of a wrecked-street kit Kit The exception that proves the test: if it ships as one of a set of street pieces that tile and snap together, it is Kit and it is named for the Set.
Wall, floor, ceiling, roof section of a set Kit The core case. Snaps to grid, connects to siblings, takes its pivot from mesh.pivots.byClass.
Door, window, shutter, hatch Kit Fills a grid.doorOpening and has a pivot class already. A door that opens is still a kit piece.
Cornice, string course, plinth, sill Kit A trim run, which the includes list already covered before anyone had a word for what it trims. Pivot class trim, and it is a separate asset from the panel it sits on because MSH013 will not let a projecting profile share a connecting face.
Corner pier, quoin, pilaster Kit Resolves where two runs meet, which is the one job no panel can do. Pivot class corner.
Window that does not open Kit Settled 2026-09-21, and it used to have no right answer: door gave it a hinge it has not got and prop gave it a bottom-center pivot that will not drop into an opening. Pivot class insert, on the OPENING's bottom-left.
Trapdoor, floor hatch, cellar door Kit A door in a FLOOR, and the case door gets wrong twice: it turns about a horizontal edge rather than a vertical one, and its top face finishes flush with the walking surface rather than standing on it. Pivot class hatch, and the opening it fills is grid.hatchOpening, which is square so it can be dropped in rotated.
Shutter, louvre, grille over a window Kit It closes over an opening rather than filling one, and it ships with the window it belongs to. insert if it sits in the reveal, prop if it is hung on the face and a level designer places it freely.
Roof slope, ridge, hip, valley, verge Kit The roof equivalent of wall, corner and trim, and all of one kit at one pitch. Pivot class roof for the slopes; a ridge or a verge is a run along an edge, so it is trim.
Gable wall Kit A WALL, not a roof piece, and the likeliest gap in a pitched-roof kit: its top edge has to be grid.roofPitch or the verge stands off it. Pivot class gable, which exists to say that and is the one class MSH017 deliberately cannot check.
Dormer Kit A little building standing out of a slope: cheeks, a front and a roof of its own. Ships as an assembly of Kit pieces, or as one piece where the kit only has the one.
Chimney Kit If the kit has stacks that tile up and cap, they are Kit pieces. A one-off chimney modelled whole for one landmark is a Prop, like any other one-off.
Balcony slab Kit A floor that projects. Pivot class balcony: the floor pivot, because its walking surface still has to land at storey level, and exempt from MSH015 because standing out of the facade is the whole point. How far out is grid.balconyDepth.
Balustrade, handrail run Kit Pivot class fence, which is what a balustrade is: a run that tiles along its length at bottom-left. There is deliberately no railing class, because it would be a second name for this one.
Corbel or bracket under a balcony Kit It projects from the wall and repeats along the run, which is trim in everything but name. Pivot class trim.
Stair flight, ladder, ramp Kit Traversal geometry measured against grid.stairRiser, grid.stairGoing and grid.stepHeight. Pivot class stair, which tiles along a DIAGONAL rather than an axis, so the seam check has no axis for it and says so.
Facade assembled from panels, trim and inserts Kit The PARTS are Kit assets. The assembly is a prefab with its own Descriptor and no mesh of its own (PRF001 exempts it by name), so there is no category question to answer twice.
Staircase, ladder, ramp Kit Traversal geometry measured against grid.stairRiser, grid.stairGoing and grid.stepHeight, tiling along a run.
Fence, railing, gate Kit Already a pivot class. Tiles along a run, so it is a kit piece even when the kit is only fences.
Pipes, cables, ducting runs Kit Authored as tiling runs against the grid, not as objects.
Built-in counter or cabinetry Kit Snaps to the wall segment, ships with the room kit. The freestanding version of the same thing is a Prop, and it is a second mesh.
One-off building, landmark, statue Prop Modelled whole, tiles against nothing, snaps to nothing. It used to be Environment and it is not a Kit, so it is a Prop, and being large it declares its own vertexDensity tier.
Tree, world-scale foliage Prop Nature at level scale is still a standalone object. SubCategory Nature, and declare the environment tier. MSH007's default would give a tree four times the density it should have.
Cliff face, boulder formation Prop Same. It is terrain-shaped, but nothing about it tiles or snaps. Declare the architecture tier for anything at that size.
Fist-sized rock Prop Also a Prop, and this is the point: the old ladder split these two and the new one does not need to.
Potted plant Prop Stands on a surface, ships on its own.
Street lamp, hydrant, bolted bench Prop Fixed street furniture used to be Environment on the strength of being bolted down. Bolted down is not a modular set, so it is a Prop, unless it genuinely ships as part of a street kit. Then it is Kit and named for the Set.
Loose indoor bench or stool Prop Was always a Prop and still is.
Water body in a level Prop Unless it is a set of tiling water pieces, which would be Kit. However it is shaded does not enter into it.
Splash, ripple, spray Effect Geometry a VFX graph drives. Step 2.
Painting, rug, curtain Prop Dressing attached to architecture is still dressing. It carries no structural load and no snap.
Hanging shop sign Prop Unless it ships as a piece of a building kit, in which case it is Kit and named for the Set.
Wall-mounted torch or sconce Prop It hangs on the wall; it is not a piece the wall is built from. The carried version is the same mesh and the same category now, which is one fewer asset than this row used to require.
Coin, key, collectible pickup Prop Nothing above claims it.
Worn backpack, hat, cloak Character Skinned to the rig it is worn on. Deforms, therefore Character.
First-person arms Character A rig with no body is still a rig.
Bread, cake, food on a shelf Prop Set dressing, and it stays one mesh even when a character is animated holding it.
Decal mesh (blood, grime, poster geo) Effect Geometry a projector drives. The texture on it is Cutout, not Surface.
Trim-sheet-textured kit piece Kit The texture category does not decide the model category. A TTrim sheet on an SMKit piece is the normal case.

Which texture category is it

Same shape of question, one level along, and the same answer: a ladder, read top to bottom, first
yes wins.

Which texture category

Id Rule Severity Value
CAT002 Texture is not in the category the texture ladder puts it in info

Read top to bottom and stop at the first yes.

# Ask Then it is
1 Is it drawn in screen space, like UI, an icon, or a 2D element with no world surface behind it? Sprite
2 Is it read by a particle system or a VFX graph rather than by a surface shader? Effect
3 Does it carry no colour of its own? Is it a mask or a lookup a shader reads OVER another texture? Mask
4 Is it one sheet a whole kit maps bands of, rather than a texture for one object? Trim
5 Does alpha cut its silhouette? Would it read as a rectangle without it? Cutout
6 Anything still here. Surface
  • Two answers still standing: take the one HIGHER on the ladder, the same as for models.
  • The texture category does not follow the model category and never has. A TTrim sheet on an SMKit piece is the normal case, and a Prop can carry a Cutout.
  • A map's ROLE is not its category. Albedo, Normal, Roughness and the rest are the RoleSuffix. Every category ships the maps it needs, and T_Surface_Wallpaper_01_Normal is a Surface texture whose role is Normal.
  • Ask what reads it, not what it shows. The same painted leaf is Cutout on a foliage card, Effect as a flipbook frame in a leaf-fall effect, and Mask if a shader only ever samples one channel of it.

Sprite

Anything drawn in screen space: UI, icons, frames, crosshairs, 2D art.

  • Test. Is it scaled to a rect on screen rather than mapped to a surface in the world?
  • Includes. Buttons and panels · Icons · Frames and borders · Crosshairs and reticles · 2D art and portraits
  • Authoring. texelDensity exempt, maxResolution 2048

Effect

A texture a particle system or VFX graph reads: flipbooks, noise fields, gradients, distortion and motion vectors.

  • Test. Is it sampled by an effect graph rather than by a surface shader?
  • Includes. Flipbook sheets · Noise fields · Colour ramps and gradients · Distortion offsets · Motion vectors · Soft particle sprites
  • Authoring. texelDensity exempt, maxResolution 2048, requirePowerOfTwo true

Mask

A texture with no colour of its own, read over another one: damage, edge wear, RGB tint masks, blend masks.

  • Test. Does a shader read a CHANNEL of it to modulate something else, rather than showing it?
  • Includes. Damage and wear masks · Edge masks · RGB tint masks (see texture.rgbMask) · Blend and vertex-blend masks · Opacity masks read separately from a surface
  • Not. A packed PBR texture is not a Mask. It is part of a surface and ships as TSurface_01_Packed. Mask is for a map read on its own, over a material it is not part of.
  • Authoring. requiredMaps none, sRGB false

Trim

One sheet a whole modular set shares, laid out in strips that pieces map bands of.

  • Test. Do several different meshes map different bands of this one sheet?
  • Authoring. texelDensity trim, sharedPerSet true

Cutout

A surface whose silhouette is cut by alpha. Without the alpha it reads as a rectangle.

  • Test. Is the shape of the thing in the alpha channel rather than in the mesh?
  • Includes. Leaf and foliage atlases · Grass and fern cards · Ivy and vine sheets · Chain-link, grating and lattice · Torn paper, netting, lace · Cobwebs
  • Not. A leaf sheet a particle system drives is Effect, because step 2 caught it first. A leaf texture a shader only samples one channel of is Mask.
  • Authoring. texelDensity as declared, requiredMaps Albedo, Roughness, Normal, alpha opacity only

Surface

An ordinary opaque surface. The default, and the one every other category is defined against.

  • Test. Anything the five questions above did not claim.
  • Includes. Tiling material surfaces: brick, plaster, grain, cobblestone · Baked object textures for a single mesh · Anything opaque, mapped to geometry, read by a surface shader
  • Authoring. texelDensity by tier, requiredMaps Albedo, Roughness, Normal

Settled texture edge cases

Thing Category Why
Leaf atlas, foliage card, grass card Cutout Alpha cuts the silhouette. Step 5 before step 6, so it is never Surface.
Falling-leaf flipbook for a particle system Effect Step 2 catches it before the alpha question is asked. What reads it decides.
Bark, tree trunk surface Surface Opaque. The silhouette is the mesh's.
Leaf colour-variation mask Mask No colour of its own; a shader samples a channel of it over the albedo.
Smoke, fire, spark sheet Effect Read by a VFX graph. TEX008 owns its grid.
Noise field, gradient ramp, distortion map Effect Same reason. The role suffix says which, the category says who reads it.
Kit-wide strip sheet Trim Several meshes map bands of one sheet. Named for the Set.
Baked texture for one prop Surface An ordinary surface that happens to be unique to one mesh. T_Surface_OldChair_01_Albedo.
Packed metallic/AO/detail/roughness map Surface Part of a surface, not a mask over one. Its role suffix is Packed.
Rust, grime, damage overlay Mask Read over a base material. T_Mask_Rust_01 over a steel material, never T_Surface_Rust_01 standing alone.
UI button, icon, frame, crosshair Sprite Screen space. Lives in Exported/Images/UI, not in the texture roots.
Decal texture (blood, poster, grime patch) Cutout A projector needs the alpha to know where the decal stops. The MESH it projects onto is the Effect category; the texture is not.
Chain-link fence, grating, lattice Cutout The holes are in the alpha, not in the geometry.
Skybox, cubemap Surface Nothing above claims it, and step 6 is the catch-all. It declares its own resolution; the density formula does not apply and nothing pretends it does.

When a name is rejected

Every rule has an id, so an error message, this page and a suppression in exceptions.json all name
the same thing.

Naming rule ids

Id Meaning Severity
NAM001 Name does not match the naming grammar warning
NAM002 Unknown type prefix warning
NAM003 Token value is not in its allowed list warning
NAM004 Token does not match its required format warning
NAM005 Required token is missing warning
NAM006 Name has more segments than the grammar allows warning
NAM007 Name contains spaces or unsafe characters warning
NAM009 Name is longer than the maximum length warning

These are all warnings today. They report, they do not block. They harden to errors once the
existing backlog is cleared.

That is true of the naming rules specifically. Some mesh rules are already errors and block an
export. → Modular 3D Assets > What blocks an export