Skip to content

Rules

Asset Doctor runs ten built-in rules. You can disable any of them or change its severity in Project Settings > Plugins > ta Asset Doctor > Rules (see Settings). You can also add your own rules, see Custom rules.

Rule id Name in the panel Default severity Panel category Auto-fix
Naming.Convention Naming convention Warning Naming Rename
Naming.InvalidCharacters Invalid characters Warning Naming Rename (asset names only)
Path.Length Path length Warning Paths –
Path.RootFolder Content root Warning Paths –
Asset.Redirector Redirectors Warning Other Fix up redirectors
Texture.PowerOfTwo Power-of-two textures Warning Textures –
Texture.MaxSize Texture size limit Warning Textures Sets Maximum Texture Size
Texture.SuffixSettings Texture settings by suffix Warning Textures Fixes compression / sRGB
StaticMesh.MissingLODs Static mesh LODs Info Meshes –
StaticMesh.NoCollision Static mesh collision Info Meshes –

All rules read Asset Registry data, so they don’t load assets while scanning. Rules that depend on an Asset Registry tag (for example a texture’s dimensions or a mesh’s triangle count) skip assets that don’t have that tag.

In the messages below, values in angle brackets are filled in for each asset.

Checks that asset names use the prefix and suffix configured for their type in the Naming Rules table (see Naming presets).

Condition

  1. Asset Doctor picks the most specific row of the naming table that matches the asset. If no row matches, the asset is not checked. Redirectors are never checked by this rule.
  2. The name must start with one of the row’s prefixes. The comparison is case-sensitive, and the name must be longer than the prefix. A prefix that doesn’t end in _ (such as E or F) must be followed by an upper case letter: EWeaponType passes, Explosion doesn’t.
  3. If the row has a suffix, the name must end with one of the suffixes (case-sensitive) and be longer than it.

Messages

<Type> names should start with 'SM_'.
<Type> names should end with '_Float'.
<Type> names should start with 'Curve_' and end with '_Float'.

<Type> is the row’s Description (for example “Static Mesh”). Alternatives are listed with “or”, for example 'M_' or 'PPM_'. When a new name can be computed, the message ends with Suggested: <NewName> and the issue gets a rename fix. Otherwise the issue has to be fixed by hand.

Auto-fix: renames the asset in its current folder to the suggested name. See How auto-fix builds the new name. Examples with the Epic Recommended preset:

Asset Current name New name
Static Mesh Rock SM_Rock
Static Mesh S_Rock SM_Rock
Static Mesh sm_Rock SM_Rock
Skeletal Mesh SM_Hero SK_Hero

Checks asset names and folder names for characters other than A-Z, a-z, 0-9 and _. Characters listed in Allowed Extra Characters are also allowed.

Asset names: all invalid characters are listed, with spaces shown as space.

Asset name contains characters that are not allowed: space, 'ş', 'ı'. Suggested: Kaya_Tasi

Auto-fix (asset names only): renames the asset to a cleaned-up name. Common accented Latin letters are replaced with their ASCII equivalents (for example ş → s, ğ → g, ı → i, ç → c, ö → o, ü → u, ß → ss). Every other invalid character, including spaces, becomes _, without creating repeated underscores. Leading and trailing underscores are removed. Kaya Taşı becomes Kaya_Tasi.

Folder names: the folders of the asset’s path are checked, except the mount point (such as /Game). Only the first folder with invalid characters is reported:

Folder 'Yeni Klasör' contains characters that are not allowed: space, 'ö'. Rename the folder.

Folder issues have no auto-fix. Rename the folder in the Content Browser. The folder issue is reported for every asset in that folder.

Checks the length of the package name, for example /Game/Characters/Hero/SK_Hero (29 characters). Long package names can exceed the Windows path limit when cooking and packaging.

Condition: the package name is longer than Max Package Path Length (default 140).

Package path is <length> characters long (limit <limit>). Shorten folder or asset names.

Auto-fix: none.

Assets should be organized in folders, not placed directly in /Game.

Condition: the asset’s folder is exactly /Game. Assets in the root of other mount points (for example plugin content) are not reported.

Asset is in the Content root folder. Move it into a subfolder.

Auto-fix: none.

Redirectors are left behind when assets are moved or renamed. They should be fixed up so references point to the real asset.

Condition: the asset is a redirector.

Redirector found. Fix up redirectors to update references and delete it.

Auto-fix: runs Unreal’s redirector fix-up on the redirectors. Referencing assets are updated and the redirectors are deleted. In the editor, source control may ask you to check files out.

This rule’s issues appear in the Other category of the panel.

Non power-of-two textures get no mipmaps and can’t stream.

Condition: a 2D texture whose imported width or height is not a power of two. The texture is not reported when:

  • Ignore UITextures for Power Of Two is enabled (default) and the texture is in the UI texture group, or
  • its Power Of Two Mode is set to anything other than None, so the engine pads or stretches it to a power of two.

Disabling mipmaps does not silence the rule, because the importer sets “no mipmaps” on non power-of-two textures automatically.

Texture is <width>x<height>. Non power-of-two textures can't stream and usually have no mipmaps (aliasing, wasted memory). Use the UI texture group for UI art.

Auto-fix: none.

Finds textures above the project’s size limit.

Condition: a 2D texture whose larger imported dimension is greater than Max Texture Size (default 4096). The texture is not reported if its own Maximum Texture Size is already set to a value greater than 0 and not above the limit.

Texture is <width>x<height>, above the project limit of <limit>. The fix sets Maximum Texture Size (source is kept).

Auto-fix: sets the texture’s Maximum Texture Size to the limit. The source data is not changed, so you can undo this later by changing the setting back. The texture is left unsaved so you can review it.

Checks that a texture’s settings match the suffix in its name.

Condition: applies to 2D textures. The suffix is the part of the name from the last underscore, for example _ORM in T_Rock_ORM. Names without an underscore after the first character are skipped. The suffix is compared case-insensitively with the suffix lists in the settings, in this order:

Suffix list Reported when Message
Normal Map Suffixes (_N, _Normal, _NRM) Compression Settings is not Normalmap Normal map ('<suffix>') uses <compression>; it should use the Normalmap compression setting.
Linear Suffixes (_R, _ORM, _Mask, …) sRGB is enabled Mask/data texture ('<suffix>') has sRGB enabled; data textures must be linear.
Color Suffixes (_D, _BC, _BaseColor, …) sRGB is disabled and the compression is not an HDR format Color texture ('<suffix>') has sRGB disabled; colors will look washed out.

HDR color textures are skipped because they are linear by design. See Settings for the full default suffix lists.

Auto-fix:

  • Normal maps: sets Compression Settings to Normalmap and disables sRGB. If the texture group is World, it is changed to WorldNormalMap.
  • Data and mask textures: disables sRGB.
  • Color textures: enables sRGB.

The texture is left unsaved so you can review it.

Dense static meshes without Nanite should have LODs, which matters most on platforms where Nanite isn’t used (for example mobile and VR).

Condition: a static mesh with Nanite disabled, a single LOD and at least Min Triangles for LODs triangles (default 1000).

Static mesh has <N> triangles, a single LOD and Nanite disabled. Add LODs or enable Nanite.

Auto-fix: none. The default severity is Info, so these issues don’t lower the project health score.

Finds static meshes without simple collision.

Condition: a static mesh with no simple collision shapes whose Collision Complexity is not “Use Complex Collision As Simple”.

Static mesh has no simple collision shapes.

Auto-fix: none. The default severity is Info. Meshes that intentionally have no collision (for example decorative meshes) are expected to show up here; disable the rule or lower its severity if it’s not useful for your project.