Not all engineering is building the new thing. TerraGenesis was already a popular, shipped game with a large live player base when I came on as a contractor — so the job wasn't features, it was keeping a moving target shippable: fast to install, reliable to launch, and continuously buildable as iOS, Android, and a dozen third-party SDKs shifted underneath it. Over roughly two years — this work ran from 2019 to 2021 — that meant work on three fronts: the build, the launch, and the treadmill.
Install conversion falls off with app size — hardest on cellular and in emerging markets, which is exactly where a game like this grows. The Android build was ~300 MB; I got it to 160 MB. The wins were unglamorous and measured:
Resources/ hygiene. Unity force-includes everything under Resources/ in the build, whether it's referenced or not. Moving the icon set out of Resources/ alone cut a meaningful chunk. A parallel pass optimized iOS assets."Load success" — the share of app opens that actually reach gameplay — is a real KPI, and on a large device matrix it's where players quietly churn. Several pieces here worked together:
finished / total) behind a loading popup — smaller install, assets fetched when needed.ssod_detection_time, defaulting to 60s, and companion flags) — so if launches started stalling in the field, we could tune the timeout and mitigation server-side without shipping a build.A live game inherits every platform change whether or not it wants to. Keeping this one compliant and buildable meant a steady cadence of: iOS 14 App Tracking Transparency and IDFA handling, SKAdNetwork configuration, a COPPA flag, minimum-deployment-target bumps — and version-managing a dozen third-party SDKs (Firebase, Facebook, IronSource and its ad adapters, and more), including migrating dependency resolution from PlayServicesResolver to the External Dependency Manager. None of it is glamorous; all of it is the difference between "ships this week" and "blocked."
The most brittle step in a Unity mobile build is the post-export mutation of the generated Xcode project. I authored and maintained a suite of build post-processors so that step is deterministic instead of a manual ritual: App Tracking Transparency and SKAdNetwork entries, entitlements wired by relative path, changes targeting the correct main target GUID, the move to an Xcode workspace, and proper escaping/quoting in the generated scripts. Sitting above that, a headless CI build runner (Builder.cs) parses command-line arguments — project path, build target, version, and keystore secrets — so a clean build comes out of CI the same way every time, not off one engineer's machine.
flowchart TB START[App start] --> RC[Remote config
load-flow timeouts & toggles] RC --> OBB{Android OBB present?} OBB -->|wait| OBB OBB -->|ready| DL[On-demand asset download
progress: finished / total] DL --> WD[Loading-screen watchdog
ssod_detection_time] WD -->|stalled| MIT[Mitigate / recover] WD -->|ok| GAME[Gameplay] MIT --> GAME