We create 3D environments for mobile games — buildings, props, landscapes. The main focus is performance: every module is optimized to run at 60 FPS on mid-range devices. With over five years of experience and more than 20 shipped projects, we ensure that level designers get a construction kit, not just pretty pictures.
Environment in a mobile 3D game isn't just a collection of beautiful objects. It's a system of modular meshes that a level designer can assemble like a construction set, with batched materials, proper occlusion, and a polygon budget that allows rendering an entire scene at 60fps on an iPhone 13.
Why modularity is critical for a mobile game
In Unity: Static Batching combines static objects with the same material into one draw call. Condition: identical Material instance. 50 walls from one prefab with one material = 1 draw call instead of 50. GameObjects → Static must be enabled. It increases RAM (combined meshes stay in memory), so for mobile be careful with total static geometry size.
GPU Instancing — for repeating objects (trees, rocks, plants) that may still move. One GPU call draws N copies with different transformation matrices. In Unity: Material.enableInstancing = true.
Snapping grid: all modules are built on a common grid — 1m, 0.5m, 0.25m. Snap vertices (attachment points) on module edges. In Blender, set Snap to Vertex for modeling, Unit Scale = 1.0 (not 0.01, otherwise scale won't match Unity's 1 unit = 1 meter).
Optimization techniques for environment
Occluder and occludee. Large walls, buildings should be occluders — objects that hide what's behind them. In Unity Occlusion Culling — bake data via Window → Rendering → Occlusion Culling → Bake. Objects behind walls are not rendered at all. For a mobile game with interiors (dungeon crawler, RPG) this is critical — without occlusion each room loads the GPU even if not visible.
Collision mesh. Collision should not match the visual mesh. For a complex object (gnarly tree, ruins) a simple Box/Capsule Collider is enough for gameplay, saves Physics CPU. In Unity: Mesh Collider with Convex = true for convex objects, Box/Capsule Collider for simple shapes.
Detail meshes vs terrain. Unity Terrain + Detail Meshes for grass and small vegetation — built-in system with LOD and culling. For mobile: Detail Distance no more than 30–50 units, Detail Density limited (grass with density 1.0 gives thousands of objects). Billboard detail type (flat grass texture) is faster than full 3D meshes.
Comparison of draw call optimization techniques
| Technique | Principle | When to use | Impact on FPS |
|---|---|---|---|
| Static Batching | Combine static geometry with same material | Immovable objects (walls, floors) | +20–40% (draw calls from 50 to 1) |
| GPU Instancing | One draw call for many identical objects | Repeated objects (trees, rocks) | +10–20% (many copies) |
| Occlusion Culling | Don't render objects behind occluders | Interiors, closed spaces | +30–60% depending on architecture |
How Level of Detail (LOD) affects performance
| LOD level | Polygon budget | When visible | Application |
|---|---|---|---|
| LOD0 | 100% | Close to camera | Hero props, key objects |
| LOD1 | 50–60% | Medium distance | Secondary props, most objects |
| LOD2 | 10–20% or billboard | Far distance | Filler, crowd |
Light baking
Real-time Global Illumination on mobile is too expensive. The standard is baked lighting via Unity Lightmapper (built-in or Progressive GPU Lightmapper). Lightmap Resolution 10–20 texels/unit for environment, 40+ for important objects. Lightmap Size max 2048 on mobile — several atlases for large scenes.
URP Baked Global Illumination: objects with Contribute Global Illumination participate in baking. Dynamic objects (characters) get GI via Light Probes — placed in the editor where characters move.
Ambient Occlusion for environment — via baking into texture (Substance Painter or Blender bake), not via real-time SSAO. SSAO on mobile is a luxury not in the performance budget.
How we optimize lighting
From practice: a mobile runner, Unity URP. Scene with city blocks: 300 draw calls, 35 FPS on Xiaomi Redmi 10. Problem: each modular block had its own material instance (due to random color changes in the inspector on some objects). Materials were no longer identical — static batching broke. After resetting all materials to the original shared instance: 45 draw calls, stable 60 FPS. Savings with baked lighting instead of real-time: up to 30% of the GPU budget.
Styling and level of detail
Hero props — key objects the player sees close up: chests, doors, altars. High detail, quality textures 1024×1024 or 2048×2048.
Secondary props — furniture, decor, common environment elements. Medium detail, atlas textures (multiple objects on one atlas).
Filler / background props — distant background, crowd. Minimal detail, LOD2 or billboard.
Trim sheets — one texture atlas with strips of different materials (brick, metal, wood) applied to modular meshes. Allows one atlas to cover all environment of a location. Popular in AAA development, applicable on mobile too.
How we create a modular set (step by step)
- Analyze gameplay and level layout: define room types, transitions, number of unique props.
- Design the modular block grid (floor, wall, corners, doorways) with a common snap grid.
- Model blocks in Blender with UVs for atlas and second UV for lightmap.
- Create texture atlases and trim sheets (e.g., brick, wood, metal) to reduce material count.
- Export in FBX/glTF with correct pivot points and scale.
- Import into Unity, set up static batching and occlusion culling, test draw calls and FPS.
Checklist for module acceptance
- Unified snap grid (0.5m or 0.25m)
- UV2 for lightmap
- LOD0 and LOD1
- Simple collision (Box/Capsule)
- Materials from one shared instance
- Pivot point at center of bottom edge
What's included in the work (turnkey)
- Modular geometry set for the location (floor, walls, ceilings, transitions, decor)
- Hero props with full texture set
- LOD0 + LOD1 for environment objects
- UV setup for light baking (Lightmap UV, second UV channel)
- Optimized collisions
- Export to FBX/glTF with correct pivot points
- In-engine test: Draw Calls, batching, Occlusion Culling
Timelines and cost
Modular kit for one location (20–40 unique modules) — 4–8 weeks depending on style complexity and number of hero props. Full environment for a mid-size mobile game (3–5 locations) — 2–4 months. Cost is calculated individually based on scope. We'll assess your project in 2 days — reach out for a consultation.







