Loading...
Loading...
Use when building or fixing an Unreal Engine 5 level or open world: World Partition, OFPA, Data Layers, Level Instances, Packed Level Actors, HLOD, landscape size, heightmap import or clipping, edit layers, terrain material rules, foliage and grass, a PCG forest or rock scatter, runtime GPU grass, Nanite and tessellation choices, modular kits, a river or village, streaming pop-in, cells not loading, landscape black spots, "PCG shows nothing in the editor", or a world too heavy to hand to lighting.
npx skill4agent add scenario-labs/skills scenario-unreal-world-buildingnpx skills add scenario-labs/skills --skill <name>scripts/ue_world.pysys.path[:0] = ["<skills>/scenario-unreal-world-building/scripts", "<skills>/scenario-unreal-expert/scripts"]; import ue_world as Wue_runue_reviewue_auditue_stattests/code/unreal-world-building/test_world_offline.pyW.probe()W.*| Input | Changes | Default when silent |
|---|---|---|
| Platform, frame budget | Nanite, foliage path, layers; PCG time, grass density | PC and consoles, Nanite on, 60 fps (scenario-unreal-performance) |
| Size, quad size, height source | layout, Z scale, actor Z | |
| Fastest traversal, teleports | loading range, streaming and generation sources | ask gameplay; recorded as unknown |
| Terrain features, Experimental tolerance | Landscape vs Mesh Terrain; Nanite Foliage, PVE, FastGeo | Landscape; no Experimental feature for shipping |
| Manual vs procedural, source control | graph scope, who commits generated PCG | hand: village layout, river, roads, hero areas; builders own generation |
ue_runW.U1_EXAMPLE_SPECW.probe()W.check_world_spec(spec)["ok"]W.new_open_world_map(path)W.convert_args(..., report_only=True)W.wp_facts_check(W.world_facts())wp.Runtime.ToggleDrawRuntimeHash2DW.valley_heightmapW.export_heightmapactor_z_cmz_scaleW.heightmap_clip_gateW.landscape_facts()W.landscape_material_checkW.hlod_planW.data_layer_checkW.hlod_actor_checkW.kit_piece_checkW.door_width_checkW.tag_actorsW.village_pathsW.nanite_construction_check(W.obj_construction_stats(obj))W.batch_nanite(paths, dry_run=True)W.tessellation_checkW.pcg_graph_lintW.spawn_pcg_volume(..., hlod_layer=, data_layer=)W.pcg_component_checkW.expected_pointsW.grass_rings()pcg.FrameTimeW.runtime_grass_checkW.find_gpu_transfersW.generation_lead_checkfor name, args in W.build_pipeline(map, graphs): ue_run.run_commandlet(uproject, name, args)W.changelist_checkW.tour(...)W.REVIEW_CONSOLEue_review.image_checksW.world_rules_check(W.world_census(), vocab)W.budget_sheetW.lighting_handoff| Value | Setting | Relative to / source |
|---|---|---|
| Landscape 2 km | 2017 x 2017, 63 quads, 2x2, 256 of max 1024 components | 1 m quads (Landscape doc) |
| Z scale | span cm / 512 x 1.02; actor Z at the span midpoint | 16-bit heights (doc); headroom [added] |
| Template grid | cell 25,600 cm, range 76,800 cm | profile first (Deiter [00:15:32]) |
| PCG partition grid | 25,600 cm | PCG World Actor (Oztalay frame 00:23:16) |
| Hierarchical grids | unbounded, 128 m, 32 m | runtime grass (icIFFlOyob4 [00:08:39]) |
| Grass rings | dense to 128 m, sparse to 256 m | icIFFlOyob4 [00:15:30] |
| Instances per 32 m cell | 10k to 20k fine | base PS5, 5.6 demo [00:30:26] |
| 5 ms default; 2 ms in the demo | 5.6 notes; base PS5 [00:26:24] |
| Height upload | about 0.5 ms game thread per 32 m cell | base PS5 [00:24:12] |
| Streamed instances | 16 million hard limit | Nanite doc |
| Nanite construction | 250 MB vs 12 MB, same look | 6igUsOp8FdA [00:02:46] |
| Nanite Assemblies | 5 to 10% of asset size; 200 to 1,000 wind bones | aZr-mWAzoTg [00:07:13] [00:09:51] |
| Dicing rate | 2; slower below 2 and above about 5 or 6 | 6igUsOp8FdA [00:29:53] |
| Displacement center | 0.5 ground, 1 vertical rock, per layer | collision surface [00:22:58] |
| Terrain specular | 0.02 (Sensei); 0.5 as a cavity-driven ceiling (Cloward) | 5ju7wyvZGBI [00:11:12]; 0L5Azq6ugyo [00:01:19] |
| Tick aggregation | above 10 to 15 placed instances | Dark [00:23:04] |
| Mobile landscape | 3 layers, 16 samplers | ES3.1 (doc) |
W.*_checkheightmap_clip_gatepcg_graph_lintfind_gpu_transfersue_auditstat unitstat gpu-trace=WorldStreamingwp.Runtime.HLOD 0/1references/critique.md| Mistake | What it looks like | Fix |
|---|---|---|
| Z scale from a declared relief | plateaus and pits after import | fitted export, |
| 2048 heightmap | import refuses or resamples | 2017 or 4033 |
| All layers height-blended; layer without Layer Info | black patches; layer never paints | base layer Alpha Blend; Layer Info, same name |
| Second runtime grid | streaming cost, no gain | one grid, HLOD for distance |
| Runtime Data Layers for tidiness; Level Blueprint references | hitches; actors always loaded | Editor Data Layers; Blueprint classes |
| PCG volume without HLOD or Data Layer | baked forest missing at distance | assign both before generating |
| Runtime graph invisible in editor | artists see nothing | Treat Editor Viewport as Generation Source |
| Layer weights in a GPU graph | empty grass mask | grass types without meshes, Generate Grass Maps |
| Empty artist asset array | grass streams collapse | one placeholder per array |
| Cull or draw distance on Nanite | no thinning, rings do not hand over | HLOD, generation radius per ring |
| GPU-only trees | trees missing from Lumen | GPU-only for small things |
| One ever-larger grass radius | instance explosion, visible edge | two rings, recolored edge |
| Porous kitbashed rocks | huge assets, holes at distance | connected base, tiling texture |
| Construction-script scatter | 170,000 bodies, 7-minute map open (Oztalay [00:30:49]) | PCG output, clutter collision off |
| Generated PCG actors checked in | contention, stale data | builders own generation |
| Select-all edits on a big map | editor stalls | |
ue_audittour_viewpointsW.lighting_handoffW.budget_sheetpcg.FrameTimeworld_facts()landscape.ForceLayersFullUpdateForceLayersUpdateWorldPartitionLandscapeBuilderbForceRayTracingFarFieldMacreferences/expert-notes.mdreferences/procedures.mdreferences/critique.mdreferences/gui-paths.mdreferences/sources.md