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.
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.
- Even invisible things may be loaded
- Sorting out World Partition and sub-levels
- World Partition selects and loads the range you need
- Data Layers swap contents within the same place
- Hands-On: loading three Cubes on approach
- Loading from Blueprint
- Once it works, focus on the loading gap
- Bonus: Good to Know Up Front
- Summary
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.

| Adjustment | What it mainly reduces |
|---|---|
| LOD and culling | The work of drawing the screen |
| Splitting levels and streaming | Placed 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.

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 do | Candidate |
|---|---|
| Load the surroundings on a large map | World Partition |
| Swap festival decorations or post-progress scenery inside World Partition | Runtime Data Layers |
| Toggle split rooms by a defined range or an event | Traditional sub-levels + Volume / Blueprint |
| Move to a different map, such as title to main game | Open 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 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.

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.
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 state | How to think about it |
|---|---|
| Unloaded | Not loaded |
| Loaded | Loaded, but not yet at the stage of being shown and active |
| Activated | Loaded and put into a displayed state |

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.

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.
- 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.
- Place the Player Start around (-1800, 0, 100) with rotation Yaw 0. That is a starting point facing the positive X direction.
- Open "Window → Levels," create an Empty Level with "Levels → Create New," and save it as L_Props.
- Right-click L_Props and set "Change Streaming Method → Blueprint." Leaving it Always Loaded means you cannot test range-based swapping.
- Right-click L_Props and choose Make Current. That chooses "which level the Actors you place next belong to."
- 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.

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.

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.
| Item | Value |
|---|---|
| Streaming Usage | Loading and Visibility |
| Editor Pre Vis Only | Off |
| Disabled | Off |
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.

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.
- At the start, confirm the Cubes are not yet displayed.
- Walk in the positive X direction. After the camera enters the Volume and loading finishes, the three appear.
- Walk around the Cubes and confirm they remain while you are inside the Volume.
- 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 wrong | Where to check |
|---|---|
| The Cubes remain from the start | Whether L_Props is Always Loaded, the initial load flags, and the camera position at startup |
| They never appear on approach | The Streaming Volumes association, Disabled, and Editor Pre Vis Only |
| The floor disappears too | Whether 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 room | Whether the camera left the Volume. Widen the range |
| Levels operations are unavailable | Whether 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.
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.
- Connect an exec line from Event BeginPlay to Load Stream Level (by Name).
- Set Level Name to L_Props, Make Visible After Load on, and Should Block on Load off.
- Connect Completed to a Print String with the text Props loaded.

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.

| What to confirm | How to check |
|---|---|
| Whether it is loaded only while needed | stat levels and actually entering and leaving |
| Whether it feels like a stall at the boundary | Repeat walking, running, and turning |
| Which work takes time | stat unit, and Unreal Insights if needed |
| Memory changes | Compare 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.

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.