Ue Levels And World Partition logo

Ue Levels And World Partition

Community
kevinpbuckley
ue-levels-and-world-partition

Structure and stream Unreal worlds in C++ — UWorld (persistent level + streaming levels), ULevel, ULevelStreaming; World Partition (UWorldPartition, runtime spatial-hash grid, UWorldPartitionRuntimeCell, streaming sources/UWorldPartitionStreamingSourceComponent); Data Layers (UDataLayerAsset, UDataLayerInstance, UDataLayerManager, EDataLayerRuntimeState); Level Instances (ALevelInstance, APackedLevelActor); One File Per Actor (OFPA); legacy sublevel streaming (UGameplayStatics::LoadStreamLevel / UnloadStreamLevel, Level Streaming Volumes). Use when organizing a level, building open-world or large-level streaming, toggling content sets (day/night, quest states) at runtime, creating reusable instanced level chunks, or choosing between World Partition and explicit sublevels.

Overview

Publisherkevinpbuckley
Repositoryunreal-engine-skills
Skill nameue-levels-and-world-partition
Stars
89
Forks
9
Bundled files
3
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 3 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by kevinpbuckley on GitHub. Read the source before you install it.

Installation

Install the Ue Levels And World Partition AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/kevinpbuckley/unreal-engine-skills/tree/master/skills/core/ue-levels-and-world-partition
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/kevinpbuckley/unreal-engine-skills.git /tmp/unreal-engine-skills
mkdir -p .claude/skills
cp -r /tmp/unreal-engine-skills/skills/core/ue-levels-and-world-partition .claude/skills/ue-levels-and-world-partition
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Ue Levels And World Partition in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Ue Levels And World Partition on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Ue Levels And World Partition is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Levels & World Partition

A UWorld is the running game world. It always has one persistent level (UWorld::PersistentLevel) and any number of streamed levels. For large worlds, World Partition — the default for new projects in UE5 — replaces hand-managed sublevels with automatic spatial streaming around streaming sources.

When to use this skill

  • Organizing world content across levels and keeping memory under control.
  • Building an open world or large level that cannot be fully resident.
  • Toggling sets of actors at runtime (day/night, story states, destruction phases).
  • Making reusable, instanced level chunks (buildings, modular areas).
  • Working with legacy explicit sublevels in a project that predates World Partition.

Core mental model

UWorld
├── PersistentLevel (ULevel)          ← always loaded; world settings, managers
├── UWorldPartition                   ← present if WP is enabled
│   ├── runtime grid (spatial hash)   ← cells loaded/unloaded by streaming sources
│   ├── UDataLayerManager             ← controls Data Layer states
│   └── actor descriptor registry     ← OFPA: each actor = its own .uasset file
└── StreamingLevels [ ]               ← present when using legacy sublevels
    └── ULevelStreaming → ULevel       ← one per streamed sublevel

UWorld is accessible via AActor::GetWorld() anywhere in gameplay code. UWorld::GetWorldPartition() returns the UWorldPartition object (null for non-WP worlds). UWorld::GetDataLayerManager() returns the UDataLayerManager (World Partition only).

Two streaming models

ModelBest forMechanism
World Partition (modern)open worlds, large levelsengine auto-streams grid cells around streaming sources
Sublevels (legacy/explicit)small games, hand-authored zonesyou load/unload named levels in code, Blueprint, or via Streaming Volumes

World Composition (pre-UE5) is superseded by World Partition. Do not start new projects with it.

World Partition

World Partition stores the entire world in a single persistent level. At runtime a spatial-hash grid subdivides the world into cells. Cells load and unload automatically as streaming sources (player controllers by default) move through the world.

Runtime grid settings

Configured in World Settings → World Partition Setup. Key fields per grid:

  • Cell Size — spatial footprint of one streaming cell (e.g. 25 600 cm = 256 m default).
  • Loading Range — radius around a streaming source inside which cells are loaded.
  • Block on Slow Streaming — stalls the game thread if cells are loading too slowly.

Streaming sources

APlayerController is a streaming source by default (opt out via Enable Streaming Source in its Details). For other viewpoints — cinematic cameras, portal previews, teleport destinations — add UWorldPartitionStreamingSourceComponent to any actor:

cpp
// Acquiring the component (it is added in the editor or at construction)
UWorldPartitionStreamingSourceComponent* Src =
    GetComponentByClass<UWorldPartitionStreamingSourceComponent>();

// Enable/disable at runtime
Src->EnableStreamingSource();
Src->DisableStreamingSource();

// Poll completion (e.g. before teleporting a player)
if (Src->IsStreamingCompleted())
{
    // cells are ready
}

Source: Runtime/Engine/Classes/Components/WorldPartitionStreamingSourceComponent.h: EnableStreamingSource:28, DisableStreamingSource:32, IsStreamingCompleted:44.

Checking WP state in C++

