[UE5] World Partition and Level Streaming Basics: Loading Only the Places You Need

Created: 2025-12-12Last updated: 2026-09-07

Diagrams the mechanism for loading only the places you need on a large map. Organizes World Partition, Enable Streaming, and Data Layers, then covers a hands-on toggling three Cubes with a Level Streaming Volume through to loading from Blueprint.

You line up chairs and shelves inside the inn and build rooms in the neighboring building too. The richer the town gets, the more data you hold for places you are not currently visiting.

That is where loading only the places you need comes in. Prepare a room before you approach and clear it away once you are far enough. Swapping parts of a level in and out while playing like this is called level streaming.

A schematic prioritizing loading around the player within a large map

UE5's World Partition is one system that performs this streaming. We first organize the big picture, then in the second half make three Cubes appear as you approach and disappear as you leave.

What You'll Learn

  • The difference between skipping rendering and not loading a level
  • The roles of World Partition, Data Layers, and traditional sub-levels
  • How to build a loading range with a Level Streaming Volume
  • A minimal example of loading from Blueprint, and what to verify

This assumes Windows UE5 and experience placing Actors. The hands-on uses a practice level created inside a Third Person project. The diagrams are schematics for this blog.

Sponsored

Even invisible things may be loaded

In the LOD and culling article we simplified shapes and removed invisible things from rendering. A culled Actor still exists in the level. If Tick runs off screen, that logic continues too.

Loading reads data in and makes it usable. Unloading removes a loaded level from the running world. Streaming separates the unit of this swapping.

Culling skips rendering, while unloading a level removes its placed objects from the world
AdjustmentWhat it mainly reduces
LOD and cullingThe work of drawing the screen
Splitting levels and streamingPlaced objects and data held at once, and the startup load

That said, removing one room does not mean every image used in it instantly leaves memory. Data shared with other rooms remains. First confirm which levels exist only while needed, then measure memory and processing time afterwards.

Sorting out World Partition and sub-levels

There are broadly two ways to author loading units.

World Partition splits space, while the traditional method has the author split contents into sub-levels

With World Partition, you edit a large map as one level and the engine splits space into loading units. It is the first method to consider for games where you roam a large outdoor area.

With the traditional method, you register sub-levels in separate files onto a foundational Persistent Level. Split just a room's furniture into one sub-level and control its loading with a Volume or Blueprint. "Persistent" means the foundation for as long as that world is in use, which differs from save data that survives quitting the game.

What you want to doCandidate
Load the surroundings on a large mapWorld Partition
Swap festival decorations or post-progress scenery inside World PartitionRuntime Data Layers
Toggle split rooms by a defined range or an eventTraditional sub-levels + Volume / Blueprint
Move to a different map, such as title to main gameOpen Level

There is no need to split it as "distance means World Partition, events mean the traditional method." World Partition also has Data Layers for swapping contents by event.

In a World Partition level, the procedure of adding sub-levels in the traditional Levels panel is unavailable. The hands-on later uses a new practice level without World Partition. There is no need to convert an existing map.

World Partition selects and loads the range you need

One partitioned block is a cell, and what centers the loading is a Streaming Source. Normally the player's position becomes the center, and the cells needed change as they move.

Cell size and the range loaded from the Streaming Source are separate settings

Cell Size is how finely it is divided; Loading Range is how far from the source things are prepared. Smaller cells do not always make things lighter, since managing fine-grained swapping is work too. The numbers differ by template and partition method, so start from your own settings as the baseline.

Separate enabling World Partition from Enable Streaming

Creating from "File → New Level → Open World" gives you a level using World Partition. Also check Enable Streaming under "World Partition Setup" in World Settings. That is the setting for whether it loads in ranges at runtime.

Some World Partition-capable templates ship with that checkbox off. "It's World Partition, so it must already be loading only nearby" is not necessarily true.

Confirm using World Partition's mechanism and turning Enable Streaming on as separate things

In fast-moving games you need to read further ahead, and with teleportation you prepare the destination first. That is why Streaming Sources can be placed somewhere other than the player.

The range loaded in the editor is for your work

On a large World Partition map you can work while loading only the area you are editing. Select a range in "Window → World Partition → World Partition Editor" and load from the right-click Load Region from Selection.

That is the range you work in within the editor. It does not set the Loading Range during play. If part of the level is missing when you open it, check the loaded work region and Data Layer visibility.

Actors you want to keep regardless of distance

For placed manager Actors and the like, turning off Is Spatially Loaded in the Details removes them from distance-based loading. But depending on the assigned Runtime Data Layer's state, they may still not load. Do not memorize it as "off means always resident under any condition."

Where to hold score and progression is considered together with Game Framework and GameInstance. Directly referencing distant Actors can cause them to load together, so a design that hooks everything onto resident Actors is harder to handle.

Sponsored

Data Layers swap contents within the same place

You want food stalls in the daytime plaza only during the festival. Data Layers suit these cases where the place is the same but the contents change. You assign Actors to groups and handle them together.

The Editor type is for organizing editing work; the Runtime type is for changing state during the game too. Use Runtime to bring out stalls when the festival starts.

