Every hour you spend debugging a broken normal map, mis-scaled mesh, or missing LOD inside the engine is an hour you should have caught at the source. A tight pre-import game-ready 3D asset checklist turns those reactive firefights into a fast, repeatable quality gate you run once before the asset ever touches Unity or UE5.
Geometry and topology checks
The geometry layer is the foundation — errors here cascade into broken lighting, collision misfits, and LOD pop that are painful to diagnose in-engine.
Geometry checklist:
- Face normals outward: enable Overlays → Face Orientation in Blender viewport (blue = correct, red = inverted). Fix with Mesh → Normals → Recalculate Outside
- No N-gons on deforming surfaces: quads and tris only on skinned meshes; N-gons are acceptable on hard-surface static props that never deform
- No floating vertices or zero-area faces: run Mesh → Clean Up → Merge by Distance (0.0001 m threshold) before every export
- Scale applied: in Blender, Ctrl+A → All Transforms before export — Unity and UE5 both misread scale on objects with unapplied transforms
- Origin at logical anchor point: world base for props, bone root for characters, grip point for weapons — not floating in space
- Poly count within engine budget: mobile hero ≤ 3K tris, PC/console hero ≤ 25K tris, background props ≤ 500 tris
![]()
UV and texturing quality gates
UV errors don't surface until you bake lightmaps or receive art from a collaborator, at which point they cost significantly more to fix than they did to prevent.
| Gate | How to check | Pass criteria |
|---|---|---|
| No UV overlap (lightmap channel) | Blender UV Editor → Select All → check overlaps | Zero overlap in UV Channel 1 |
| Consistent texel density | UV → Display → Texel Density overlay | ≤ 10% variance across mesh |
| All UVs inside 0–1 space | UV Editor → View → Statistics | All islands inside unit square |
| Seams hidden in low-visibility areas | Visual inspection | No seams on front-facing hero surfaces |
| sRGB disabled on non-colour maps | Engine import settings | Normal, roughness, AO: sRGB off |
The normal map tangent space gate catches a common cross-engine pitfall: OpenGL tangent space (green channel Y-up) is correct for Unity and Godot 4; DirectX tangent space (green channel Y-down) is correct for UE5. Wrong tangent space looks like surface lighting inverting on curved geometry — it appears as dark holes or inside-out shading that worsens at grazing angles.
![]()
Rigging and skinning validation
Skip this section for static props. For any skeletal mesh, these gates catch issues that silently break retargeting and animation:
- Bone naming convention matches target engine: UE5 retargeter expects `root` at hierarchy root; Unity Humanoid expects `Hips`. Mismatches break auto-mapping in the retarget setup
- Weight sum = 1.0 per vertex: enter Weight Paint mode and check for black (unweighted) vertices — they collapse to world origin on import
- Max 4 bone influences per vertex: both Unity and UE5 enforce this hard limit. Use Blender's Data Properties → Vertex Groups → Limit Total to clean excess influences before export
- No IK or constraint bones in the export: bake all IK to FK using Action → Bake Action → Clear Constraints — constraint objects export as inert bones that inflate skeleton complexity
- Rest pose matches bind pose: T-pose or A-pose must be consistent between Blender and the engine's expected bind pose for animation retargeting to produce correct results
```python
# Blender Python: flag vertices with weight sum below 1.0
import bpy
obj = bpy.context.active_object
for v in obj.data.vertices:
total = sum(g.weight for g in v.groups)
if total < 0.99:
print(f"Vertex {v.index}: weight sum {total:.4f} — needs correction")
```
Export settings and engine import verification
The final gate is the GLB or FBX export itself. Settings here override everything upstream.
GLB export checklist (Blender File → Export → glTF 2.0):
- Apply Modifiers: enabled — bakes subdivision, mirror, and array modifiers
- +Y Up: enabled for Unity and Godot; disabled for UE5 (which uses Z-up natively)
- Draco compression: disabled unless you have confirmed engine support — Godot 4 supports it natively, Unity 2022+ requires the glTF package, UE5 does not support it without a plugin
- Embed textures: enabled for single-file delivery to avoid broken relative paths
- Materials → Export Materials: PBR Extensions checked
In-engine import verification (30-second check):
1. Drop the asset next to a 1.8 m reference cube and confirm scale is correct
2. Enable vertex normal display — look for smoothing groups that produce hard edges where soft ones are expected
3. Open the material instance — confirm all texture slots populated and sRGB settings match your export
4. Run a quick lightmap unwrap or lighting build to expose UV Channel 1 overlaps immediately
Free assets from the BitSoul marketplace already pass all geometry, UV, and material gates — use them as clean reference benchmarks when calibrating your own pipeline and identifying which gate your in-house assets are failing.
Start your next project from pre-validated game-ready models at bitsoulhosting.com/marketplace, or run this checklist against every asset you import to catch issues before they compound.
---
*This post is part of the Ultimate Guide to Free 3D Game Assets — BitSoul's complete reference for formats, texturing, rigging, optimization, and engine integration.*