cpp
if (UWorldPartition* WP = GetWorld()->GetWorldPartition())
{
    // World is a partitioned world
}
UDataLayerManager* DLM = GetWorld()->GetDataLayerManager(); // null for non-WP worlds

Source: Runtime/Engine/Classes/Engine/World.h:2955 (GetWorldPartition), :2963 (GetDataLayerManager).

Data Layers

Data Layers group actors so entire sets can be enabled/disabled as a unit.

TypePurposeModifiable at runtime?
Runtimegameplay toggling (day/night, destruction, quest states)yes
Editororganization in the editorno

Define a Data Layer as a UDataLayerAsset (a UDataAsset subclass). Each world creates UDataLayerInstance objects owned by UDataLayerManager. Three runtime states: Unloaded → Loaded → Activated.

Changing Data Layer state from C++ (5.3+):

cpp
// Preferred: UDataLayerManager (replaces deprecated UDataLayerSubsystem)
UDataLayerManager* DLM = GetWorld()->GetDataLayerManager();
if (DLM)
{
    const UDataLayerInstance* Instance = DLM->GetDataLayerInstanceFromAsset(MyDataLayerAsset);
    DLM->SetDataLayerInstanceRuntimeState(Instance, EDataLayerRuntimeState::Activated);
}

EDataLayerRuntimeState values: Unloaded, Loaded, Activated (Runtime/Engine/Public/WorldPartition/DataLayer/DataLayerInstance.h:23).

UDataLayerSubsystem exists for Blueprint compatibility but is deprecated since 5.3. Prefer UDataLayerManager in new C++ code.

See references/data-layers-and-hlod.md for HLOD interaction, load-filter flags, replication rules, and extended examples.

Level Instances & Packed Level Actors

Level Instances (ALevelInstance) embed a .umap as a reusable prefab. One edit propagates to every instance in the world. At runtime, levels using OFPA are embedded into the World Partition grid (default); levels without OFPA use level-streaming mode at a higher runtime cost.

Packed Level Actors (APackedLevelActor, a subclass of ALevelInstance) bake all Static Meshes from a Level Instance into a single ISM-backed actor — ideal for static buildings or dense visual assemblies where instancing is valuable.

Both types participate in World Partition Data Layers: actors inside the Level Instance inherit the Data Layer assigned to the Level Instance Actor.

Source:

  • Runtime/Engine/Public/LevelInstance/LevelInstanceActor.h:18 — ALevelInstance
  • Runtime/Engine/Public/PackedLevelActor/PackedLevelActor.h:25 — APackedLevelActor

See references/level-instances.md for runtime-behavior differences, in-context editing workflow, and property overrides.

One File Per Actor (OFPA)

With World Partition enabled, every actor is serialized to its own file under __ExternalActors__/ alongside the level package. Consequences:

  • Multiple developers can edit different actors without locking the level file.
  • Source control changelists contain many small files with encoded names; use the in-editor View Changelist window for human-readable names.
  • At cook time, all external actor files are embedded back into the level package.
  • Non-OFPA actors inside a Level Instance fall back to Level Streaming mode at runtime.

OFPA is enabled automatically with World Partition; set bUseExternalActors = true (Runtime/Engine/Classes/Engine/Level.h:445) to enable it on a non-partitioned level.

Legacy sublevel streaming

For projects without World Partition, use UGameplayStatics to load/unload sublevels:

cpp
#include "Kismet/GameplayStatics.h"

// Load async; bMakeVisible=true shows it immediately, bShouldBlockOnLoad=false = async
UGameplayStatics::LoadStreamLevel(this, TEXT("Zone_Forest"),
    /*bMakeVisible*/ true, /*bShouldBlockOnLoad*/ false, FLatentActionInfo());

// Unload async
UGameplayStatics::UnloadStreamLevel(this, TEXT("Zone_Forest"),
    FLatentActionInfo(), /*bShouldBlockOnUnload*/ false);

Source: Runtime/Engine/Classes/Kismet/GameplayStatics.h:306 (LoadStreamLevel), :314 (UnloadStreamLevel).

Level Streaming Volumes (ALevelStreamingVolume) trigger load/unload automatically when the player enters/exits; wired via the Levels window. Best for smaller games with discrete zones.

ULevelStreaming (Runtime/Engine/Classes/Engine/LevelStreaming.h:138) is the underlying object that tracks each sublevel's load state; UWorld::StreamingLevels holds the array.

See references/world-partition-streaming.md for the full WP streaming lifecycle, console commands for debugging, and notes on server-side streaming.

Decision guide

ScenarioRecommended approach
Small/linear game, explicit zonesPersistent level + legacy streaming sublevels
Open world or very large levelWorld Partition (default cell grid)
Variant world statesRuntime Data Layers
Reusable repeating structuresLevel Instances / Packed Level Actors
Level Instance inside an open worldALevelInstance with OFPA → Embedded Mode

