AssetPro - CityGen — Runtime City Builder Framework | Roads, Zoning, Buildings | UE5

CityGen is a runtime C++ plugin for Unreal Engine 5 that turns infinite procedural terrain into a city-builder sandbox — players draw roads, place buildings, and paint zones at runtime, on a streaming open world that generates around them. Drop the WorldStreamingManager into your level, set up the RTS camera, and you have the core of a city-builder, RTS, or 4X game running before lunch.

Playable Demo | Documentation | Discord Community


V1.3 Day & Night | V1.2 Sidewalks, Bridges, Props | V1.1 Fab Release | V0.6 Zoning | V0.5 Buildings | V0.4 Save/Load | V0.3 Bridges | V0.2 Roads | V0.1 Camera


──────────────────────────────

RUNTIME, NOT EDITOR-TIME

──────────────────────────────

CityGen is NOT an editor-time city generator. Tools like iPCC, CityBLD, and UE5's built-in Landscape Splines generate cities at edit time, baked into your level. CityGen runs at game time — your players draw the roads, paint the zones, and watch buildings appear. Different category, different problem solved.

Built on the WorldGen terrain core. Every WorldGen feature is included — you do not need WorldGen separately to use CityGen.

──────────────────────────────

CITY-BUILDER FEATURES

──────────────────────────────

▸ Player-Drawn Road Tool
▸ Day / Night System (V1.3) — drop-in `CityGenTimeOfDay` actor drives sun + moon, post-process exposure, SkyLight recapture, and a smoothly-ramped `Illuminate` MPC scalar. Configurable lit window with 30 min smooth fade. PreviewInEditor for live scrubbing.

▸ Sidewalks (V1.2) — parallel spline-mesh strips on every ground road tile.

▸ Linear-Z Road Grade — roads stay flush on rolling terrain between control points; mesh and chunk-flattened bed match exactly

▸ Junctions

▸ Fixed-Angle Bends — single-midpoint arc anchor with bisector tangent, clean 90° corners with no facet artifacts

▸ Spline-Mesh Road Rendering — local-average tangent override eliminates Catmull-Rom overshoot on asymmetric spacing

▸ Bridges — automatic span detection over rivers / valleys, per-segment bridge mesh + pillars with hysteresis

▸ Roadside Props — Data asset per road asset, one ISM per mesh. Per-type spacing/side/scale/rotation, bridge filter, `bExtendToGround` pylon mode, collision toggle, pivot-agnostic placement.

▸ Roadside Prop Zone Filter (V1.2) — per-prop toggles for Dezoned / Residential / Commercial / Industrial. Sidewalk strip inherits nearest-cell zone; bridges bypass filter.

▸ Roadside Prop Carve-Aware Placement (V1.2) — props read Z from actual carved road grade; never spawn on a crossing road's deck; rebuild deferred until chunks settle.

▸ Building Placement Tool

▸ Footprint-Aware Building Z (V1.2) — placement Z = max of a 3×3 grid inside the rotated footprint. Deep base hides downhill gap; never buried on slopes. Applied to ghost, commit, auto-zone fill, and save/load.

▸ Zoom-Safe Cursor + Clicks (V1.2) — RTS max zoom-out resolves cursor + Road / Demolish / Zone clicks via deproject + long line-trace fallback.

▸ Cities-Skylines Grid Snap + OBB-vs-OBB SAT Collision — buildings align to nearest road's tangent, footprint OBB tests against all other buildings

▸ Slope-Aware Refusal — per-asset MaxSlopeDegrees blocks placement on terrain too steep

▸ Multi-Cell Footprints + Mesh Variants + Per-Placement Height Roll — all persisted in save

▸ Zoning System — Cities-Skylines zone painting, per-segment 2D cell grid, 4×4 brush per click, weighted building pools per zone asset

▸ Zone Auto-Fill — paint a cell, get a building; erase a cell, the building disappears. Origin-cell tracking. Manual buildings survive zoning. Junction-aware. Dezones on demolish.

▸ Demolish Mode — X key, removes buildings and road segments

▸ RTS Camera Pawn — Enhanced Input, zoom-aware pan speed, auto-pitch on zoom, middle-mouse pan, right-mouse orbit with damping

▸ HUD API

▸ Save / Load (F5/F9)

──────────────────────────────

INHERITED FROM WORLDGEN CORE

──────────────────────────────

