マップを広く作り込んでいくと、ある時点でエディタの起動が遅くなり、プレイ開始までの待ち時間が伸びていきます。原因ははっきりしていて、 レベル全体を一度にメモリへ読み込んでいる からです。プレイヤーが立っているのはマップの片隅なのに、反対側の街も森も全部メモリに載っています。
解決の方向は1つです。 必要な範囲だけを読み込み、離れたら捨てる 。UE5にはこれを自動でやる World Partition と、自分のタイミングで切り替える Level Streaming の2つがあります。この記事では、UE5における2つの現在地と使い分け、そして屋外から屋内へレベルを切り替える実装までを解説します。
この記事でわかること
- UE5の現在地: 広いマップはWorld Partitionが既定
- World Partitionの仕組み( グリッドに区切って近くだけ読む )
- Data Layers で昼夜やイベントごとに出し分け る
- 手動の Level Streaming が今も有効な場面
- 実践:屋外マップから 建物内へ入るときにレベルを切り替える
なぜ分割するのか:DrawではなくメモリとCPUの話
前の記事 LOD・カリング・オクルージョン で扱ったのは、 レベルに置いてあるものを描かない 技術でした。カリングで除外されたオブジェクトは描画されませんが、 メモリには載ったまま です。

読み込んだままだと、次のコストが残ります。
| 残るコスト | 内容 |
|---|---|
| メモリ | メッシュ・テクスチャ・マテリアルがすべて常駐する |
| CPU | Tickするアクターは画面外でも動き続ける |
| 初期ロード時間 | プレイ開始前に全部を読み終える必要がある |
| エディタの重さ | レベルを開くたびに全アクターを読み込む |
ストリーミングは、この4つに効きます。 カリングが「描かない」なら、ストリーミングは「持たない」 。担当する領域が違うので、どちらか一方では代わりになりません。
UE5の現在地:World Partitionが既定
ここは古い情報が多く出回っている部分なので、先に整理します。
UE4では、大きなマップを扱う方法は World Composition(タイル状のレベルを並べる)か、 手動のLevel Streaming(サブレベルを自分でロードする)でした。どちらもレベルを人の手で分割する前提です。
UE5.0で World Partition が導入され、この前提が変わりました。 レベルは1つのまま扱い、分割はエンジンが自動で行います 。World Compositionは非推奨となり、大きなマップの標 準的な作り方はWorld Partitionになりました。

新規レベルを File → New Level から作るとき、 Open World または Empty Open World テンプレートを選ぶと、World Partitionが有効な状態で作られます。Basic や Empty Level では有効になりません。
| テンプレート | World Partition |
|---|---|
| Open World | 有効(地形とライティングつき) |
| Empty Open World | 有効(中身は空) |
| Basic | 無効 |
| Empty Level | 無効 |
そして重要な制約が1つあります。 World Partitionが有効なレベルでは、従来のLevelsパネルによるサブレベル管理は使えません。 Window → Levels で永続レベルにサブレベルを足していく操作は、World Partitionのレベルでは行えません。
その代わりに使うのが Level Instance(レベルをアクターのようにレベル内へ配置する仕組み)と、次に説明する Data Layers です。 両方式を1つのレベルで混ぜることはできない ので、マップを作り始める前にどちらで行くかを決めます。
World Partitionの仕組み
World Partitionは、レベルを グリッド(格子) に区切り、 プレイヤーの周囲のセルだけを読み込みます 。

動きは単純です。
- レベル全体を、一定サイズのセルに区切る(既定は一辺 12,800uu=128メートル)
- 各アクターは、自分の位置するセルに属する
- プレイヤーを中心に
Loading Range(既定 25,600uu=256メートル)の範囲を取る - その範囲にかかるセルだけを読み込み、外れたセルは捨てる
設定は World Settings の World Partition Setup から確認できます。セルサイズを小さくすると読み込みが細かくなり、メモリは減りますが切り替えの頻度が上がります。まずは既定値のままで進めて、メモリが足りなくなってから調整するのが順当です。
動いているところを見る
グリッドと読み込み状況は、プレイ中に可視化できます。コンソールで次を実行してください。
wp.Runtime.ToggleDrawRuntimeHash2D
画面に俯瞰のグリッドが表示され、 読み込まれているセルが色つき、そうでないセルが暗く 表示されます。歩き回ると、プレイヤーを追いかけてセルが入れ替わっていくのが見えます。 World Partitionが実際に何をしているかは、この画面を1分眺めるのがいちばん早い理解です。
もう一度同じコマンドを打つと消えます。
エディタ側の読み込み
World Partitionのレベルでは、エディタも同じ考え方で動きます。レベルを開いたとき、既定では アクターが読み込まれていません 。ビューポートで作業したい範囲を World Partitionエディタ (Window → World Partition)で選び、右クリックから Load Selected Cells で読み込みます。
「レベルを開いたのに何も表示されない」というのは、故障ではなく この仕様 です。巨大なマップを開いても数秒で立ち上がるのは、これが理由です。
Actorの扱いが変わる:OFPAと常駐アクター
World Partitionを使うと、レベル内のアクターの 保存され方 も変わります。ここはGitでの共同開発と、常駐させたいものの扱いに直結します。
One File Per Actor(OFPA)
World Partitionのレベルでは、レベルに配置した各アクターのデータが 1つずつ別々のファイル に保存されます(__ExternalActors__ フォルダ)。従来は1つの巨大な .umap に全アクターが詰まっていましたが、World Partition ではアクターごとにファイルが分かれます。これはエディタ上・ソース管理向けの保存方式で、パッケージ化(Cook)のときにはレベルへまとめられます。

