World Streaming authoring
This chapter covers editor-side authoring: world definition, entity membership, the partition view, collaboration shards, and migrating existing levels.
World definition: WorldConfig + .wsworld
A partitioned world has two parts:
- WorldConfig entity on the level root with
WorldStreamingConfigComponent. - Sibling
.wsworlddescriptor listing bake aggregation sources and optional chunk / server-shard knobs.
WorldStreamingConfigComponent is bake-time data: the processor reads it and strips it, so it never reaches the runtime Root Spawnable and has no component-panel editing. It is normally written by the WorldStreaming_Level template, the Migration Tool, or EditorWorldStreamingRequestBus AuthorWorld* events.
| Field | Description |
|---|---|
WorldGuid / m_worldGuid | World identity for multiplayer handshake and bake-aggregation validation |
CellIdSalt / m_cellIdSalt | CellId hash salt; regenerate when grid layout (cell size / origin) changes |
Grids / m_grids | Grid level list |
Layers / m_layers | Content Layer descriptors |
HlodLayers / m_hlodLayers | HLOD layer descriptors |
Grid levels (WorldStreamingGridDesc)
| Field | Default | Description |
|---|---|---|
m_gridLevel | 0 | Level number; with multiple grids, lower = finer |
m_cellSize | 128 m | Cell edge length |
m_defaultLoadRadius / m_defaultActivateRadius | 256 / 128 m | Fallbacks when a streaming source gives no explicit radii |
m_verticalPartitioning + m_cellSizeZ | off | Vertical (Z) partitioned grid |
m_singleTierActivation | off | Activate on spawn, skipping the Loaded warmup tier |
m_use2DDistance | off | Vertically partitioned grid streams by XY-plane distance |
m_streamingPriority | 0 | Priority bias under budget pressure (ordering only) |
m_gridOriginD | (0,0,0) | Grid origin offset; changing it re-partitions the world |
Grid change severity
Changing grids raises interactive warnings:
| Severity | Meaning |
|---|---|
| None / TuningOnly | Safe tuning (radii, priority) |
| Additive | Additive layout change |
| FullRepartition | Full re-partition—confirm in the modal, regenerate m_cellIdSalt, and rebake everything |
Entity membership rules
Assignment priority:
- Member with
IsSpatiallyLoaded = false→ AlwaysLoaded cell. - Explicit
m_runtimeGridLevel(not inherit). - Otherwise pivot position on the default (finest) grid.
- Opt-in
m_autoGridLevelFromBounds: pick the finest grid that can contain the world AABB.
Ordinary entities need no Member component. Cross-cell hard references are diagnosed by default; enable m_patchCrossCellHardRefs plus DependentLoad to record alias repair entries.
WorldStreamingMemberComponent
| Field | Default | Description |
|---|---|---|
IsSpatiallyLoaded / m_isSpatiallyLoaded | true | false = AlwaysLoaded (still gated by Content Layers) |
RuntimeGridLevel / m_runtimeGridLevel | 0xFF (inherit) | Explicit target grid |
LayerId / m_layerId | 0 | Owning Content Layer |
BundleGroupId / m_bundleGroupId | 0 | Strong-reference co-load group |
DependentLoadTargets | empty | Target entities’ cells must be at least Loaded before this cell activates |
ExcludeFromHlod / m_excludeFromHlod | false | Static meshes never enter HLOD proxy geometry |
SoftReferenceTargets | empty | Soft cross-cell refs; does not pull the target cell |
Transform hierarchy clustering (opt-in)
m_clusterTransformHierarchy (default off) keeps Transform parent/child trees in the same cell as the root. Enabling it changes cross-cell layout—rebake after changing.
Partition view (Tools > World Streaming)
Typical panel capabilities:
| Area | Actions |
|---|---|
| Overview | World status, grid / layer summary |
| Focus loading | Load a radius around the camera for editing without activating the whole world |
| Loaded Regions | Persistent editor regions of interest; never enter the runtime Manifest |
| Content Layers | Toggle / inspect layer authoring state |
| Bake | Bake World Streaming, Bake Region, Bake GPU Octahedral Impostors |
| Shards | Save Dirty Cell Shards, AutoShard, Focus Edit Cell Shard |
| Migration | Migration Tool. for existing levels |
Unloaded-cell proxies in the viewport are session-only and never saved or baked.
Collaboration shards (editor)
Editor shards split cell content into independent Prefabs for multi-user editing. This is not the same as server shards.
| Granularity | Control | Notes |
|---|---|---|
| Primary shard (default) | — | One shard Prefab per cell |
| AutoShard | “Auto-create shards on first content” | Creates a shard when content first lands in an empty cell |
| Sub-shards | “Max entities per sub-shard” (0 = off) | Split into _sN by entity-count cap |
| Per-actor sidecars | “Per-actor sidecars” (requires AutoShard) | _a<key> one file per entity |
| Orphan sidecar cleanup | “Delete pruned sidecar files” (default off) | Default only unregisters; on = source-control-aware delete |
Sub-shards / sidecars conflict with independent multi-source cells unless both migration m_allowMultiSourceCells and bake key MergeMultiSourceCells are on.
Use Save Dirty Cell Shards before bake or handoff. Scripted focus: FocusEditCellShard / ClearEditCellShardFocus on EditorWorldStreamingRequestBus.
Migration Tool
For levels that predate World Streaming:
- Open Tools → World Streaming → Migration Tool..
- Choose grids / layers / salt options the dialog exposes.
- Commit; the tool writes WorldConfig +
.wsworldand rewrites Prefabs as needed.
Alternatively automate with AuthorWorldBegin → AuthorWorldAddGrid / AuthorWorldAddHlodLayer / AuthorWorldSetShardSize → AuthorWorldCommit (see
Scripting).
Next steps
- Baking: produce
.wsmanifestand cell Spawnables. - Content Layers / HLOD: declare advanced world features.
- Reference: full field tables.