CityGen FAQ
Which Unreal Engine versions are supported?
Section titled “Which Unreal Engine versions are supported?”Unreal Engine 5.4, 5.6, 5.7 and 5.8. UE 5.5 is not supported: the 1.3 release notes list it as deferred because of an Unreal Build Tool issue. See Requirements.
Do I need to buy WorldGen as well?
Section titled “Do I need to buy WorldGen as well?”No. CityGen is built on the WorldGen terrain core and includes every WorldGen feature. WorldGen is sold separately only for projects that want procedural terrain streaming without the city-builder layer.
Are cities generated in the editor or at runtime?
Section titled “Are cities generated in the editor or at runtime?”At runtime. Most city tools generate a city at edit time and bake it into your level. With CityGen, your players draw the roads, paint the zones and watch buildings appear while the game runs, on terrain that streams in around them.
Does CityGen work in multiplayer?
Section titled “Does CityGen work in multiplayer?”Terrain streaming, yes. CityGen streams terrain around every connected player at the same time, the same way WorldGen does. A dedicated server builds collision-only geometry, clients get full visual terrain around their own pawn, and the gravity delay at spawn is applied per player, including late joiners. Listen server, client and dedicated server work with no extra setup.
City authoring is single-player by default, which is why the Fab listing marks network replication as partial. Roads, buildings and zones go through Unreal’s standard actor replication on ACityGenRoadNetwork, ACityGenBuildingNetwork and the segment zone state. If you want multiplayer city authoring, mark these actors as replicated in your game mode setup.
Does CityGen support a gamepad?
Section titled “Does CityGen support a gamepad?”No. Input is keyboard and mouse, through Enhanced Input.
Can I change the camera controls?
Section titled “Can I change the camera controls?”Yes. ACityGenCameraPawn uses Enhanced Input throughout, and the included IMC_CityGen input mapping context covers all the axes. Copy it into your project and rebind freely. The camera’s main settings are:
| Setting | Default | What it does |
|---|---|---|
PanSpeed |
5,000 cm/s | Base pan speed. It scales with zoom: at 200,000 cm it is 20 times faster. |
ZoomMin / ZoomMax |
500 cm / 200,000 cm | Closest and furthest zoom distance |
ZoomSpeed |
5,000 cm | Zoom change per scroll tick |
ZoomSmoothing |
8 | Zoom smoothing (3 is slow, 20 is instant) |
PitchAtMinZoom / PitchAtMaxZoom |
-35° / -80° | Camera pitch fully zoomed in and fully zoomed out, blended in between |
OrbitDamping |
10 | How the right-mouse orbit coasts to a stop |
Can I use my own buildings?
Section titled “Can I use my own buildings?”Yes. Create a UCityGenBuildingAsset data asset and set:
- MeshVariants: one or more static meshes. One is picked at random for each placement. (Mesh is the fallback if the array is empty.)
- FootprintCells: width × depth in grid cells, for example
(2, 3)for 2 wide by 3 deep. - MaxSlopeDegrees (5 by default), ZOffset to fine-tune the height, and ZScaleRange for a random height roll on each placement. Only the height varies, so footprints stay aligned to the grid.
- GhostMaterial: a translucent material with a
Colorvector parameter, which the tool drives green or red.
To have a zone spawn it, add it with a weight to a UCityGenZoneAsset’s BuildingPool.
Two authoring tips:
- Give the mesh a deep base. Extend it about 50 to 100 cm below its pivot. Buildings anchor to the highest of nine height samples across their footprint, and the deep base hides the gap on the downhill side. On flat ground it looks the same.
- Light the windows at night. Multiply the window emissive by the
Illuminatescalar fromMPC_CityGen, as the included buildings do.
Can I use my own terrain material?
Section titled “Can I use my own terrain material?”Yes. CityGen uses the same vertex colour and UV scheme as WorldGen:
| Channel | Layer |
|---|---|
VertexColor.R |
Water: 1.0 below sea level, 0.0 above (a hard step, not a gradient) |
VertexColor.G |
Grass, the base layer |
VertexColor.B |
Rock, based on height and slope |
VertexColor.A |
Snow, the high-altitude cap |
TextureCoordinate(0) (UV0) |
World-tiled UV, set by Texture World Scale |
TextureCoordinate(1).R (UV1.R) |
Beach and desert sand: 1.0 at the waterline, fading above |
TextureCoordinate(1).G (UV1.G) |
Procedural roads: 1.0 at the centreline, 0 at the corridor edge |
The recommended blend order is:
Grass (base) → Lerp(Grass, Rock, Alpha = VertexColor.B) → Lerp(above, Snow, Alpha = VertexColor.A) → Lerp(above, Beach/Sand, Alpha = TextureCoordinate(1).R) → Lerp(above, Underwater, Alpha = VertexColor.R)Assign the material to Terrain Material on the streaming manager. At runtime it creates a dynamic material instance and pushes the SeaLevelZ scalar parameter automatically, so no Material Parameter Collection is needed. Player-drawn roads flatten the terrain through exclusion zones and do not write UV1.G.
Can I build my own HUD?
Section titled “Can I build my own HUD?”Yes. ACityGenPlayerController has Blueprint-callable functions designed for HUD buttons:
| Function | What it does |
|---|---|
ToggleRoadMode, ToggleBuildingMode, ToggleDemolishMode, ToggleZoneMode |
Toggle a mode on or off. Each returns true if that mode is now active. |
EnableZoneMode(ZoneAsset) |
Set the active zone asset (when one is passed) and enter zone mode. Calling it while already in zone mode just swaps the asset, which suits one button per zone type. |
DisablePlacementMode |
Leave whatever mode is active and cancel any road or building in progress |
QuickSave, QuickLoad |
Save or load the city |
Modes are mutually exclusive: entering one cancels any other. Bind once to OnPlacementModeChanged from your widget; it fires on every mode change, including back to None, so your buttons can update their highlight without polling in Tick. The included WBP_HUD is a complete example, with Residential, Commercial and Industrial buttons calling EnableZoneMode with DA_Zone_Residential, DA_Zone_Commercial and DA_Zone_Industrial.
What does QuickSave store?
Section titled “What does QuickSave store?”UCityGenSaveGame uses a single slot (F5 saves, F9 loads) and stores:
- every player-drawn road: its points, fixed-angle flags and bridge zones
- every placed building: position, size, rotation, asset, mesh variant, height roll and zoning metadata
- the zone paint on every road
- terrain deformation
- consumed spawner positions
On load, each building gets back the same mesh variant and height roll, so nothing is re-rolled. Road widths (HalfWidth and BlendRadius) are read again from the road asset, so changes you make to the asset apply to loaded roads.
What happens to buildings when I draw a road through them?
Section titled “What happens to buildings when I draw a road through them?”Since 1.3, confirming a road removes any building the road draws through. The test is conservative: a building the road only grazes stays, so remove it with the demolish tool (X) if you need to.
Can different districts have different street props?
Section titled “Can different districts have different street props?”Yes. Each roadside prop entry has four zone toggles: bSpawnOnDezoned, bSpawnOnResidential, bSpawnOnCommercial and bSpawnOnIndustrial. A prop is skipped wherever the zone beside the road has its toggle off, so you can have lamp posts everywhere, planters only in residential areas and dumpsters only in industrial ones. Props in the strip right next to the road take the zone of the first painted cell on their side. Bridges have no zones, so only the bridge / non-bridge filter applies there.
Why doesn’t the zone Density setting change anything?
Section titled “Why doesn’t the zone Density setting change anything?”Density on UCityGenZoneAsset is reserved and not used yet. Zones currently fill every free painted slot, up to MaxBuildingsPerSegment (200 by default) per road segment.
How much terrain is loaded around the player?
Section titled “How much terrain is loaded around the player?”With CityGen’s defaults, each chunk is 2 km across (Tile Size 200,000 cm), and View Distance 4 loads a 9×9 grid of 81 chunks around each player. Chunks are only released once they are beyond Release Distance (8), which stops chunks loading and unloading repeatedly at chunk boundaries. Beyond that, a low-resolution far terrain ring covers the horizon: each far tile covers 4×4 near tiles, out to 3 far tiles.
Where are erosion, foliage and exclusion volumes documented?
Section titled “Where are erosion, foliage and exclusion volumes documented?”Foliage, grass, erosion, deformation, exclusion volumes, the spawner, spatial biomes and multiplayer streaming work the same as in WorldGen 1.11, so the WorldGen docs cover them. Those docs also describe later WorldGen versions, so check the WorldGen changelog for anything added after 1.11.
Differences in CityGen:
- Erosion is off by default (
bEnableErosion). City builds rarely need it, because the terrain is shaped by player roads and exclusions instead. - Sample assets live under
/CityGen/Foliage/,/CityGen/Grass/and/CityGen/Spawner/.
Is CityGen Nanite compatible?
Section titled “Is CityGen Nanite compatible?”Yes. ISM foliage, grass and roadside props are Nanite compatible.
Does CityGen use any third-party libraries?
Section titled “Does CityGen use any third-party libraries?”No. All noise comes from CodeLikeMe’s original CLMNoise library, so there are no third-party licence requirements.
