Mobile Game Development with Unity
Unity is the most widespread platform for mobile games. Not because fastest or cheapest to develop, but Asset Store, vast ecosystem of plugins, C# known by most developers. This lowers entry barrier and prototyping time. But production mobile Unity—constant battle with memory, battery, device overheating.
Project Architecture
For moderate-complexity mobile games use MVVM + Services without full ECS. Unity DOTS (Entity Component System) delivers max performance but requires experience with Burst Compiler, Jobs System, NativeArray—overkill for most mobile projects up to arcade level.
Manage state via Zenject (DI container) or VContainer (lighter alternative). Gives testable architecture: each service (AudioService, ScoreService, InventoryService) injected via constructor, not FindObjectOfType.
ScriptableObjects for game data config—levels, enemy stats, progression params. Change balance without APK/IPA rebuild via Addressables + remote config (Firebase Remote Config or Unity Remote Config).
Performance—Main Challenge on Mobile
Draw calls and batching. Mobile GPU budget strict: 100–200 draw calls depending on device. Static geometry—Static Batching. Same materials—GPU Instancing. Dynamic objects—Dynamic Batching (works for mesh < 900 vertices). Check via Frame Debugger in Unity Editor.
Textures and memory. ASTC—compression format for iOS and Mali/Adreno on Android. No PNG 2048×2048 for 64×64 UI icons. Atlases via Sprite Atlas (Unity 2D) or manual packing. Monitor via Memory Profiler (package com.unity.memoryprofiler). Common iOS problem: Texture2D not unloads after Destroy() without explicit Resources.UnloadUnusedAssets().
Object Pooling. Instantiate/Destroy on hot path—enemy of performance. UnityEngine.Pool.ObjectPool<T> (Unity 2021.1+)—built-in pool. Bullets, enemies, particles—all via pool.
IL2CPP and AOT. Mobile builds always IL2CPP, not Mono. Reflection breaks strip level: if ReflectionProbe or custom serializer uses reflection—add link.xml with explicit preserve directives. Otherwise MissingMethodException in release build not in Debug.
Production Mobile Integrations
Ads. Google AdMob via com.google.ads.mobile—banners, interstitials, rewarded video. Unity Ads alternative. Mediation via IronSource or AppLovin MAX for eCPM maximization.
In-App Purchases. Unity IAP (package com.unity.purchasing)—single API for App Store and Google Play. StoreKit on iOS, Google Play Billing on Android. Server receipt validation mandatory—client validation bypassed via Jailbreak/Root.
Analytics. Firebase Analytics (com.google.firebase.analytics)—standard. Key events: level_start, level_end, level_fail, ad_impression, iap_purchase. Unity Analytics built-in alternative.
Crashlytics. Firebase Crashlytics—real-time crash reports. Integrates via com.google.firebase.crashlytics. Custom keys for context: Crashlytics.SetCustomKey("level", currentLevel).
CI/CD and Publishing
Fastlane for automation: gym for iOS build, supply for Google Play upload, deliver for App Store. Unity Build Automation (Cloud Build) alternative for teams without CI setup.
GitHub Actions + game-ci/unity-builder—free CI for Unity with Library-folder caching (saves 10–30 min per build).
App size. APK split by ABI—separate files for arm64-v8a, armeabi-v7a, x86_64. iOS—App Thinning automatic via Xcode. Asset Bundle Compression—LZ4 for fast loading, LZMA for minimum size.
Development Stages
Prototype (core gameplay loop) → vertical slice (one level full content) → alpha (all mechanics, unpolished) → beta (device testing, optimization) → release.
Between alpha and beta—mandatory profile on real hardware: old Android (Snapdragon 660, Mali G72) and iPhone SE 2nd gen. If stable 30 FPS on these—product ready for wide audience.
Timeline
| Game Type | Team | Target |
|---|---|---|
| Hyper-casual / casual | 2–3 people | 2–4 months |
| Midcore (RPG, strategy) | 4–6 people | 6–12 months |
| Complex mechanics, network multiplayer | 6+ people | 12+ months |
Cost calculated after GDD (Game Design Document) analysis and platform requirements.