これが効くのは 複数人での開発 です。1つの .umap を全員で奪い合う代わりに、別々のアクターを触っている限りファイルがぶつからないので、競合が減ります。ただしアクターが大量の小さなファイルになるので、Gitで管理するなら .gitignoreとLFSの設定 を整えておくのが推奨です。
常に読み込んでおきたいもの
World Partitionは距離でアクターを出し入れします。ところが、距離に関係なく常に居てほしいもの があります。ゲーム全体を管理するマネージャ、スコアを持つアクター、BGMを鳴らすアクターなどです。これらが遠くへ行くたびにアンロードされると困ります。
こうしたアクターは、詳細パネル(World Partitionカテゴリ)の Is Spatially Loaded をオフにします。すると、そのアクターはグリッドの距離ストリーミングの対象から外れ、常に読み込まれた状態 になります。GameModeやGameStateは、そもそもレベルに配置せずプレイ開始時に生成されるので対象外ですが、自作のマネージャActorをレベルに置くとき は、これを忘れると「たまに消えるマネージャ」になって、原因の分かりにくいバグにつながります。
Data Layers:距離以外の条件で出し分ける
グリッドは 距離 で読み込みを決めます。ですが、距離では表せない出し分けもあります。昼と夜で街の様子が変わる、ストーリーの進行で瓦礫が増える、イベント中だけ特設ステージが現れる。こうしたものです。

Data Layers は、アクターを距離とは別の軸でグループ化し、まとめて読み込み状態を切り替える仕組みです。Window → World Partition → Data Layers から作成し、レベル内のアクターを割り当てます。
Data Layerには2種類あります。
| 種類 | 用途 |
|---|---|
| Editor Data Layer | エディタでの表示・非表示の整理だけ。ゲームには影響しない |
| Runtime Data Layer | 実行中に読み込み状態を切り替えられる |
ゲーム中に切り替えたいなら Runtime Data Layer を作ります。実行時の状態は3つです。
| 状態 | 意味 |
|---|---|
| Unloaded | 読み込まれていない |
| Loaded | メモリにあるが、ゲームには参加していない |
| Activated | 読み込まれ、ゲーム内で動いている |
Blueprintからは Set Data Layer Runtime State ノードで切り替えます。Loaded を経由してから Activated にすると、 読み込みを先に済ませておいて、必要な瞬間に一気に出す ことができます。イベント開始と同時にカクつくのを避けたいときに効く手です。
手動のLevel Streamingが有効な場面
World Partitionが既定になった今も、 手動のLevel Streamingは消えていません 。得意分野が違うからです。
| 場面 | 向いている方式 |
|---|---|
| 広い屋外を歩き回る | World Partition(距離で自動) |
| 建物・ダンジョンへの出入り | 手動 Level Streaming |
| ストーリー進行でエリアを差し替える | 手動 Level Streaming または Data Layers |
| ロード画面を挟んだ完全なマップ移動 | Open Level(ストリーミングではない) |
判断の軸ははっきりしています。 切り替えの条件が「距離」ならWorld Partition、「出来事」なら手動 です。ドアをくぐった、スイッチを押した、ボスを倒した。こうした瞬間に切り替えたいものは、グリッドでは表現できません。
手動方式では、常駐する 永続レベル(Persistent Level) に、出し入れする サブレベル をぶら下げます。
- サブレベルにしたいレベルを別途作成する(例:
SubLevel_Interior) - 永続レベルを開き、
Window → Levelsでレベルパネルを開く Levels → Add Existingでサブレベルを追加する- サブレベルを右クリックし、
Change Streaming Method → Blueprintを選ぶ
Blueprint にしておくと、 自分で Load Stream Level を呼ぶまで読み込まれません 。もう1つの Always Loaded は常時読み込みで、ストリーミングとしては働きません。
繰り返しになりますが、この手順は World Partitionが無効なレベルでのみ 使えます。
実践:屋外から建物内へレベルを切り替える
RPGで宿屋に入る、ホラーゲームで屋敷の玄関をくぐる、探索アクションでダンジョンの入口へ降りる。 「外から中へ入ると、中身が読み込まれる」 はどのジャンルでも出てくる形です。ここではその1本を、ドアの手前のトリガーから最後まで組みます。