Runtime stateHow to think about it
UnloadedNot loaded
LoadedLoaded, but not yet at the stage of being shown and active
ActivatedLoaded and put into a displayed state
Handling the same plaza's stalls in the Unloaded, Loaded, and Activated states

Data Layers have an Asset saved in the Content Browser and an Instance used within that level. The Asset defines the name and type; the Instance is the receptacle where you assign Actors and decide the initial state.

To create them, make an Asset with "Miscellaneous → Data Layer" in the Content Browser and drag it into "Window → World Partition → Data Layer Outliner" to prepare an Instance. Open the Asset and set Type to Runtime, then choose the startup state in the Instance's Initial Runtime State. Select the target Actors and assign them with "Add Selected Actors to Selected Data Layers" on the Outliner side.

Using Loaded lets you build a setup that prepares before showing. But specifying a state does not mean loading is finished at that instant. Calling Loaded and then Activated in succession does not amount to waiting in advance. The spatial loading conditions matter too.

Grasp that role first; from here we try swapping with sub-levels, whose loading units are easier to follow visually.

Hands-On: loading three Cubes on approach

Before preparing hundreds of pieces of furniture, confirm the mechanism with three Cubes. Keeping the floor in place, we make only the Cubes appear on approach and disappear as you leave.

On the same floor, three Cubes appear as you approach and are removed as you leave

1. Separate the foundation from what gets swapped

Open a Third Person project, create a new level with "File → New Level → Basic," and save it as L_StreamPractice. This is a practice level without World Partition.

Set World Settings' "GameMode Override" to the template's BP_ThirdPersonGameMode and place a Player Start. If one exists, keep just it. Play once and confirm you can walk first.

  1. Widen the floor so you can walk plenty left and right. Using a basic Cube as an example, position (0, 0, -10) with Scale (60, 30, 0.2) gives a floor whose top is Z=0. Replace the original floor so they do not overlap.
  2. Place the Player Start around (-1800, 0, 100) with rotation Yaw 0. That is a starting point facing the positive X direction.
  3. Open "Window → Levels," create an Empty Level with "Levels → Create New," and save it as L_Props.
  4. Right-click L_Props and set "Change Streaming Method → Blueprint." Leaving it Always Loaded means you cannot test range-based swapping.
  5. Right-click L_Props and choose Make Current. That chooses "which level the Actors you place next belong to."
  6. Place three basic Cubes from "Place Actors → Shapes → Cube" at (200, 0, 50), (500, 0, 50), and (800, 0, 50), all with Scale 1.

The Cube used here is the standard 100 cm shape. Z=50 puts its bottom at floor height.

The Persistent Level holds the floor and Player Start while L_Props holds the three Cubes

Toggle L_Props' eye icon and confirm that only the Cubes disappear while the floor and Player Start remain. That is your first success. The eye icon is an editing-time visibility check, separate from in-game loading settings. Restore visibility and save both levels.

2. Place the volume that keeps it loaded

In Levels, set the Persistent Level back to Make Current. Search Level Streaming Volume in "Place Actors," place one, and name it LSV_Props. It is a Volume for level loading, distinct from an ordinary Box Collision.

A Volume represents an invisible region in the game. This Volume checks whether the player's camera is inside the range. Even with the body inside, a camera behind them being outside is not the same test.

As an example, set the Volume's position to (600, 0, 200) with rotation 0 and Scale 1 on each axis, and set the box dimensions in "Brush Settings" to X=2000, Y=1600, Z=800. In X it covers -400 to 1600, containing the three Cubes and their surroundings.

Give the loading range margin around the props and toward the entrance, and account for the camera behind

In a real room, cover from in front of the entrance through the whole interior, wherever the camera travels. Wrapping thinly around just the doorway means you leave the range the moment you step in and unload the contents.

3. Associate the Volume with L_Props

Set LSV_Props' Details as follows.

ItemValue
Streaming UsageLoading and Visibility
Editor Pre Vis OnlyOff
DisabledOff

Next select L_Props in Levels and open Level Details from the magnifier icon in the Levels panel. Add an element with + under "Streaming Volumes" and choose LSV_Props. Turn "Initially Loaded" and "Initially Visible" off.

Designating LSV_Props from L_Props' Level Details and enabling loading and visibility on the Volume side

That binds "the level this range requires is L_Props." Since the Volume itself stays in the Persistent Level, it can still judge your next approach after the Cubes are gone. Save everything.

4. Walk out, in, and out again to confirm

Launch Standalone Game from the Play menu and enter stat levels in the console. That is the display for checking level loading state. For how to open the console, see the stat command article.

  1. At the start, confirm the Cubes are not yet displayed.
  2. Walk in the positive X direction. After the camera enters the Volume and loading finishes, the three appear.
  3. Walk around the Cubes and confirm they remain while you are inside the Volume.
  4. Return well toward the start and wait a moment. Confirm the Cubes disappear and L_Props moves to the unloaded side.

stat levels also shows intermediate states. Rather than judging by a momentary color, look at both the actual display and the state once it settles. It not vanishing the instant you leave is fine; there is time between the request and the processing.

