Skip to content

CityGen troubleshooting

The building ghost is red and won’t place

Section titled “The building ghost is red and won’t place”

Cause: the placement is refused. That happens when any of these is true:

  • The terrain slope across the footprint is steeper than the building asset’s MaxSlopeDegrees (5° by default).
  • The building would overlap an existing building.
  • The building would overlap a road corridor, player-drawn or procedural.

Fix: move to flatter ground or away from the overlap, or raise MaxSlopeDegrees on the building asset.

Cause: the grid only follows a road within RoadAlignRange (500 cm by default) of it. Further away, it falls back to the world axes.

Fix: place the building closer to the road.

Cause: since 1.2, a building’s height is the highest of nine samples across its rotated footprint, so it is never buried. On a slope that leaves the downhill side above the ground unless the mesh extends below its pivot.

Fix: give your building meshes a deep base, about 50 to 100 cm below the pivot. Buildings on flat ground look the same; buildings on slopes get a clean base in the ground. If you are on a version before 1.2, update.

Buildings appear a second or two after loading

Section titled “Buildings appear a second or two after loading”

This is expected. On QuickLoad, CityGen waits until the terrain chunks have finished building before it restores buildings, roadside props and bridge pillars, so they are placed on the carved terrain at the correct height. Saves made before 1.2 correct their building heights automatically when they are loaded.

The zone eraser doesn’t remove a building

Section titled “The zone eraser doesn’t remove a building”

Cause: zoning tracks which cell spawned each building, and the eraser only removes buildings that zoning spawned. Buildings you placed by hand survive zone changes.

Fix: remove the building with the demolish tool (X).

Demolishing a building leaves its zone cells painted

Section titled “Demolishing a building leaves its zone cells painted”

Cause: before 1.3, demolishing only cleared the zone cells of zone-spawned buildings.

Fix: update to 1.3 or later. Demolish now clears every zone cell whose centre lies inside the demolished building’s footprint, for hand-placed and zone-spawned buildings alike.

This is by design since 1.3: the brush skips bridge sections so bridges stay unzoned. Erasing still works on bridges, so you can clear zone paint left over from earlier versions.

A building next to my new road wasn’t removed

Section titled “A building next to my new road wasn’t removed”

Cause: when you confirm a road, CityGen removes buildings the road draws through, but the test is conservative and leaves buildings the road only grazes.

Fix: remove the building with the demolish tool (X).

Cause: two road meshes at the same height fight for the same pixels.

Fix:

  • T-junctions: the connecting road’s endpoint drops by Junction Tuck Depth on the road asset (20 cm by default), tucking it under the main road. This needs 1.1 or later.
  • Crossings: where two roads cross mid-segment, the older road drops by the same amount so the newer road renders on top. This needs 1.2 or later.

Roads look buried or sag between points on hilly ground

Section titled “Roads look buried or sag between points on hilly ground”

This was fixed in 1.1. Roads now change height linearly between your clicks, so the road mesh and the flattened terrain bed match exactly. Update to 1.1 or later.

A road turns into a bridge too early or too late

Section titled “A road turns into a bridge too early or too late”

Bridge detection is controlled by two settings on the road asset:

  • Bridge Gap (200 cm by default): how far the road must sit above the terrain for a section to become a bridge.
  • Bridge Gap Hysteresis (100 cm by default): the difference between the enter and exit thresholds, which stops a section flickering between bridge and road.

The road cursor disappears and clicks do nothing when zoomed out

Section titled “The road cursor disappears and clicks do nothing when zoomed out”

Cause: in versions before 1.2, clicks relied only on Unreal’s default cursor trace, which misses at full RTS zoom-out.

Fix: update to 1.2 or later. Road, Demolish and Zone modes fall back to a long line trace whenever the default cursor trace misses.

  • Sidewalks are off by default. Set a Sidewalk Material on the road asset to turn them on.
  • They are not built on bridge tiles unless you tick bSpawnSidewalkOnBridge, because bridge meshes usually have their own railings.

There’s a seam between the sidewalk and the road, or road markings on the sidewalk

Section titled “There’s a seam between the sidewalk and the road, or road markings on the sidewalk”
  • Seam: set a negative Sidewalk Offset From Edge to pull the sidewalk inward so it overlaps the road mesh and hides the seam. A positive value pushes it outward and leaves a visible gap.
  • Markings on the kerb: by default sidewalks reuse the road mesh. If your road mesh has baked detail such as lane markings, assign a dedicated Sidewalk Mesh.

