UE5 Level Design
World building, environment art, lighting, landscape, gameplay spaces, and level streaming in Unreal Engine 5.
Infrastructure
See the ue5-gamedev skill for full infrastructure details.
| Channel |
Endpoint |
Use for level design |
| Remote Control API |
localhost:8080 |
Actor placement, property tweaking, lighting adjustments |
| Python bridge |
localhost:30010 |
Batch operations, procedural placement, asset management |
| MCP (ChiR24/Unreal_mcp) |
Local plugin |
Actor creation, level management, lighting control |
Level structure
Level organization
/Game/Maps/
MainLevel.umap -- Persistent level
MainLevel_Gameplay.umap -- Gameplay actors (streaming)
MainLevel_Lighting.umap -- Lights and post-process (streaming)
MainLevel_Audio.umap -- Ambient audio (streaming)
MainLevel_Foliage.umap -- Foliage and vegetation (streaming)
World Partition (UE5 preferred)
For open worlds, use World Partition instead of manual level streaming:
- Data Layers: Organize actors into logical layers (Gameplay, Environment, Audio)
- Runtime Grid: Controls streaming granularity (cell size, loading range)
- One File Per Actor (OFPA): Each actor is its own file -- enables parallel work
- HLODs: Hierarchical LODs for distant rendering
- Minimap: World Partition generates a grid-based minimap for the editor
Sub-levels (classic approach)
For linear or contained levels:
- Use Level Streaming Volumes for automatic loading
- Use
ULevelStreamingDynamic for code-driven streaming
- Keep persistent level minimal (only always-loaded actors)
Actor placement
Via Remote Control API
# Spawn an actor at a location
PUT http://localhost:8080/remote/object/call
{
"objectPath": "/Script/Engine.Default__GameplayStatics",
"functionName": "BeginDeferredActorSpawnFromClass",
"parameters": {
"WorldContextObject": "/Game/Maps/MainLevel.MainLevel",
"ActorClass": "/Game/Blueprints/BP_Torch.BP_Torch_C",
"SpawnTransform": {
"Translation": { "X": 1000, "Y": 500, "Z": 0 },
"Rotation": { "X": 0, "Y": 0, "Z": 45, "W": 1 },
"Scale3D": { "X": 1, "Y": 1, "Z": 1 }
}
}
}
Via Python bridge
import unreal
editor = unreal.EditorLevelLibrary()
# Spawn from Blueprint class
bp_class = unreal.EditorAssetLibrary.load_blueprint_class("/Game/Blueprints/BP_Torch")
location = unreal.Vector(1000, 500, 0)
rotation = unreal.Rotator(0, 45, 0)
actor = editor.spawn_actor_from_class(bp_class, location, rotation)
# Batch place actors along a path
import math
for i in range(20):
angle = (i / 20) * 2 * math.pi
x = math.cos(angle) * 2000
y = math.sin(angle) * 2000
loc = unreal.Vector(x, y, 0)
editor.spawn_actor_from_class(bp_class, loc, unreal.Rotator(0, 0, 0))
Via MCP (ChiR24/Unreal_mcp)
The MCP server provides higher-level actor management:
- Create actors by type (cube, sphere, light, camera, custom Blueprint)
- Set transforms (position, rotation, scale)
- Query and find actors by name or class
- Delete actors
- Manage actor hierarchies
Landscape
Landscape setup
- Component size: 63x63 or 127x127 quads (63 for smaller levels, 127 for large)
- Sections per component: 1x1 (small) or 2x2 (large worlds)
- Scale: Default 100x100x256 (X/Y/Z). For realistic terrain, Z scale of 51200 = ~500m height range
- Material: Use landscape-specific material with layer blending
Landscape layers
import unreal
# Create landscape material layers via Python
landscape = unreal.EditorLevelLibrary.get_all_level_actors_of_class(unreal.Landscape)[0]
# Sculpt operations use the Landscape Editor mode
# For automation, modify heightmap data directly:
# Export: Right-click landscape > Export to file (.r16 or .png)
# Import: Landscape > Import heightmap
Foliage
- Use Procedural Foliage Volume for large-area automatic placement
- Use Foliage Painting for manual detail placement
- Use Nanite for high-poly foliage (UE5.1+): enable Nanite on foliage static meshes
- Grass types: Use Landscape Grass Type for lightweight ground cover (rendered per-component)
Lighting
Light types and when to use them
| Light |
Use case |
Cost |
| Directional Light |
Sun/moon, outdoor scenes |
Low (one per level) |
| Sky Light |
Ambient fill, sky color |
Low (one per level) |
| Point Light |
Lamps, torches, small areas |
Medium |
| Spot Light |
Flashlights, focused beams |
Medium |
| Rect Light |
Windows, screens, area sources |
High |
Lumen (UE5 default GI)
- Lumen Global Illumination: Real-time indirect lighting. No lightmap baking needed.
- Lumen Reflections: Real-time reflections replacing SSR + planar reflections.
- Hardware Ray Tracing: Enable for higher quality (requires RTX GPU).
- Software Ray Tracing: Fallback that works without RTX. Lower quality but no hardware requirement.
Lighting via Remote Control
# Adjust directional light intensity
PUT http://localhost:8080/remote/object/property
{
"objectPath": "/Game/Maps/MainLevel.MainLevel:PersistentLevel.DirectionalLight_0.LightComponent0",
"propertyName": "Intensity",
"propertyValue": { "Intensity": 8.0 }
}
# Change light color
PUT http://localhost:8080/remote/object/property
{
"objectPath": "/Game/Maps/MainLevel.MainLevel:PersistentLevel.PointLight_0.LightComponent0",
"propertyName": "LightColor",
"propertyValue": { "LightColor": { "R": 255, "G": 180, "B": 100, "A": 255 } }
}
Lighting via Python
import unreal
editor = unreal.EditorLevelLibrary()
# Spawn a point light
light = editor.spawn_actor_from_class(
unreal.PointLight,
unreal.Vector(500, 0, 300),
unreal.Rotator(0, 0, 0)
)
light_comp = light.get_component_by_class(unreal.PointLightComponent)
light_comp.set_intensity(5000)
light_comp.set_light_color(unreal.LinearColor(1.0, 0.7, 0.4, 1.0))
light_comp.set_attenuation_radius(1000)
Post-processing
Post Process Volume settings
Key properties to control via Remote Control or Python:
- Exposure: Min/Max EV100, metering mode, exposure compensation
- Bloom: Intensity, threshold, size
- Color grading: Temperature, tint, saturation, contrast, gamma, gain (per shadows/midtones/highlights)
- Ambient occlusion: Intensity, radius, bias
- Depth of field: Focal distance, aperture (f-stop), near/far transition
- Motion blur: Amount, max velocity
- Tone mapping: Film slope, toe, shoulder
Environment
- Sky Atmosphere: Realistic atmospheric scattering. One per level.
- Volumetric Clouds: GPU-driven cloud rendering. Configure coverage, density, shape.
- Exponential Height Fog: Distance fog with directional inscattering.
- Ultra Dynamic Sky (marketplace): Popular all-in-one sky/weather solution.
Performance guidelines
- Draw calls: Keep under 2000 for 60fps. Use instanced static meshes for repeated geometry.
- Nanite: Enable for complex static meshes. Automatic LOD with virtualized geometry.
- Virtual Shadow Maps: UE5 default. Handles large worlds well but costs VRAM.
- Occlusion: Use precomputed visibility volumes in indoor areas.
- LODs: Auto-generate via mesh editor for non-Nanite meshes.
- Texture streaming: Use virtual textures for large landscapes.
- Profiling: Use
stat unit, stat gpu, stat scenerendering console commands. ProfileGPU (Ctrl+Shift+,) for per-pass timings.
Collision and navigation
- Collision: Use simple collision (boxes, spheres, capsules) over complex collision where possible
- NavMesh: Place a NavMeshBoundsVolume to enable AI pathfinding. Configure agent radius/height.
- Navigation modifiers: Use NavModifierVolume to mark areas (avoid, prefer, custom)
- RecastNavMesh: Default navmesh system. Configure cell size, agent parameters.
File and asset conventions
/Game/
Maps/ -- Level files
Blueprints/ -- Blueprint actors
Environment/
Meshes/ -- Static meshes
Materials/ -- Material instances
Textures/ -- Texture assets
Lighting/
LightProfiles/ -- IES profiles
HDRIs/ -- Sky/environment maps
FX/ -- Niagara particle systems
Audio/
Ambient/ -- Environmental audio
SFX/ -- Sound effects
Workflow
- Block out: Place BSP brushes or simple meshes to define spaces
- Gameplay test: Verify scale, sightlines, flow with placeholder actors
- Art pass: Replace blockout with final meshes and materials
- Lighting pass: Set up lights, sky, post-processing
- Polish: Foliage, decals, particles, audio
- Optimize: Profile, add LODs, configure streaming, set culling distances
1---2name: ue5-level-design3description: Unreal Engine 5 level design: world building, landscape, lighting, environment art, gameplay spaces, and level streaming. Use when tasks involve creating or modifying levels, placing actors, configuring lighting, building landscapes, setting up level streaming, or designing gameplay spaces. Covers both manual editor workflows and automated placement via Remote Control API, Python bridge, and MCP tools.4---56# UE5 Level Design78World building, environment art, lighting, landscape, gameplay spaces, and level streaming in Unreal Engine 5.910## Infrastructure1112See the `ue5-gamedev` skill for full infrastructure details.1314| Channel | Endpoint | Use for level design |15|---------|----------|---------------------|16| Remote Control API | localhost:8080 | Actor placement, property tweaking, lighting adjustments |17| Python bridge | localhost:30010 | Batch operations, procedural placement, asset management |18| MCP (ChiR24/Unreal_mcp) | Local plugin | Actor creation, level management, lighting control |1920## Level structure2122### Level organization2324```25/Game/Maps/26 MainLevel.umap -- Persistent level27 MainLevel_Gameplay.umap -- Gameplay actors (streaming)28 MainLevel_Lighting.umap -- Lights and post-process (streaming)29 MainLevel_Audio.umap -- Ambient audio (streaming)30 MainLevel_Foliage.umap -- Foliage and vegetation (streaming)31```3233### World Partition (UE5 preferred)3435For open worlds, use World Partition instead of manual level streaming:3637- **Data Layers**: Organize actors into logical layers (Gameplay, Environment, Audio)38- **Runtime Grid**: Controls streaming granularity (cell size, loading range)39- **One File Per Actor (OFPA)**: Each actor is its own file -- enables parallel work40- **HLODs**: Hierarchical LODs for distant rendering41- **Minimap**: World Partition generates a grid-based minimap for the editor4243### Sub-levels (classic approach)4445For linear or contained levels:46- Use Level Streaming Volumes for automatic loading47- Use `ULevelStreamingDynamic` for code-driven streaming48- Keep persistent level minimal (only always-loaded actors)4950## Actor placement5152### Via Remote Control API5354```55# Spawn an actor at a location56PUT http://localhost:8080/remote/object/call57{58 "objectPath": "/Script/Engine.Default__GameplayStatics",59 "functionName": "BeginDeferredActorSpawnFromClass",60 "parameters": {61 "WorldContextObject": "/Game/Maps/MainLevel.MainLevel",62 "ActorClass": "/Game/Blueprints/BP_Torch.BP_Torch_C",63 "SpawnTransform": {64 "Translation": { "X": 1000, "Y": 500, "Z": 0 },65 "Rotation": { "X": 0, "Y": 0, "Z": 45, "W": 1 },66 "Scale3D": { "X": 1, "Y": 1, "Z": 1 }67 }68 }69}70```7172### Via Python bridge7374```python75import unreal7677editor = unreal.EditorLevelLibrary()7879# Spawn from Blueprint class80bp_class = unreal.EditorAssetLibrary.load_blueprint_class("/Game/Blueprints/BP_Torch")81location = unreal.Vector(1000, 500, 0)82rotation = unreal.Rotator(0, 45, 0)83actor = editor.spawn_actor_from_class(bp_class, location, rotation)8485# Batch place actors along a path86import math87for i in range(20):88 angle = (i / 20) * 2 * math.pi89 x = math.cos(angle) * 200090 y = math.sin(angle) * 200091 loc = unreal.Vector(x, y, 0)92 editor.spawn_actor_from_class(bp_class, loc, unreal.Rotator(0, 0, 0))93```9495### Via MCP (ChiR24/Unreal_mcp)9697The MCP server provides higher-level actor management:98- Create actors by type (cube, sphere, light, camera, custom Blueprint)99- Set transforms (position, rotation, scale)100- Query and find actors by name or class101- Delete actors102- Manage actor hierarchies103104## Landscape105106### Landscape setup107108- **Component size**: 63x63 or 127x127 quads (63 for smaller levels, 127 for large)109- **Sections per component**: 1x1 (small) or 2x2 (large worlds)110- **Scale**: Default 100x100x256 (X/Y/Z). For realistic terrain, Z scale of 51200 = ~500m height range111- **Material**: Use landscape-specific material with layer blending112113### Landscape layers114115```python116import unreal117118# Create landscape material layers via Python119landscape = unreal.EditorLevelLibrary.get_all_level_actors_of_class(unreal.Landscape)[0]120121# Sculpt operations use the Landscape Editor mode122# For automation, modify heightmap data directly:123# Export: Right-click landscape > Export to file (.r16 or .png)124# Import: Landscape > Import heightmap125```126127### Foliage128129- Use **Procedural Foliage Volume** for large-area automatic placement130- Use **Foliage Painting** for manual detail placement131- Use **Nanite** for high-poly foliage (UE5.1+): enable Nanite on foliage static meshes132- **Grass types**: Use Landscape Grass Type for lightweight ground cover (rendered per-component)133134## Lighting135136### Light types and when to use them137138| Light | Use case | Cost |139|-------|----------|------|140| Directional Light | Sun/moon, outdoor scenes | Low (one per level) |141| Sky Light | Ambient fill, sky color | Low (one per level) |142| Point Light | Lamps, torches, small areas | Medium |143| Spot Light | Flashlights, focused beams | Medium |144| Rect Light | Windows, screens, area sources | High |145146### Lumen (UE5 default GI)147148- **Lumen Global Illumination**: Real-time indirect lighting. No lightmap baking needed.149- **Lumen Reflections**: Real-time reflections replacing SSR + planar reflections.150- **Hardware Ray Tracing**: Enable for higher quality (requires RTX GPU).151- **Software Ray Tracing**: Fallback that works without RTX. Lower quality but no hardware requirement.152153### Lighting via Remote Control154155```156# Adjust directional light intensity157PUT http://localhost:8080/remote/object/property158{159 "objectPath": "/Game/Maps/MainLevel.MainLevel:PersistentLevel.DirectionalLight_0.LightComponent0",160 "propertyName": "Intensity",161 "propertyValue": { "Intensity": 8.0 }162}163164# Change light color165PUT http://localhost:8080/remote/object/property166{167 "objectPath": "/Game/Maps/MainLevel.MainLevel:PersistentLevel.PointLight_0.LightComponent0",168 "propertyName": "LightColor",169 "propertyValue": { "LightColor": { "R": 255, "G": 180, "B": 100, "A": 255 } }170}171```172173### Lighting via Python174175```python176import unreal177178editor = unreal.EditorLevelLibrary()179180# Spawn a point light181light = editor.spawn_actor_from_class(182 unreal.PointLight,183 unreal.Vector(500, 0, 300),184 unreal.Rotator(0, 0, 0)185)186light_comp = light.get_component_by_class(unreal.PointLightComponent)187light_comp.set_intensity(5000)188light_comp.set_light_color(unreal.LinearColor(1.0, 0.7, 0.4, 1.0))189light_comp.set_attenuation_radius(1000)190```191192## Post-processing193194### Post Process Volume settings195196Key properties to control via Remote Control or Python:197198- **Exposure**: Min/Max EV100, metering mode, exposure compensation199- **Bloom**: Intensity, threshold, size200- **Color grading**: Temperature, tint, saturation, contrast, gamma, gain (per shadows/midtones/highlights)201- **Ambient occlusion**: Intensity, radius, bias202- **Depth of field**: Focal distance, aperture (f-stop), near/far transition203- **Motion blur**: Amount, max velocity204- **Tone mapping**: Film slope, toe, shoulder205206### Environment207208- **Sky Atmosphere**: Realistic atmospheric scattering. One per level.209- **Volumetric Clouds**: GPU-driven cloud rendering. Configure coverage, density, shape.210- **Exponential Height Fog**: Distance fog with directional inscattering.211- **Ultra Dynamic Sky** (marketplace): Popular all-in-one sky/weather solution.212213## Performance guidelines214215- **Draw calls**: Keep under 2000 for 60fps. Use instanced static meshes for repeated geometry.216- **Nanite**: Enable for complex static meshes. Automatic LOD with virtualized geometry.217- **Virtual Shadow Maps**: UE5 default. Handles large worlds well but costs VRAM.218- **Occlusion**: Use precomputed visibility volumes in indoor areas.219- **LODs**: Auto-generate via mesh editor for non-Nanite meshes.220- **Texture streaming**: Use virtual textures for large landscapes.221- **Profiling**: Use `stat unit`, `stat gpu`, `stat scenerendering` console commands. ProfileGPU (`Ctrl+Shift+,`) for per-pass timings.222223## Collision and navigation224225- **Collision**: Use simple collision (boxes, spheres, capsules) over complex collision where possible226- **NavMesh**: Place a NavMeshBoundsVolume to enable AI pathfinding. Configure agent radius/height.227- **Navigation modifiers**: Use NavModifierVolume to mark areas (avoid, prefer, custom)228- **RecastNavMesh**: Default navmesh system. Configure cell size, agent parameters.229230## File and asset conventions231232```233/Game/234 Maps/ -- Level files235 Blueprints/ -- Blueprint actors236 Environment/237 Meshes/ -- Static meshes238 Materials/ -- Material instances239 Textures/ -- Texture assets240 Lighting/241 LightProfiles/ -- IES profiles242 HDRIs/ -- Sky/environment maps243 FX/ -- Niagara particle systems244 Audio/245 Ambient/ -- Environmental audio246 SFX/ -- Sound effects247```248249## Workflow2502511. **Block out**: Place BSP brushes or simple meshes to define spaces2522. **Gameplay test**: Verify scale, sightlines, flow with placeholder actors2533. **Art pass**: Replace blockout with final meshes and materials2544. **Lighting pass**: Set up lights, sky, post-processing2555. **Polish**: Foliage, decals, particles, audio2566. **Optimize**: Profile, add LODs, configure streaming, set culling distances