What goes wrongWhere to check
The Cubes remain from the startWhether L_Props is Always Loaded, the initial load flags, and the camera position at startup
They never appear on approachThe Streaming Volumes association, Disabled, and Editor Pre Vis Only
The floor disappears tooWhether the floor was placed in L_Props. Right-click the Persistent Level in Levels and use Move Selected Actors to Level
They disappear inside the roomWhether the camera left the Volume. Widen the range
Levels operations are unavailableWhether the open level is a World Partition level

Once you confirm the three swapping, you can replace L_Props' Cubes with furniture and props. Confirming the range design first and increasing the contents afterwards makes causes easier to trace.

Sponsored

Loading from Blueprint

To load when an event happens, use Load Stream Level. Using the same L_Props, you can try a minimal example that loads once at game start.

Save the earlier L_StreamPractice as L_StreamBlueprint with "Save Current Level As." In this copy, remove the Streaming Volumes association in L_Props' Level Details. Controlling the same level from both a Volume and Blueprint leads to unintended swapping.

L_Props' method stays Blueprint, and Initially Loaded and Initially Visible stay off. Choose "Open Level Blueprint" from the Blueprints menu in the top toolbar and connect the following in L_StreamBlueprint's Level Blueprint.

  1. Connect an exec line from Event BeginPlay to Load Stream Level (by Name).
  2. Set Level Name to L_Props, Make Visible After Load on, and Should Block on Load off.
  3. Connect Completed to a Print String with the text Props loaded.
Loading L_Props from BeginPlay and proceeding to Print String from Completed

Compile, save, and launch Standalone. This time the Cubes appear without approaching, and the notification means loading happened from startup logic. Check the Level Name's spelling and confirm against the actual Cubes and stat levels.

Load Stream Level is a latent node, one handling logic that takes time to complete. Completed is the output for proceeding afterwards. Make Visible After Load chooses "whether to show it after loading."

Turning Should Block on Load on can halt game progression while waiting for the load to finish. For logic preparing while you walk, as here, turn it off. But even off, work such as initialization remains, so hitching does not disappear entirely.

There is Unload Stream Level for the removal side. When applying it to real entry and exit, call it after confirming the player is not still inside and that the previous request completed. Connecting it straight to the entrance's End Overlap would remove things once you step into the room.

Once it works, focus on the loading gap

Once swapping works, look at "does it make it in time." If furniture appears after you reach the entrance, widen the Volume in front of the entrance to start loading earlier. Also confirm you never see an empty room when you turn the camera.

Reading right at the entrance can be too late, so provide a range that prepares from further out
What to confirmHow to check
Whether it is loaded only while neededstat levels and actually entering and leaving
Whether it feels like a stall at the boundaryRepeat walking, running, and turning
Which work takes timestat unit, and Unreal Insights if needed
Memory changesCompare before and after loading, and over time, under identical runs

PIE is convenient for trying switch positions, but since the editor already holds the data, load times differ from reality. Confirm in Standalone too, and finally run the packaged game on the target environment.

With three Cubes, seeing almost no performance difference is natural. Even comparing with more furniture, you cannot compute "one building costs N ms, so ten cost ten times that." The amount drawn, shared assets, camera direction, and the work at load time all matter.

Bonus: Good to Know Up Front

OFPA is a mechanism for splitting editing-time saves

One File Per Actor (OFPA) saves each placed Actor's information into its own file. World Partition uses it by default, reducing how often people editing different Actors touch the same level file.

The difference between saving into one level file and splitting per Actor with OFPA

This is mainly an editor and source control matter. OFPA can be used outside World Partition, and at packaging time Actor data is gathered into the level. For managed items including __ExternalActors__, see the Git management article.

HLOD, which preserves distant views, needs setup and a build

HLOD uses a simplified representation combining several placed objects for distant views. It serves to preserve a townscape's silhouette even when the original fine cells are not loaded.

Enabling World Partition alone does not complete all distant views. You have to configure the target HLOD Layer and build HLODs. Where normal LOD changes one model's detail, HLOD handles several placed objects together.

Where to keep the state of Actors that vanished

Unload a room's Actors and you cannot count on that Actor's variables being intact for the next visit. For things like an opened chest, record the needed state in GameInstance or save data and apply it on reload.

Memory is also affected by the timing of garbage collection, which reclaims unneeded data, and by references from elsewhere. Do not assume waiting on collection is the only reason values do not drop after unloading; investigate with Unreal Insights when needed.

Start by splitting out just a room's props and test whether you can prepare before approaching. Walking through to confirm where loading starts and how far it persists reveals the range your own map needs.

Summary

  • "Not drawing" and "not loading" are different things
  • World Partition splits a large world automatically, and Data Layers handle swapping within a block
  • A Level Streaming Volume loads when you enter a range
  • When loading from Blueprint, wait for completion before proceeding

The question when choosing is "can you walk there, or does the scene switch?" If you can walk there, streaming; if it switches, level transitions with Open Level.

Reducing the rendering side is covered in LOD and culling.

References: World Partition, Data Layers, Level Streaming Volumes, Setting up volumes, Load Stream Level.

Unreal Engine Notes in this section98