Roadside props are missing on some sections

Section titled “Roadside props are missing on some sections”

Check the prop entry’s filters on the road asset:

  • bSpawnOnBridge and bSpawnOnNonBridge control whether the prop appears on bridge sections, ground sections or both.
  • The zone toggles (bSpawnOnDezoned, bSpawnOnResidential, bSpawnOnCommercial, bSpawnOnIndustrial) skip the prop wherever the zone beside the road has its toggle off. Props beyond the last painted cells count as dezoned. Bridges ignore the zone toggles.
  • A prop is never placed inside another road’s corridor, so props are skipped where roads cross.

Props float above the road or sit on another road’s deck

Section titled “Props float above the road or sit on another road’s deck”

Cause: in versions before 1.2, props took their height from your original clicks rather than from the road bed after it settled onto the terrain.

Fix: update to 1.2 or later. If props look wrong after you Live Code into a running session, run the CityGen.RebuildProps console command to re-place them without reloading.

Tick bExtendToGround on the pylon’s prop entry. It stretches the mesh from the road deck down to the terrain and overrides bSnapToGround. Pair it with bSpawnOnNonBridge off so pylons only appear on bridges.

Lamp posts on the far side of the road face the wrong way

Section titled “Lamp posts on the far side of the road face the wrong way”

Tick bFlipOnOtherSide on the prop entry. It rotates the mirrored instance by 180° so an arm that hangs over the road faces inward on both sides. It applies when bBothSides is on.

Buildings and street lights don’t light up at night

Section titled “Buildings and street lights don’t light up at night”
  • Assign a Material Parameter Collection to IlluminateMPC on the ACityGenTimeOfDay actor. The included content reads the Illuminate scalar from MPC_CityGen.
  • Your own building materials need to multiply their window emissive by that scalar.
  • The lit window runs from 17:00 to 07:00 by default, with a 30-minute fade at each end. Change it with HoursBeforeSunset and HoursAfterSunrise.
  • Ground light-spill decals are opt-in per prop: set SpillDecalMaterial on the lamp post’s prop entry.
  • Assign your level’s Post Process Volume to the PostProcessVolume slot on ACityGenTimeOfDay. The actor blends exposure between day and night values, forces Histogram auto-exposure and makes the volume unbound so its settings always apply.
  • A high minimum brightness (AutoExposureMinBrightness) is what keeps night dark: it stops the camera brightening dim moonlit scenes to middle grey.

Turn off shadows on the moon light. It costs about 0.3 ms of GPU time without shadows, against about 3 ms for a shadow-casting fill light.

The grass band disappears at the waterline

Section titled “The grass band disappears at the waterline”

Cause: Rock Start is set below Sea Level (both are normalized 0 to 1 heights). Rock weight is then non-zero at the waterline and replaces the grass.

Fix: keep Rock Start above Sea Level. The defaults (0.47 and 0.44) are correct.

Underwater blending looks wrong in my own terrain material

Section titled “Underwater blending looks wrong in my own terrain material”
  • VertexColor.R (water) is a hard step, 1.0 below sea level and 0.0 above, not a depth gradient. For a depth fade, pair it with the underwater mask approach in the WorldGen material setup.
  • TextureCoordinate(1).R (UV1.R) carries sand only above sea level. Use VertexColor.R as the underwater alpha.

Cause: exclusion volumes are gathered once at BeginPlay. The road tool refreshes the list for the volumes it creates, but volumes you add in the editor are not picked up until the next Play.

Fix: stop and start Play again.

I can’t place the procedural road network in my level

Section titled “I can’t place the procedural road network in my level”

ARoadNetwork (the procedural road network inherited from WorldGen) is not placeable: the streaming manager spawns and owns it. City-builder workflows use ACityGenRoadNetwork, the player-drawn road network, instead.

Chunks keep loading and unloading at chunk boundaries

Section titled “Chunks keep loading and unloading at chunk boundaries”

Keep Release Distance at or above View Distance (the defaults are 8 and 4). Chunks are loaded within View Distance but only released beyond Release Distance, which stops them churning as you move back and forth across a boundary.

Characters fall through the terrain when the game starts

Section titled “Characters fall through the terrain when the game starts”

Terrain Load Delay (4 seconds by default) suspends gravity for each player at spawn, so the async terrain collision has time to cook. If characters still fall through, raise it.

Erosion is off by default in CityGen (bEnableErosion), because city terrain is shaped by player roads and exclusions. Set bEnableErosion to true on the streaming manager if you want it.