“It rendered flawlessly in Maya. Unreal Engine 5 disagreed.”
Key takeaways
The gap between “looks good in a modeling package” and “works in engine” is one of the most common causes of late-stage rework in 3D game art production.
Nanite loosens polycount rules for eligible static meshes in Unreal Engine 5, but skeletal meshes, masked materials, and foliage still need defined triangle budgets.
UV layout, including overlap rules, padding, lightmap channels, and texel density, needs to be specified before production, not assumed.
Naming conventions matter less for which prefix is chosen and more for consistency and documentation across the whole delivery.
LOD tier count, generation method, and transition thresholds should be defined per asset category, not decided during delivery.
Texture compression differs by platform and engine. Confirm formats, power-of-two sizing, and channel packing before texture work begins.
3D Modeling Specs That Actually Match Your Game Engine: A Practical Checklist
“It rendered flawlessly in Maya. Unreal Engine 5 disagreed.”
A character model can look perfect in Maya or Blender: clean topology, a strong silhouette, a portfolio-ready render. Then it lands in Unreal Engine 5 or Unity, and the cracks show. LODs pop at the wrong distance. A normal map bakes wrong on one UV shell. The texture budget blows past what the platform can handle. Somewhere, the 3D modeling specs were never fully defined.
That gap rarely shows up during review. It shows up after import, close to a milestone deadline, when there is no cheap fix left. This checklist covers the technical requirements that decide whether a 3D asset is engine-ready, not just portfolio-ready:
- Polycount and geometry, including what Nanite actually changed
- UV layout
- Naming conventions
- LOD setup
- Texture formats for Unreal Engine 5 vs Unity
Share it with your team, or hand it directly to a production partner before the next batch goes into production.
Why “Looks Good in the Viewport” Isn’t the Same as “Works in Engine”
![]()
A modeling package does not enforce a real-time budget. Maya, Blender, and ZBrush will happily render a ten-million-polygon sculpt at a smooth frame rate. Nothing competes for GPU time or memory. A game engine works differently. It fits hundreds of assets, lighting, physics, and gameplay logic into one fixed frame budget, on one specific platform.
That difference shows up in predictable places:
- Polygon budgets are set by platform performance targets, not by how detailed a model can look.
- Texture memory is constrained by platform and compression format, not by source file resolution.
- UV layout affects lightmap baking and shading in ways a viewport render never reveals.
- Units, scale, and pivots differ between engines, and a mismatch causes visible import errors.
- LOD requirements only become obvious once dozens of assets share a scene.
None of this shows up in a turntable render. It shows up once the asset sits inside the project, usually after the team has moved on to the next batch.
Polycount and Geometry: What Nanite Changed (and What It Didn’t)
![]()
Unreal Engine 5’s Nanite lets many static meshes render at very high polygon counts in real time. That is a real shift for environment and prop work, not marketing language. It is not a blanket exemption, though.
Traditional polycount budgets still apply to:
- Skeletal meshes. Characters and any rigged, animated geometry.
- Masked materials. Common in stylized, alpha-cutout art styles.
- Foliage. Subject to the same masking limitation.
Unity has no direct equivalent to Nanite. Projects built in Unity, or shipping on both engines, should assume conventional polycount budgets apply across the board.
Never assume “Nanite means no budget” covers an entire project. Define triangle budgets per asset category. Specify which categories use Nanite-enabled static meshes, and set explicit limits for skeletal meshes and masked or foliage materials. This belongs in the production brief, set per project, platform, and engine. A universal polycount number does not exist.
UV Layout Rules That Prevent In-Engine Problems
UV layout is one of the least visible parts of a brief. It is also one of the most common sources of late-stage rework.
- No unintended overlaps. Overlapping UVs should only happen when mirroring is intentional and documented. An accidental overlap breaks unique lightmap or ambient occlusion bakes.
- Padding between shells. UV shells need margin so mipmapping does not bleed one texture into a neighboring shell at a distance.
- A dedicated lightmap channel. Projects baking static lighting usually need a second UV channel, kept separate from the one used for material textures.
- Consistent texel density. Texture resolution per unit of surface area should stay consistent across assets in the same scene. The exact target depends on platform and viewing distance, so document it per project.
- Seams that follow the silhouette. Place seams on natural breaks and avoid stretching on camera-facing, hero-visible surfaces.
Naming Conventions and File Organization
Naming conventions look like a minor detail. Then two hundred assets arrive with inconsistent file names, and someone has to manually sort meshes from materials before anything can import.
| Asset type | Typical tag |
|---|---|
| Static mesh | Prefix (for example, SM_) |
| Skeletal mesh | Prefix (for example, SK_) |
| Material | Prefix (for example, M_) |
| Base color / normal texture | Suffix (for example, _BC, _N) |
| Packed texture (occlusion, roughness, metallic) | Suffix (for example, _ORM) |
Exact tags vary by studio and engine convention. What matters is that both sides use the same one. It should cover meshes, materials, textures, and folder structure, and it should be written down before production starts, not improvised asset by asset. A consistent convention:
- Lets an engine’s import pipeline auto-assign materials correctly
- Lets build tools track asset versions
- Lets a technical art lead audit an incoming batch without opening every file
LOD Setup: What to Deliver and What the Engine Expects
![]()
A level of detail (LOD) system swaps a full-resolution mesh for a lower-poly version as it moves away from the camera. Skip it, and a scene full of high-detail assets can quietly overwhelm a platform’s budget, even when each asset looked fine on its own.
Unreal Engine 5 auto-generates LODs through built-in mesh reduction. It also accepts hand-authored LOD meshes for hero assets, where automatic reduction would damage the silhouette.
Unity handles LODs through the LOD Group component, with explicit transition thresholds set per asset or as a project-wide convention.
Define this before production, not during delivery:
- How many LOD tiers a given asset category needs
- Whether tiers are auto-generated or hand-authored
- Roughly what screen size triggers each tier
A background prop and a hero character need different answers to all three. That belongs in the brief, not left for the outsourcing team to guess.
Texture Formats for Unreal Engine 5 vs Unity
Texture compression format is one of the more overlooked technical requirements. It is also one of the easiest to get wrong, until a build fails or memory usage spikes.
| Platform | Format | Typical use |
|---|---|---|
| PC / console | BC7 | Albedo and high-fidelity color |
| PC / console | BC5 | Two-channel normal maps |
| PC / console | BC4 | Single-channel masks |
| Mobile (modern devices) | ASTC | Preferred compressed format |
| Mobile (fallback) | ETC2 | Older Android devices without ASTC support |
Both engines support these formats, but configuration differs. Unity sets compression per platform through texture import overrides. Unreal ships multiple platform-specific variants and selects automatically at build time. A texture can look correct under an engine’s default settings and still fail to compress, or balloon in memory, if the platform override was never set.
Confirm before texture work begins:
- Target platforms
- Power-of-two dimensions, still the safest default across both engines
- Which channels get packed together, such as occlusion, roughness, and metallic in one texture
Turning This Into Specs Your Production Partner Can Use
None of this is useful in isolation. It becomes useful once it is written down, in a document a production partner can check work against. A practical spec sheet should cover:
- Target engine and version
- Target platforms
- Polycount budgets per asset category, and whether Nanite or an equivalent applies
- UV requirements, including lightmap UV needs
- Naming convention for meshes, materials, and textures
- LOD tier requirements per asset category
- Texture format and resolution targets per platform
A complete brief that includes these specs from day one is the single biggest lever against in-engine surprises. Most production risks that surface late trace back to a technical gap nobody wrote down, the same pattern behind late milestone slippage.
What to Do Before Your Next Production Batch
![]()
Pull your last few in-engine bugs. Check whether they trace back to a missing spec, not an art quality issue. Most of the time, they do.
If you already have a spec sheet, confirm it is current for this engine version and these platforms, not the last project’s. If you do not have one, that is the gap to close before your next brief.
If you are preparing to brief an outsourcing studio, get in touch with your target engine and platforms. Start the conversation from your actual technical requirements, not a generic scope.
There is no universal number. It depends on asset category, target platform, and whether the asset qualifies for Unreal Engine 5’s Nanite system. Budgets should be defined per asset type in the production brief, with separate targets for static meshes, skeletal meshes, and masked or foliage materials.
No. Nanite significantly loosens polycount constraints for eligible static meshes, but it does not apply to skeletal meshes, masked materials, or foliage. Those categories still need explicit triangle budgets, and Unity projects need conventional polycount discipline across all asset types.
PC and console projects typically use BC7 for color textures, BC5 for normal maps, and BC4 for masks. Mobile projects typically use ASTC as the preferred format on modern devices, with ETC2 as a fallback for older Android hardware. Both Unreal Engine 5 and Unity support these formats, but the platform override settings need to be configured correctly for each target.
Modeling software does not enforce a real-time performance budget. Issues with polycount, UV layout, LOD setup, or texture compression often stay invisible until the asset is inside the engine, competing for GPU time and memory with everything else in the scene.
It should cover asset-type prefixes for meshes and materials, suffixes for texture maps such as color, normal, and packed channel textures, consistent folder structure, and version or variant tags where relevant. The specific convention matters less than making sure it is documented and used consistently across the whole delivery.