← Previous: Scene Doctor | Next: One-Click Optimize →
Overview
Scene Doctor includes 49 built-in audit rules organized across 17 categories.
All thresholds dynamically adapt to the currently selected platform profile (see Profiles & Settings). Rule IDs are permanent and stable: they are used by the false-positive ignore system, the disabled rules registry, CI logs, and exported reports.
Fix Safety Legend:
<span class="badge safe">Safe (S)</span>: Non-destructive import or render setting modification with zero visual or gameplay side effects.
<span class="badge moderate">Moderate (M)</span>: Setting or geometry adjustment with minor visual or structural impact; review recommended.
—: Advisory diagnostic rule without an automated one-click fix (requires manual design decision or baking).
See Fix Safety Levels for more information.
1. Textures
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
texture.uncompressed | Uncompressed Textures | RGBA/RGB textures loaded without hardware block compression (ASTC/ETC2/DXT), consuming 4–8× more VRAM. | Compress (Safe). Applies the active platform override to the recommended compressed format without altering source files. |
texture.oversized | Oversized Textures | Texture resolution exceeds the active platform profile’s max texture limit. | Clamp to {budget}px (Moderate). Lowers Max Size for the active build target only. |
texture.read-write | Read/Write Enabled Textures | CPU-side texture buffer retained in RAM, effectively doubling memory usage; only necessary for GetPixels()/SetPixels(). | Disable Read/Write (Moderate). Disables the Read/Write flag on the asset importer. |
texture.no-mipmaps | 3D Textures Without Mipmaps | Textures on 3D objects lack mipmaps, causing high-frequency shimmering at distance and wasting texture memory cache bandwidth. | Generate Mipmaps (Safe). Enables mipmap generation on the asset importer. |
texture.normal-map-type | Normal Maps Imported as Default | Textures assigned to material normal map slots are configured as generic Default color textures, causing incorrect surface lighting vectors and improper compression. | Set Type: Normal Map (Safe). Updates the texture type to Normal Map. |
texture.npot | Non-Power-of-Two Textures | Non-power-of-two (NPOT) texture dimensions that may fail compression or prevent mipmap generation on specific mobile GPUs. | Scale To Nearest POT (Moderate). Configures the importer to scale to the nearest POT resolution. |
texture.duplicates | Duplicate Textures | Identical image assets imported multiple times into the project under different paths. | Use Single Copy (Moderate). Remaps referencing materials to a single canonical texture asset. |
2. Meshes & Lightmap UV
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
meshes.read-write | Read/Write Enabled Models | CPU mesh copy enabled when not required by runtime procedural manipulation. Automatically skips meshes referenced by MeshCollider or particle shapes. | Disable Read/Write (Moderate). Disables Read/Write on the ModelImporter. |
meshes.unused-tangents | Tangents Without Normal Maps | Mesh models importing vertex tangent channels (16 bytes/vertex) when no scene material utilizes normal mapping. | Skip Tangents (Moderate). Sets Tangents import mode to None. |
meshes.high-poly-no-lod | High-Poly Meshes Without LOD | Densely tessellated meshes rendered at full polygon detail regardless of camera distance. | Generate LODs (Moderate). Creates Burst-decimated LOD1/LOD2 meshes and configures a LODGroup. Shared meshes share generated LODs. |
meshes.index-format | 32-bit Index Buffers | Meshes containing under 65,536 vertices configured with 32-bit index buffers instead of 16-bit indices. | Use 16-bit Indices (Safe). Converts index buffer format to 16-bit. |
meshes.missing-lightmap-uv | Missing Lightmap UVs | GameObjects marked with Contribute GI lacking secondary UV2 channels for lightmap baking. | Enable Generate Lightmap UVs (Safe) on model importers; Generate UV2 (Safe) for .asset mesh data. |
3. Rendering & Batching
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
rendering.gpu-instancing | GPU Instancing Disabled | Identical meshes rendered repeatedly across the scene with instancing disabled and the SRP Batcher inactive. | Enable Instancing (Safe). Enables GPU Instancing on the shared material. |
rendering.duplicate-materials | Duplicate Materials | Duplicate material instances with identical shader properties and textures that break batching opportunities. | Use Single Material (Moderate). Remaps renderers to a single canonical material asset. |
rendering.missing-static | Non-Moving Props Not Marked Static | Non-moving environment props without scripts, animators, or rigidbodies that lack static flags. | Mark Static (Moderate). Applies Batching Static and Occluder/Occludee Static flags. |
4. Shadows & Lighting
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
shadows.small-caster | Small Shadow Casters | Renderers whose bounding dimension is smaller than the platform’s shadow caster threshold that still cast shadows. | Disable Shadows (Safe). Sets castShadows = Off on the renderer. |
lighting.shadowed-local-lights | Shadow-Casting Point/Spot Lights | Realtime point lights (rendering 6 cubemap shadow passes per frame) or spot lights with realtime shadows enabled. | Disable Shadows (Moderate). Disables realtime shadows on the light component. |
lighting.realtime-count | Too Many Realtime Lights | Active realtime point and spot light count exceeds the platform performance budget. | — Bake lightmaps or switch lights to Mixed or Baked. |
lighting.realtime-probe-every-frame | Reflection Probes Updating Every Frame | Realtime reflection probes configured to redraw 6 cubemap faces every frame. | Refresh On Awake (Moderate). Switches probe update mode to Via Scripting / On Awake. |
lighting.missing-light-probes | Baked Lighting Without Light Probes | Scene utilizes lightmaps for static geometry but lacks a LightProbeGroup for dynamic props and characters. | — Add a LightProbeGroup component to cover the play space and re-bake. |
5. Culling
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
culling.far-clip | Excessive Camera Far Clip | Camera Far Clip distance set orders of magnitude beyond the furthest scene renderer. | Set Far Clip {n} m (Moderate). Trims camera far clip to match actual scene extents. |
culling.occlusion-not-baked | Occlusion Culling Not Baked | Scene contains static occluders but lacks precomputed occlusion culling data. | Bake Occlusion (Moderate). Initiates background occlusion bake with platform settings. |
culling.layer-distances | Layer Distance Culling | GameObjects assigned to prop layers without native per-layer cull distances configured. | Add Layer Distance Culler (Moderate). Attaches LayerDistanceCuller to the main camera. |
culling.small-objects | Small Objects Never Culled by Size | Microscopic props that continue rendering even when occupying only 1–2 pixels on screen. | Add Size Culling (Moderate). Configures single-level LODGroup with cull transition height. |
6. Colliders & Physics
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
colliders.heavy-mesh | Heavy Mesh Colliders | MeshCollider components exceeding profile triangle thresholds, or MeshColliders with no mesh assigned. | Simplify Collider (Moderate). Fits primitive (box/sphere/capsule) if watertight volume matches, or generates low-poly proxy. Remove Component (Moderate) if empty. |
physics.animated-static-collider | Animated Colliders Without Rigidbody | GameObjects with colliders transformed by Animator/Animation components lacking a Rigidbody (causes static collider tree rebuilds). | Add Kinematic Rigidbody (Moderate). Attaches kinematic Rigidbody to the animated root. |
physics.continuous-dynamic | Many Continuous Dynamic Rigidbodies | Multiple rigidbodies configured with expensive Continuous Dynamic collision detection. | Use Discrete (Moderate). Switches collision detection mode to Discrete. |
physics.settings | Physics Project Settings | Project settings configured with Auto Sync Transforms enabled, allocation callbacks enabled, or an excessively small fixed timestep. | Disable Auto Sync, Reuse Callbacks, Set 20 ms (Moderate). Updates physics configuration. |
7. Animation
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
animation.always-animate | Animators Always Animating | Animator components configured with Culling Mode set to Always Animate. | Cull Update Transforms (Safe). Sets culling mode to Cull Update Transforms. |
animation.update-when-offscreen | Skinned Meshes Updating Off-Screen | SkinnedMeshRenderer instances with Update When Offscreen enabled, computing bone matrices when invisible. | Disable (Moderate). Disables the offscreen update flag. |
8. Audio
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
audio.long-decompress-on-load | Long Clips Decompressed On Load | Audio clips longer than 10 seconds set to Decompress on Load, expanding to massive raw PCM memory buffers. | Load Type: Streaming (for clips $\ge 60$ s) or Compressed In Memory (Safe). |
audio.short-streaming | Short Clips Streaming | Very short sound effects (< 2 seconds) configured to Stream, incurring continuous disk/thread streaming overhead. | Decompress On Load (Safe). Sets load type to Decompress on Load. |
audio.stereo-3d | Stereo Clips Played in 3D | Two-channel stereo audio clips played through localized 3D spatial AudioSource emitters. | Force To Mono (Safe). Enables Force to Mono on the importer. |
audio.sample-rate | High Sample Rate on Mobile/VR | 44.1 kHz or 48 kHz audio clips targeting resource-constrained mobile or standalone VR platforms. | Optimize Sample Rate (Safe). Sets sample rate override to 22,050 Hz or platform standard. |
audio.pcm | Uncompressed (PCM) Audio | Sound assets stored in uncompressed PCM format consuming 3–10× more file and runtime memory than Vorbis/ADPCM. | Compress (Vorbis 70%) (Moderate). Reconfigures audio compression settings. |
9. Particle Systems
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
particles.cast-shadows | Particles Casting Shadows | Particle system renderers rendering into the real-time shadow map pass. | Disable Shadows (Safe). Sets shadow casting mode to Off. |
particles.max-particles | High Max Particles | Particle systems configured with excessively high Max Particles limits (> 1,000–5,000). | Clamp to {limit} (Moderate). Lowers maximum particle ceiling. |
particles.world-collision | High-Quality Particle World Collision | Particle systems performing per-particle raycasts against scene physics geometry every frame. | Medium Quality (Moderate). Switches particle collision quality to Medium / Voxelized. |
particles.always-simulate | Looping Particles Always Simulated | Looping ambient particle effects continuing to update full simulation cycles when far off-screen. | Automatic Culling (Moderate). Switches particle culling mode to Automatic Culling. |
10. UI (uGUI)
Activates automatically when com.unity.ugui is present in the project.
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
ui.raycast-target | Unnecessary Raycast Targets | Non-interactive text labels, shadows, and background images with Raycast Target enabled. | Disable Raycast Target (Moderate). Clears raycast target flag on non-interactive elements. |
ui.pixel-perfect | Pixel Perfect Canvas With Moving Content | Pixel Perfect enabled on canvases hosting moving, scaling, or scrolling content (forces frequent canvas re-layouts). | Disable Pixel Perfect (Moderate). Disables pixel perfect rendering on the canvas. |
ui.large-dynamic-canvas | Large Canvas With Dynamic Content | Monolithic canvases where frequently updated sub-elements force complete geometry regeneration of static elements. | — Move dynamic, high-frequency elements into a dedicated sub-canvas. |
11. Terrain
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
terrain.settings | Terrain Settings | Terrain pixel error, basemap distance, detail billboard distance, or tree billboard distance configured beyond platform budget. | Enable Draw Instanced (Safe), Set Pixel Error {n} (Moderate), Set Distances (Moderate). |
12. Project Settings
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
settings.urp-asset | URP Asset Settings | Inactive SRP Batcher, unnecessary HDR on mobile, excessive MSAA, oversized shadow distance or cascade counts. | Enable SRP Batcher (Safe); Disable HDR, Set MSAA, Set Shadow Distance (Moderate). |
settings.quality | Quality Settings | Excessive realtime pixel lights, unconstrained skin weights, or unoptimized shadow cascades. | Set Skin Weights (2 Bones), Configure Shadow Cascades (Moderate). |
settings.player | Player Settings | Incremental Garbage Collection disabled, or Mono scripting backend used on Android/iOS instead of IL2CPP. | Enable Incremental GC (Safe), Switch to IL2CPP (Moderate). |
13. Hierarchy & Code
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
hierarchy.missing-script | Missing Scripts | GameObjects referencing deleted or unlinked MonoBehaviour script components. | Remove Missing Scripts (Moderate). (Irreversible via journal; see History & Revert). |
hierarchy.empty-update | Empty Update Methods | MonoBehaviour scripts defining empty Update(), LateUpdate(), or FixedUpdate() callbacks called every frame by the native C++ engine. | — Remove the unused callback methods directly from the C# source code. |
| Stable ID | Rule Name | Condition & Diagnostic Check | Automated Fix Action |
|---|
budget.frame | Platform Budgets | Estimated draw calls (batches), triangles, active materials, and texture VRAM exceed the target platform profile budget. | — Provides diagnostic advice pointing to the relevant optimization tool (Combiner, Decimator, Culling, etc.). |