Gotchas

  • Everything in one level — memory blowout; add World Partition or explicit sublevels.
  • Hard pointer to an actor in another WP cell — the pointer becomes stale when the cell unloads; use TSoftObjectPtr and re-acquire via async-loading / ue-asset-management.
  • Blocking loads (bShouldBlockOnLoad = true) on the game thread cause hitches; stream async and gate on the latent callback or IsStreamingCompleted.
  • OFPA + source control — thousands of tiny files; configure VCS ignore rules for generated directories and never commit from outside the editor.
  • World Composition for new projects — deprecated path; use World Partition instead.
  • UDataLayerSubsystem in 5.3+ — fully deprecated; all paths must use UDataLayerManager from UWorld::GetDataLayerManager().
  • Level Blueprint actors in WP — any actor referenced from a Level Blueprint is treated as Always Loaded, which defeats streaming; prefer Blueprint Classes.
  • Data Layer state replication — states for unfiltered (server+client) Data Layers must be set on the server; Client-Only layers must be set on the client. Setting on the wrong side has no effect (see UDataLayerManager::SetDataLayerInstanceRuntimeState).

Version notes

  • World Partition and OFPA are the default for all Games-category project templates in UE 5.0+. Streaming can be disabled (World Settings → Enable Streaming) while keeping the WP architecture (useful for small games that still want OFPA).
  • UDataLayerSubsystem deprecated 5.3; UDataLayerManager is the API for 5.3+.
  • TargetHLODLayers on UWorldPartitionStreamingSourceComponent deprecated 5.4; use TargetGrids instead.
  • ECurrentState on ULevelStreaming deprecated 5.2; use ELevelStreamingState.

References & source material

Engine source (UE 5.8, Engine/Source/):

  • Runtime/Engine/Classes/Engine/World.h:931 — UWorld; :953 PersistentLevel; :1001 StreamingLevels; :2955 GetWorldPartition; :2963 GetDataLayerManager.
  • Runtime/Engine/Classes/Engine/Level.h:419 — ULevel; :445 bUseExternalActors (OFPA).
  • Runtime/Engine/Classes/Engine/LevelStreaming.h:138 — ULevelStreaming.
  • Runtime/Engine/Classes/Kismet/GameplayStatics.h:306 — LoadStreamLevel; :314 UnloadStreamLevel.
  • Runtime/Engine/Public/WorldPartition/WorldPartition.h:152 — UWorldPartition.
  • Runtime/Engine/Public/WorldPartition/WorldPartitionSubsystem.h:63 — UWorldPartitionSubsystem.
  • Runtime/Engine/Public/WorldPartition/DataLayer/DataLayerAsset.h:29 — UDataLayerAsset.
  • Runtime/Engine/Public/WorldPartition/DataLayer/DataLayerInstance.h:59 — UDataLayerInstance; :23 EDataLayerRuntimeState.
  • Runtime/Engine/Public/WorldPartition/DataLayer/DataLayerManager.h:46 — UDataLayerManager; :82 SetDataLayerInstanceRuntimeState.
  • Runtime/Engine/Public/WorldPartition/DataLayer/DataLayerSubsystem.h:26 — UDataLayerSubsystem (deprecated 5.3).
  • Runtime/Engine/Classes/Components/WorldPartitionStreamingSourceComponent.h:16 — UWorldPartitionStreamingSourceComponent.
  • Runtime/Engine/Public/LevelInstance/LevelInstanceActor.h:18 — ALevelInstance.
  • Runtime/Engine/Public/PackedLevelActor/PackedLevelActor.h:25 — APackedLevelActor.

Official docs (UE 5.8, all fetched and confirmed):

Deep-dive references in this skill:

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Ue Levels And World Partition AI skill do?

Structure and stream Unreal worlds in C++ — UWorld (persistent level + streaming levels), ULevel, ULevelStreaming; World Partition (UWorldPartition, runtime spatial-hash grid, UWorldPartitionRuntimeCell, streaming sources/UWorldPartitionStreamingSourceComponent); Data Layers (UDataLayerAsset, UDataLayerInstance, UDataLayerManager, EDataLayerRuntimeState); Level Instances (ALevelInstance, APackedLevelActor); One File Per Actor (OFPA); legacy sublevel streaming (UGameplayStatics::LoadStreamLevel / UnloadStreamLevel, Level Streaming Volumes). Use when organizing a level, building open-world or...

Why use Ue Levels And World Partition on TypingMind?

Because you install it once and use it with any model. Ue Levels And World Partition is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Ue Levels And World Partition in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/kevinpbuckley/unreal-engine-skills/tree/master/skills/core/ue-levels-and-world-partition. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Ue Levels And World Partition?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Ue Levels And World Partition?

As many as you like. As long as a model supports skills, you can use Ue Levels And World Partition with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Ue Levels And World Partition AI skill free?

It is published on GitHub by kevinpbuckley. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