1.

UE5のData Layer(データレイヤー)とは|種類と表示・ロード切替の使い方

編集

Data Layer(データレイヤー)は、Unreal Engine 5(UE5)の World Partition において、ワールド内のアクターを論理的な「レイヤー」にまとめ、その表示やロード/アンロードをまとめて切り替えられる仕組みです。たとえば「昼用のオブジェクト」「夜用のオブジェクト」「破壊後の状態」といった単位でアクターをグループ化しておき、エディタ作業中の表示整理や、ゲーム実行中の動的な切り替えに利用できます。

この記事の要点
  • Data Layer は、アクターを論理的なレイヤーにまとめ、表示/ロードをまとめて切り替えるための World Partition の機能。
  • 種類は大きく Editor Data Layer(エディタ用)Runtime Data Layer(ランタイム用) の 2 つに分かれる。
  • UE5 の比較的新しいバージョンでは、レイヤーの定義は Data Layer Asset、ワールドへの配置は Data Layer Instance という 2 段構成で管理される。
  • ランタイムでの切り替えは Blueprint や C++ から「Set Data Layer Runtime State」系の処理で行い、状態は Unloaded(未ロード)/Loaded(ロード済み・非表示)/Activated(有効・表示) の 3 つ。
  • 用途は昼夜や破壊前後の切り替え、進行度に応じたエリアの出し分けなど。Editor 用とランタイム挙動の混同が代表的な落とし穴。

Data Layer とは

UE5 の World Partition は、広大なオープンワールドを「セル」と呼ばれる単位に分割し、プレイヤーの位置に応じて必要な範囲だけを自動でストリーミング(ロード/アンロード)するシステムです。これにより、巨大なマップでもメモリ消費を抑えながら扱えるようになります。

ただし World Partition の基本的なストリーミングは、あくまで「空間的な位置」に基づいてセルを読み込む仕組みです。これに対して Data Layer は、位置とは別の「論理的なグループ」という軸でアクターを束ねます。アクターに対して「このアクターは昼レイヤー」「このアクターは夜レイヤー」といったラベルを付けておき、レイヤー単位でまとめて表示やロードを制御できるようにするのが Data Layer の役割です。

言い換えると、World Partition が「どのエリアを読み込むか」を扱うのに対し、Data Layer は「どのグループのアクターを読み込む/見せるか」を扱う機能だと整理できます。両者は併用でき、World Partition が有効なレベルで Data Layer を作成・利用するのが基本的な使い方です。

Data Layer の種類(Editor / Runtime)

Data Layer は、その用途に応じて Editor Data LayerRuntime Data Layer の 2 種類に分類されます。どちらに分類するかは、レイヤー定義(Data Layer Asset)の「Type」プロパティで指定します。両者の主な違いは次のとおりです。

観点Editor Data LayerRuntime Data Layer
主な目的エディタ作業中のアクター整理・表示管理ゲーム実行中の動的なロード/表示切り替え
操作するタイミング主にエディタ上(ビルド・編集時)主に実行時(ゲームプレイ中)
制御手段Data Layers アウトライナでの表示・ロード切り替えBlueprint / C++ による状態変更(実行時にも操作可)
ランタイムでの状態変更原則として実行時の切り替え対象ではないUnloaded / Loaded / Activated を実行時に変更可能
典型的な用途大量アクターの可視性管理、編集時の負荷軽減昼夜・破壊前後の切り替え、進行に応じた出し分け

大まかには、Editor Data Layer は「開発中の見やすさ・編集効率のため」Runtime Data Layer は「ゲーム中に動かすため」のものと考えると区別しやすくなります。実行時に Blueprint や C++ から切り替えたいレイヤーは、Type を Runtime に設定しておく必要があります。

Data Layer Asset と Data Layer Instance

UE5 の比較的新しいバージョンでは、Data Layer は内部的に 2 つの要素で構成されています。役割が分かれているため、最初に押さえておくと混乱しにくくなります。

  • Data Layer Asset:レイヤーの「定義」にあたるアセット。Type(Editor / Runtime)などの設定を持ち、コンテンツブラウザ上に存在します。プロジェクト単位の存在で、特定のワールドに紐づきません。
  • Data Layer Instance:その Asset を特定のワールド(レベル)に配置した「実体」。ワールドごとの情報を持ち、Data Layers アウトライナ上で管理されます。

この構成により、同じレイヤー定義を複数のワールドで使い回しつつ、配置やランタイム状態はワールドごとに管理する、といった運用が可能になります。なお、バージョンによって用語やワークフローの細部は変化しているため、正確な手順は使用しているエンジンバージョンの公式ドキュメントで確認することを推奨します。