▸ Infinite Chunk Streaming — actor pool, no spawn/destroy at runtime

▸ Async Mesh + Collision — thread-pool geometry; bUseAsyncCooking default

▸ Seamless Chunk Normals — 1-vertex border overlap eliminates seams

▸ Layered Noise — Layer 0 is the continental mask for all later layers

▸ CLMNoise — Perlin / Simplex / Cellular / Ridged Multifractal / Domain Warp. No third-party deps.

▸ Biome Blending — vertex color weights: Grass / Rock / Snow / Beach / Underwater

▸ Spatial Biomes — temperature + humidity fields → Tundra / Boreal / Desert / Tropical

▸ Beach Layer — height band above sea level, baked into UV1.x

▸ ISM Foliage + Dense Grass — data-asset driven, no BVH spike, slope-sink clustering

▸ Hydraulic Erosion — particle droplet sim, fully async

▸ LOD + Far Terrain — per-ring resolutions plus outer low-res horizon ring

▸ Terrain Deformation — runtime spherical brushes, persistent across rebuilds

▸ Exclusion Volumes — flatten + foliage suppression in a box region

▸ Actor Spawner System — biome/slope/height-filtered, consumed-position tracking

▸ Terrain Query API — SampleTerrainAt / GetHeightAtWorldPos, sync, BP-callable

▸ Multiplayer Support — streams around all connected players

▸ Water Plane — follows player, covers full view distance

▸ Editor Preview — Preview / Clear Terrain buttons

──────────────────────────────

TECHNICAL HIGHLIGHTS

──────────────────────────────

▸ Pure C++ runtime — Blueprint-friendly exposed parameters

▸ ProceduralMeshComponent-based geometry

▸ Virtual Shadow Maps + Distance Field Shadows by default

▸ Enhanced Input throughout — Input Mapping Context drives camera and modes

▸ Spline-mesh road + sidewalk rendering with linear-Z grade

▸ One ISM per prop mesh — shared collision body, no per-instance cook hitch

▸ CLMNoise — original noise library, no external dependencies

▸ Seeded RNG per chunk — deterministic foliage, grass, variants, zone fills

▸ MPSC upload queue — worker-thread mesh uploads, frame-time bounded

▸ Cursor-raycast placement Z — matches rendered mesh, not analytic noise

▸ Listen / client / dedicated server — no extra setup

▸ Nanite compatible — ISM foliage, grass, and props

──────────────────────────────

INCLUDED

──────────────────────────────

▸ Full C++ source

▸ RTS camera pawn + player controller blueprints

▸ In game UI

▸ Pre-built landscape material with biome blending

▸ Sample road, building, and zone data assets

▸ 15 pre-composed building scene meshes — 5 residential plot scenes (house + yard + props), 5 commercial scenes (tower / shop / plaza), 5 industrial scenes (warehouse + lot + props)

▸ Bridge prop mesh set — pylon, weight distributor, lamp post, with paired materials (M_Concrete, M_Pole, M_Light)

▸ Sidewalk pavement mesh + concrete material (V1.2)

▸ DA_Road preconfigured with RoadProps entries: pylons (extend-to-ground, bridge-only), weight distribution slabs, and lamp posts (both-sides + mirrored); sidewalk fields populated

▸ Sample foliage and grass data assets

▸ Sample tree, pine, and grass meshes with materials

▸ Sample spawner data asset and demo actor

▸ Demo map

──────────────────────────────

PERFECT FOR

──────────────────────────────

City builders, real-time strategy games, 4X prototypes, tycoon and management games, survival colonies, base-building games, and any project that needs a player-shaped open world — roads, buildings, and zones — on top of streaming procedural terrain without writing road geometry, building placement, zoning, or chunk management code from scratch.


请问作者代码是不是传错了?
示例地图CityGenDemo运行后啥也没有,BP_WorldStreamingManager的基类丢失。
文档中说:1. Place the streaming manager In the Place Actors panel search for CityGenStreamingManager. Drag one into your level near the world origin.
但是输入CityGenStreamingManager找不到任何东西呀

Hi, In what engine version did you experience this issue?
Feel free to directly reach out to support email or in discord

ok, i found the issue and submitting a fix

Hello again,
This issue has been fixed and fixed version is released in Fab, please update the plugin through Epic launcher. If you don’t see the updated option, remove the plugin and re-installed. Let me know if you run into any other issues