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.
Summary
Section titled “Summary”| 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.
Naming.Convention
Section titled “Naming.Convention”Checks that asset names use the prefix and suffix configured for their type in the Naming Rules table (see Naming presets).
Condition
- 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.
- 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 asEorF) must be followed by an upper case letter:EWeaponTypepasses,Explosiondoesn’t. - 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 |
Naming.InvalidCharacters
Section titled “Naming.InvalidCharacters”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_TasiAuto-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.
Path.Length
Section titled “Path.Length”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.
Path.RootFolder
Section titled “Path.RootFolder”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.
Asset.Redirector
Section titled “Asset.Redirector”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.
Texture.PowerOfTwo
Section titled “Texture.PowerOfTwo”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.
Texture.MaxSize
Section titled “Texture.MaxSize”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.
Texture.SuffixSettings
Section titled “Texture.SuffixSettings”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.
StaticMesh.MissingLODs
Section titled “StaticMesh.MissingLODs”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.
StaticMesh.NoCollision
Section titled “StaticMesh.NoCollision”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.