Data Layer の作り方とアクターの割り当て

Data Layer を利用する基本的な流れは次のとおりです。バージョンによりメニュー名や位置が異なる場合があるため、項目名は目安として参照してください。

1. World Partition が有効なレベルを用意する

World Partition を前提とした機能のため、World Partition が有効なレベルで作業します。新規の Open World 系テンプレートから作成したレベルは、World Partition が有効になっていることが多いです。

2. Data Layers のパネル(アウトライナ)を開く

メニューから Data Layers のパネルを開きます(「Window」メニュー配下などにあります)。ここでレベル内の Data Layer の一覧を確認・管理します。

3. Data Layer を作成する

Data Layers パネル上で新規レイヤーを作成します。新しいバージョンでは、レイヤー定義となる Data Layer Asset を作成し、それをワールドに追加して Data Layer Instance として扱う流れになります。作成したレイヤーの詳細で Type(Editor / Runtime) を設定します。

4. アクターをレイヤーに割り当てる

レベル内のアクターを選択し、対象の Data Layer に割り当てます。アウトライナ上での操作や、選択アクターの詳細パネルからの割り当てなど、複数の方法が用意されています。1 つのアクターを複数のレイヤーに所属させることもできます。

ランタイムでの有効/無効切り替え(Set Data Layer Runtime State)

Runtime Data Layer は、ゲーム実行中に Blueprint や C++ から状態を切り替えられます。中心となるのが「Set Data Layer Runtime State」系のノード/関数です。

指定できる状態は次の 3 つです。Loaded と Activated の違い(メモリ上にあるが非表示か、表示・有効化されているか)が、挙動を理解するうえで重要なポイントになります。

状態概要アクターの扱い(一般的な傾向)
Unloaded未ロードメモリにロードされず、ワールドにも存在しない状態。
Loadedロード済み・非表示メモリにはロードされるが、表示や実行はされない傾向の状態。
Activated有効・表示ロードされたうえで表示・有効化され、ワールドで機能する状態。

Blueprint では、レイヤー定義(Data Layer Asset)を指定して状態を変える「Set Data Layer Runtime State」と、ワールド上の実体(Data Layer Instance)を指定する「Set Data Layer Instance Runtime State」が利用できます。前者は指定した Asset を参照する Instance を探し、その状態を変更します。多くのバージョンでは、子レイヤーにも同じ状態を適用するかどうかを指定するオプション(recursive 相当)が用意されています。

下記は Blueprint での切り替えイメージを擬似的に表したものです(実際のノード接続はエディタ上で行います)。

// Blueprint(擬似表記)

Set Data Layer Runtime State

  Data Layer : DL_Night(Runtime タイプの Data Layer Asset)

  State : Activated

  Recursive : true

C++ から制御する場合は、新しいバージョンでは UDataLayerManagerSetDataLayerRuntimeState などを利用します(以前のバージョンでは UDataLayerSubsystem が用いられていました)。利用しているエンジンバージョンに合わせて、対応する API を公式ドキュメントで確認してください。

なお、ネットワークプレイを行う場合は状態変更を行う側に注意が必要です。一般的に、通常のランタイム Data Layer の状態変更はサーバー側で行い、クライアントへ複製(レプリケーション)される形になります。クライアント専用・サーバー専用といった設定のレイヤーでは、変更を行うべき側がそれぞれ異なります。

主な用途

Data Layer は、レイヤー単位での表示・ロード切り替えという特性を活かして、次のような場面で活用できます。

  • 昼夜・天候などの状態切り替え:昼用と夜用のアクターをそれぞれ別レイヤーにまとめ、時間帯に応じて Activated を切り替える。
  • 破壊前後の状態切り替え:建物の「破壊前」と「破壊後」をレイヤーで分け、イベント発生時に表示するレイヤーを入れ替える。
  • 進行度に応じたエリアの出し分け:クエストやストーリーの進行に合わせて、特定エリアのアクター群をまとめてロード/アンロードする。
  • 表現バリエーションの管理:同じ場所に対する複数バージョン(演出違いなど)をレイヤーで切り替え、状況に応じて使い分ける。
  • パフォーマンス調整の補助:必要なときだけ特定グループを Activated にし、不要時は Unloaded にしてメモリ・処理負荷を抑える。

