On this page
Tune and ship

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 maxTextureSize to 1024 if it is larger,
  • enables crunchedCompression if 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.
  • photonSendRate 50 and photonSerializationRate 35 as 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

Next

(c) 2014 - 2026 BoneCracker Games - City Car Driving Simulator 1.6Back to top ↑
Document details

Generated from: 03_Tune_And_Ship/03_Build_And_Deploy.md
Date: 2026-09-15 07:52
(c) 2014 - 2026 BoneCracker Games - City Car Driving Simulator 1.6