Build and Deploy
Taking CCDS from editor to shipped build, per platform.
Release checklist
Work through this before every release build.
| # | Item | Where |
|---|---|---|
| 1 | Overview tab shows no "Developer Settings Active" banner | CCDS_Settings.asset |
| 2 | All scenes present and correctly ordered | Build Profiles → Scene List |
| 3 | mainMenuSceneIndex and defaultSelectedSceneIndex match those indices |
CCDS_Settings.asset |
| 4 | Validation Panel clean on every scene | Tools → … → Open Validation Panel |
| 5 | NavMesh baked in every gameplay scene | Per scene |
| 6 | Lighting baked, reflection probes baked | Per scene |
| 7 | Photon App ID set, region chosen | PUN Wizard |
| 8 | Company and product name set | Project Settings → Player |
| 9 | Build runs with an empty Console | — |
Item 1 covers useProcessIdForSaveFile, enableDebugMessages and enableDebugPanel in one glance — the inspector raises the banner if any of them is still on. All three ship off; you only need to check you did not leave one enabled while developing. See Settings Reference.
Scenes
File → Build Profiles → Scene List. The shipped order:
| Index | Scene | Enabled |
|---|---|---|
| 0 | Assets/CCDS/Scenes/CCDS_MainMenu_City.unity |
Yes |
| 1 | Assets/CCDS/Scenes/CCDS_Gameplay_City_1.unity |
Yes |
| 2 | Assets/CCDS/Scenes/CCDS_Gameplay_City_2.unity |
Yes |
| 3 | Assets/CCDS/Scenes/CCDS_Vehicles_Prototype.unity |
No — sandbox |
Indices are referenced from CCDS_Settings, so reordering scenes without updating mainMenuSceneIndex and defaultSelectedSceneIndex sends players to the wrong scene or to none at all.
Leave CCDS_Vehicles_Prototype disabled. It is a testing sandbox and shipping it only inflates the build.
Colour space
With autoSetColorSpacePerPlatform enabled (shipped true), CCDS_PreBuildChecker sets the colour space from the build target:
| Target | Colour space |
|---|---|
| Windows, Windows 64, Linux 64, macOS | Linear |
| PS4, PS5, Xbox One, GameCore Xbox One, GameCore Xbox Series | Linear |
| Android, iOS, WebGL | Gamma |
| Anything else | Unchanged, with a log line |
It only acts when the current setting differs, and it confirms with a dialog first — changing colour space triggers a full asset reimport, which on this project is a long wait. Expect it, and do not cancel partway.
Disable the option if you manage colour space yourself.
Lightmaps
CCDS_BuildProcessor implements IPreprocessBuildWithReport (callbackOrder 0). When overrideLightmapTextures is enabled it walks the lightmaps and, for each one:
- sets
maxTextureSizeto1024if it is larger, - enables
crunchedCompressionif it is off.
This shrinks the build at some cost in bake quality. Recommended for mobile and WebGL; optional on desktop. It does nothing when the setting is off.
Platforms
Windows / macOS / Linux
The primary target. Linear colour space, keyboard and gamepad input, no extra configuration.
Android / iOS
| Item | Setting |
|---|---|
| Colour space | Gamma (automatic) |
| Minimum API level | Android: set for your audience — the project ships targeting API 29 |
| Scripting backend | IL2CPP |
| Architecture | ARM64 (required for Play Store) |
| Graphics API | Vulkan or OpenGL ES 3 |
Touch controls come from RCCP's mobile controller, driven by RCCP_Settings.mobileControllerEnabled. CCDS keeps that flag correct automatically: CCDS_MobileControllerSync implements IActiveBuildTargetChanged and sets it to true for Android and iOS and false for every other target, on every platform switch.
Switch the build target before building. A mobile build made without that switch having occurred ships without touch steering.
Also review: traffic density down, shadows off, realtime lights 0, draw distance near 500 m, overrideLightmapTextures on.
WebGL
| Item | Setting |
|---|---|
| Colour space | Gamma (automatic) |
| Compression | Brotli or Gzip |
| Exception support | None, for size and speed |
WebGL is single-threaded and memory-constrained. Expect to cut traffic density, draw distance and texture sizes well below desktop, and test the actual download size — a city build is large.
Consoles
Linear colour space is applied automatically for PS4, PS5, Xbox One and Xbox Series targets. Everything beyond that requires the platform SDK and a developer licence from the platform holder.
Save data in builds
Saves are JSON in Application.persistentDataPath, which differs per platform and per product name.
Changing the product name changes the path, so existing players appear to lose their saves. Settle on the name before release.
useProcessIdForSaveFile must be false in release builds. With it on, the file name includes the process ID, so a player can get a different save file on a later launch.
Photon in builds
- The App ID compiles into the build. Rotating it requires a rebuild.
- Pick a region, or let Photon choose by ping.
ConnectToRegion(regionCode)pins it. - The free tier caps concurrent users; check your limits before a launch.
photonSendRate50andphotonSerializationRate35as shipped are above the tooltip recommendations of 20–30 and 15–20. On the free tier that shortens how long your CCU budget lasts.
Validate before building
Tools → BoneCracker Games → CCDS → Open Validation Panel, on every scene.
It runs CCDS_SceneManager.CheckMisconfigurations() plus every component implementing ICCDS_CheckEditorError, and names the exact missing reference — for example "Missing UI Text 'Money Text' on MainMenu Manager!". A broken reference that only shows up at runtime is the most common cause of a build that works in the editor and fails on device.
The Welcome Window's Health tab covers project-level settings and offers one-click fixes for some of them.
Common problems
| Symptom | Cause |
|---|---|
| Build works in editor, black screen on device | Scene missing from the scene list, or wrong index |
| Colours washed out on mobile | Colour space mismatch — check autoSetColorSpacePerPlatform |
| No touch controls on mobile | Build target was never switched, so mobileControllerEnabled was never set |
| Players lose saves after an update | Product name changed, or useProcessIdForSaveFile left on |
| Debug panel opens in a shipped build | enableDebugPanel left on after development |
| Multiplayer fails only in the build | App ID missing, or region unreachable |
| Build much larger than expected | overrideLightmapTextures off, or the prototype scene included |
| AI does not move on device | NavMesh not baked, or baked before geometry changed |