Mobile Game Development with Unreal Engine
Unreal Engine on mobile—tradeoff. Nanite, Lumen, Blueprints, Niagara: AAA-level toolset. Yet hardware requirements substantially higher than Unity, APK/IPA size starts at 200 MB, thermal throttling on midrange Android appears after 10–15 min intense gameplay. Unreal on mobile chosen consciously—when photorealistic graphics or complex shaders needed that Unity can't handle without compromise.
When Unreal Justified on Mobile
Shooters with realistic graphics (PUBG Mobile uses UE4). Racing games with PBR materials. Projects where team already exists and UE content pipeline ready. For casual or arcade—Unity or Godot more economical and faster iteration.
Architecture for Mobile Target
Mobile rendering. UE5 on mobile runs on ES 3.1 / Vulkan (Android) and Metal (iOS). Nanite and Lumen unavailable—Forward Shading or Deferred only. For iOS—Metal Performance Shaders. Scalability Groups (sg.ShadowQuality, sg.TextureQuality) tune for devices: High for iPhone 14+, Medium for typical Android.
Blueprints vs C++. Fast iteration—Blueprints. Hot path (AI, physics, collisions)—C++. Call Blueprint from C++ via UFunction + BlueprintCallable. Blueprints in production compile via nativization—partial C++ conversion for overhead reduction.
GameplayAbilitySystem (GAS). For games with characters and abilities—standard. UGameplayAbility, UAttributeSet, UGameplayEffect—complex system, but complete control over states, animation interruption, cooldowns. Alternative for simple mechanics—custom component without GAS.
Performance—Critical Part
Draw calls on mobile even stricter than Unity. Mobile HDR disable for anything below iPhone 13 / Snapdragon 888. r.MobileNumDynamicPointLights 0 for midrange. r.Shadow.RadiusThreshold—remove shadows from small objects. Stat GPU in DeviceFront for on-device profiling.
Textures. ASTC for iOS and most Android GPU (Mali, Adreno). ETC2 fallback for old devices. Texture Streaming mandatory—without it entire world loads into VRAM simultaneously. r.Streaming.PoolSize—limit texture streaming pool.
Level Streaming. Don't load whole world at once. ULevelStreamingDynamic::LoadLevelInstanceBySoftObjectPtr for sublevels on demand as player moves. For linear levels—trigger volumes with LoadStreamLevel / UnloadStreamLevel.
Thermal throttling. Android—APerformanceHintManager (NDK API 31+) for CPU/GPU frequency management. In UE5—FGenericPlatformMisc::SetGamepadsConnected. Monitor temperature via UAndroidDeviceProfileSelector. iOS—os.thermal via Metal performance HUD.
Native Integrations
Google Play Billing / StoreKit—via OnlineSubsystemGooglePlay / OnlineSubsystemIOS plugins. Setup in DefaultEngine.ini:
[OnlineSubsystem]
DefaultPlatformService=GooglePlay
[OnlineSubsystemGooglePlay]
bEnabled=true
Firebase Analytics/Crashlytics—via third-party plugin (Firebase Unreal SDK by Niantic Labs or custom JNI/Objective-C bridge). No official Firebase plugin from Google for UE—important limitation vs Unity.
Admob—GoogleMobileAds plugin for UE, supports banners, interstitials, rewarded.
Building and Distribution
Android: Project Settings → Android → Minimum SDK Version—minimum API 26 for Google Play. APK or AAB (Google Play recommends). Sign via keystore in Project Settings. AAB size without aggressive optimization—300–600 MB; Play Asset Delivery for content over 150 MB.
iOS: Xcode 15+, Minimum iOS Version → 16.0 for new hardware. Metal only graphics API—iOS dropped OpenGL ES in iOS 12. arm64 only architecture for current devices. IPA size smaller than APK via App Thinning.
Timeline
| Project | Team | Target |
|---|---|---|
| Prototype / vertical slice | 2–3 people | 2–3 months |
| Mobile game with 10–20 levels | 4–7 people | 8–15 months |
| Multiplayer, complex mechanics | 6–10+ people | 15+ months |
Cost calculated after GDD analysis, visual quality requirements, and target platforms.