これらはいずれも、Runtime Data Layer を使って実行時に状態を切り替えることで実現できます。一方、編集中のアクター整理(見やすさのためのオン・オフ)には Editor Data Layer が向いています。

World Partition との関係

Data Layer は World Partition の一部として提供される機能であり、両者は次のように補完し合います。

  • World Partition の基本ストリーミング:プレイヤーの位置に基づき、空間的に近いセルを自動でロード/アンロードする。
  • Data Layer:位置とは別の論理的なグループ軸で、レイヤー単位の表示・ロードを制御する。

つまり、World Partition が「どの範囲を読み込むか」を担い、Data Layer が「どのグループを出すか/見せるか」を担うイメージです。両者は同時に作用するため、あるアクターがワールドに存在し機能するには、World Partition のストリーミング対象であり、かつ所属する Runtime Data Layer が適切な状態(Activated など)になっている必要がある、という点を意識すると挙動を把握しやすくなります。

落とし穴・注意点

つまずきやすいポイント
  • Editor 用と Runtime 用の混同:Type が Editor のレイヤーは、原則として実行時の切り替え対象になりません。Blueprint や C++ から動的に制御したい場合は、必ず Runtime タイプに設定する必要があります。
  • Loaded と Activated の取り違え:Loaded はメモリにある一方で表示・実行されない傾向の状態、Activated は表示・有効化された状態です。「見えない」原因が、Unloaded ではなく Loaded 止まりであることもあります。
  • World Partition のアンロードとの関係:Data Layer を Activated にしても、World Partition 側でそのセルがストリーミング範囲外であれば、アクターが読み込まれないことがあります。レイヤー状態とセルのストリーミング状態は別軸である点に注意します。
  • アクター間の参照:アンロードされうるレイヤーのアクターを他から直接参照していると、アンロード時に参照が無効になり、想定外の挙動やエラーにつながることがあります。状態が変化しうる前提で参照の持ち方を設計します。
  • ネットワーク時の操作側:マルチプレイでは、状態変更を行うべき側(サーバー/クライアント)を誤ると、意図どおりに反映されないことがあります。
  • バージョン差異:Asset / Instance の扱いや UI、API(UDataLayerManager と旧 UDataLayerSubsystem など)はバージョンで異なります。手順や関数名は使用バージョンの公式ドキュメントで確認するのが確実です。

よくある質問(FAQ)

Q1. Editor Data Layer と Runtime Data Layer は、後から切り替えられますか?

レイヤー定義(Data Layer Asset)の Type プロパティで指定するため、設定自体は変更できます。ただし、Editor タイプのままでは Blueprint や C++ からの実行時制御の対象になりにくいため、ランタイムで動かしたいレイヤーは Runtime タイプにしておく必要があります。運用中の変更は他のロジックへの影響もあり得るため、目的に応じて慎重に設定してください。

Q2. Loaded と Activated は具体的に何が違うのですか?

一般的に、Loaded は「アクターがメモリにロードされているが、表示・実行はされない」傾向の状態、Activated は「ロードに加えて表示・有効化され、ワールドで機能する」状態です。先にバックグラウンドで Loaded にしておき、必要なタイミングで Activated に切り替えることで、表示時のヒッチ(読み込みによる引っかかり)を抑える、といった使い分けが考えられます。

Q3. Data Layer を Activated にしたのにアクターが出てきません。

主な原因として、(1)レイヤーが Runtime ではなく Editor タイプになっている、(2)状態が Activated ではなく Loaded 止まり、(3)World Partition 側でそのセルがストリーミング範囲外でロードされていない、などが考えられます。レイヤーの Type と状態、そして World Partition のストリーミング状況の両方を確認すると切り分けやすくなります。

まとめ

Data Layer は、World Partition のワールドにおいてアクターを論理的なレイヤーにまとめ、表示やロードをまとめて切り替えられる機能です。エディタ作業の整理に使う Editor Data Layer と、実行時に動的制御できる Runtime Data Layer に分かれ、ランタイムでは Unloaded/Loaded/Activated の状態を Set Data Layer Runtime State 系の処理で切り替えます。World Partition の位置ベースのストリーミングと、Data Layer の論理グループによる制御は別軸であることを理解しておくと、昼夜や破壊前後の切り替え、進行に応じた出し分けなどを安定して実装しやすくなります。細部の仕様はバージョンによって異なるため、最終的な手順や API は使用しているエンジンバージョンの公式ドキュメントで確認することをおすすめします。

編集
Post Share
子ページ

子ページはありません

同階層のページ

同階層のページはありません

最近更新/作成されたページ