Mobile Midcore Game Development
Midcore—zone of maximum engineering stress in mobile gaming. Client expects meta-layer: progression, guilds, season pass, PvP leagues. Simultaneously works on Unity 2022 LTS on Snapdragon 680 without FPS drops and cold start under 4 seconds. Casual solutions don't scale, AAA architecture overkill. Must design system growing with monetization without breaking on new content addition.
Where Midcore Projects Fail Most
Most common fail point—progression system designed as Excel spreadsheet, not code. Balance recorded in ScriptableObject or local JSON, game launches—three months later discover adding new unit type impossible without rewriting four systems. Seen projects where UnitConfig contained 47 boolean flags, entire logic via if (isElite && hasBuff && !isFrozen). Doesn't work at 200 unit types.
Second pain point—network layer in PvP and co-op. Simple HTTP REST for real-time combat causes client and server diverge at 150ms delay by 3–4 steps. Client prediction without server validation—cheats. Server validation without rollback—jitter. Need Photon Fusion with state synchronization, or Mirror with deterministic physics (Deterministic Lockstep) where clients replay same commands same order.
Third problem—memory. Unity Addressables with wrong groups leaves previous scene in memory on level load. iPhone 12 tolerable. Android low-end 2GB RAM—OOM crash. Explicit lifecycle via Addressables.ReleaseInstance and proper bundle split: UI atlases separate, characters separate, environment separate.
How Midcore Architecture Structured
For midcore we use Entity Component System (ECS) via Unity DOTS or Arch for game simulation, separate MonoBehaviour layer for UI and visuals. Game logic (stats, buffs, AI, projectile physics) in ECS—deterministic and performant on job threads. Canvas, Animator, VFX—stays in Mono.
Meta-layer (inventory, progression, social) as separate domain with clear boundaries. Typical structure:
GameCore/
ECS/ -- combat simulation (DOTS)
Systems/ -- GameplayLoop, SpawnSystem, CombatSystem
Data/ -- ScriptableObject configs + Firebase remote config
Meta/
Inventory/
Progression/ -- XP, levels, unlocks
Social/ -- guilds, leaderboards (Google Play Games SDK / GameKit)
Network/
Photon/ -- real-time PvP
REST/ -- meta operations (purchases, saves)
Remote Config via Firebase—mandatory for balance. All numeric params: damage, upgrade cost, drop chances—in Remote Config, not build. Allows patching balance without store update.
Monetization: Unity IAP for purchases + ironSource or AppLovin MAX for ads with mediation. Important: iOS needs proper SKPaymentTransactionObserver handling—pending on interrupted internet must restore next launch, or Apple rejects per 3.1.1 guideline.
Case: 50v50 Battle and Renderer Overheating
One project—midcore strategy 50v50 combat—budgetAndroid CPU overheated after 8 min continuous. Profiler: 6ms per frame for SkinnedMeshRenderer.Update on 100 units. Solution—GPU Instancing for static meshes + GPU skinning via Compute Shader for distant units (distance > 15 units). Close units—normal skinned mesh. Distant—billboard or simplified vertex shader animation. CPU render time dropped 6ms to 1.8ms, temperature stabilized.
Timeline and Process
Midcore game from scratch—6–14 months depending on meta systems and content volume.
| Stage | Timeline |
|---|---|
| Preproduction: GDD, architecture, prototype core | 4–6 weeks |
| Alpha: basic mechanics, meta v1, network | 3–5 months |
| Beta: content, balance, monetization, LiveOps infra | 2–4 months |
| Soft launch + metric iterations | 1–2 months |
Cost estimate—after GDD analysis and technical requirements. Critical understanding multiplayer volume: real-time PvP or async—significantly different workload.
Common Costly Mistakes
-
PlayerPrefsfor critical progression. PlayerPrefs not atomic—crash between writes loses state. Need Cloud Save (Play Games SDK, Game Center) or own server with idempotent ops. - No analytics day one. Firebase Analytics or GameAnalytics must connect before soft launch, else no D1/D7/D30 baseline.
-
Hardcoded localization. Texts in code—adding language painful. Use Unity Localization Package with
LocalizedStringand tables. - Single build for all platforms. iOS and Android differ: texture compression (ASTC vs ETC2), memory limits, store guidelines. Scripting Define Symbols and Platform-specific Asset Variants—not optional.







