scenario-unreal-world-building について
Unreal の環境アーティスト向けに、レベル、オープンワールド、ランドスケープ、World Partition、HLOD、PCG を扱うスキルです。ルールに基づいて世界の規模を定め、スクリプトで領域ごとに生成、ストリーミング、検証します。
主な機能
- 01オープンワールドと地形寸法の計画
- 02Data Layers、HLOD、ストリーミングソースの整理
- 03アセットキットとNanite構築の確認
- 04ベイク済みPCGとランタイム草地の設定
- 05領域ごとのワールド構築と検証
活用シーン
- 01Open Worldテンプレートからレベルを作成
- 02領域ごとに森林、岩、草地を生成
- 03ハイトマップとLandscape設定を確認
- 04HLODを構築してワールドストリーミングを監査
MCP 対応
README には ue_run、ue_review、ue_audit、ue_stat などのツールが記載されていますが、MCP の利用については説明されていません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-unreal-world-buildingインストール後、Claude Code で/scenario-unreal-world-buildingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/ue_world.py詳細
Unreal のワールド構築(レベル、オープンワールド、ランドスケープ、PCG)
この分野でのエキスパートレベルとは、ルールに基づいてワールドのサイズを決め、重要度の階層に従って配置し、最初のマップからストリーミングと予算管理を行い、手作業で何千ものアクターを選択するのではなく、スクリプトで領域ごとに変更できることを意味します。環境アーティストは、何を手動のままにするか、何をベイクするか、何をランタイムに生成するかを判断し、カウント、トレース、またはスクリーンショットで各判断を証明します。ここで指定した関連スキルが利用可能なスキルにない場合は、ユーザーにインストールを依頼してください
(npx skills add scenario-labs/skills --skill <name>)。無人の場合は、ツールのスキーマに従って進め、不足している点を明示してください。
必須の背景知識: scenario-unreal-expert(チャネル、レビューループ、5.8 の落とし穴)。ツールキット:
scripts/ue_world.py
(sys.path[:0] = ["<skills>/scenario-unreal-world-building/scripts", "<skills>/scenario-unreal-expert/scripts"]; import ue_world as W)
には、ue_run、ue_review、ue_audit、ue_stat があります。Unreal ではまだ実行されていません: オフラインレイヤーは
tests/code/unreal-world-building/test_world_offline.py に合格しています。[verify] の名前は
W.probe() で解決されます。記述した計画では、各 W.* ステップの背後にあるエンジン呼び出しを指定しています(手順 P0 の表)。
方針(専門家の知見)
- 統合済みのセットアップから始めて、測定します。 File > New Level > Open World を選ぶと、World Partition、OFPA、Data Layers、HLOD、屋外ライティングが揃います。「テンプレートをそのまま使う」(Sam Deiter、 EEf07ggFWRw [00:20:40])。ランタイムグリッドは1つにします。グリッドを増やすと「パフォーマンスに悪影響を及ぼす可能性がある」(World Partition のドキュメント)。初日から WP と OFPA を使い、100,000 個のアクターを処理しました(Sam Dark、Subnautica 2、AalP65lrtpo [00:19:20])。
- 重要度に応じて配置します。 主役となるアセットや主要エリアは手作業で配置し、低木から樹木、岩にかけては事前にベイクします。実行時に GPU で生成するのは、草のようなディテールだけです(CD Projekt RED と Epic、icIFFlOyob4 [00:04:23]-[00:07:05])。コリジョンや遠距離での表示要件により、永続的な配置が必要になります (Unreal Sensei、5ju7wyvZGBI [00:54:16])。プレイヤーが多様だと認識しないものはベイクし、プロシージャル生成の結果はエディターでプレビューします(Dark [00:07:56])。まず何を手動のままにするか決めます(Matt Oztalay、 TbNZ4GKaTow [00:32:26])。
- PCG はマテリアルと同じように作成します。 パラメーターを持つテンプレートグラフを作り、用途ごとに Graph Instance を使用します (Oztalay [00:12:18])。Is Partitioned は「ほぼ必須」です [00:22:34]。出力は PCG アクターの Data Layer と HLOD Layer を継承するため、生成前に割り当てます(PCG のドキュメント)。グリッドは、パラメーター用に無制限、ランドスケープ読み込み用に 128 m、散布用に 32 m とします。CPU から GPU への転送には毎回コストがかかり、レイヤーウェイトは GPU 上にありません(icIFFlOyob4 [00:08:04] [00:23:16] [00:24:12])。ポップインは生成の遅延であり、Test ビルドで評価します [00:27:10] [00:27:44]。不正なデータは明確に警告させます。Data Missing Attribute では Warn を有効にします(Oztalay、00:10:47 のフレーム)。
- ランドスケープは選ぶのではなく、サイズを決めます。 有効なサイズは 2017、4033 で、2048 は不可です。コンポーネントは最大 1024 個、セクションは 2x2、編集レイヤーを使用します(Landscape のドキュメント)。Z スケールとアクターの Z 座標は、宣言した起伏ではなく、エクスポートした高さから決めます(Z = span / 512、アクターは中点に配置)。GREEN テストでは、書類上は 250 m だったものが 314 m に達し、123,356 ピクセルがクリップされました [added]。scenario-unreal-materials で作成したマテリアルの仕様は、ここで確認します。Opacity Mask が接続された Opaque、ベースに LB Alpha Blend を1つ、名前ごとに Layer Info を1つ使います(Landscape のドキュメント)。急斜面のレイヤーだけにトライプレーナーを使い、大きなレイヤーにはアンチタイリングを適用し、スペキュラーは低く抑えます(Sensei [00:11:12]-[00:15:36])。
- Nanite はデフォルトで使いますが、メッシュの構成も重要です。 「可能な限り有効にします」(Nanite のドキュメント)。ただし、穴の多いキットバッシュ、ハードエッジでの分割、継ぎ目、ノイズの多い頂点カラーは簡略化を妨げます。同じ見た目でも、250 MB が 12 MB になります(Epic、6igUsOp8FdA [00:02:46]-[00:08:04])。Nanite には距離カリングが適用されません(Nanite のドキュメント)。テッセレーションにはコリジョンがありません。レイヤーごとに設定し、地面では中心を 0.5、垂直な岩では 1 にします。ダイシングレートは 2 です [00:22:58] [00:29:53]。フォリッジは不透明にし、モデルとして作成します(Quixel、aZr-mWAzoTg [00:01:46])。
- ストリーミングの構造はコンテンツに合わせます。 ファミリーごとに HLOD レイヤーを1つ使います。フォリッジには Instancing、建物には Merged Mesh、マージしても負荷が大きい場合は Simplified を使います(ドキュメント、Deiter [00:41:13])。ゲームプレイに応じてコンテンツが変わる場合は Level Instance、静的なセットには Packed Level Actor を使います [00:30:59]。Runtime Data Layers はゲームプレイの状態に限って使います(ドキュメント)。テレポート先には Streaming Source が必要で、ランタイム PCG を使う場合は生成ソースも必要です(ドキュメント、icIFFlOyob4 [00:36:44])。
- ワールド規模の作業は、スクリプト化し、地域ごとに行い、検証します。 Outliner で選択してドラッグするのではなく、スクリプトを使います。マップ全体を処理するジョブは、リージョンごとにビルダーの commandlet で実行します(Dark [00:20:23] [00:20:55])。ビルダーで生成した後に HLOD を生成します。生成されたアクターは changelist に含めません(Oztalay [00:26:23] [00:29:07])。ドキュメントが要求するだけのルールも、バリデーターにします(Dark [00:23:04])。
- キットは確定事項です。 フットプリントは最大範囲とし、ピボットを固定し、ドア幅を標準化します。基本パーツを先に作り、主役となるパーツは最後に作ります(Burgess and Purkeypile、QBAM27YbKZg [00:06:14] [00:07:51] [00:22:34])。村の小道は最も近い既存の道につなげます(Oztalay [00:20:01])。フェンスにはスプラインの文法を適用します [00:18:51]。
最初に決める項目
| 入力 | 変更内容 | 未指定の場合のデフォルト |
|---|---|---|
| プラットフォーム、フレーム予算 | Nanite、フォリッジの経路、レイヤー、PCG の処理時間、草の密度 | PC とコンソール、Nanite 有効、60 fps(scenario-unreal-performance) |
| サイズ、クワッドサイズ、高さのソース | レイアウト、Z スケール、アクターの Z | W.plan_landscape、1 m クワッド、高さに合わせて Z を調整 |
| 最速の移動手段、テレポート | 読み込み範囲、ストリーミングと生成のソース | ゲームプレイについて確認し、不明として記録 |
| 地形の特徴、Experimental の許容度 | Landscape と Mesh Terrain の選択、Nanite Foliage、PVE、FastGeo | Landscape を使用し、リリース時に Experimental 機能は使用しない |
| 手動かプロシージャルか、ソース管理 | グラフの範囲、生成された PCG を誰がコミットするか | 手動:村のレイアウト、川、道路、主要エリア。生成はビルダーが担当 |
ワークフロー
各段階は ue_run ジョブまたはライブ呼び出しで、プロシージャ内のコード(P番号)を使用します。
- ワールド仕様として概要をまとめる(P1)。
W.U1_EXAMPLE_SPECのように記述します。インストールごとにW.probe()を1回実行します。ゲート:W.check_world_spec(spec)["ok"]を満たし、情報に関する指摘に回答済みであること。 - マップ(P2)。テンプレートから
W.new_open_world_map(path)を作成します。古いレベルには、まずW.convert_args(..., report_only=True)を使用します。ゲート:W.wp_facts_check(W.world_facts())に問題がないこと。wp.Runtime.ToggleDrawRuntimeHash2Dを使ったPIEスクリーンショットを撮影します。 - 地形(P3、P4)。DCCのハイトマップまたはブロックアウト用の
W.valley_heightmapを使用します。W.export_heightmapでZとアクターのZを実際の範囲に合わせます。MCPツールが行わない限り[要確認]、作成はLandscapeモードで1ステップで行います(Location Z =actor_z_cm、Scale Z =z_scale)。編集レイヤーはBase、Sculpt Details、Paint、Splines、Patchesです。重いペイントを始める前に、川(Water Body RiverまたはSplinesレイヤーのスプライン)を配置します。その後、ランドスケープビルダーを実行します。ゲート:インポート前にW.heightmap_clip_gateが空(クリップされたピクセルが0)であること。W.landscape_facts()が計画、スケール、位置と一致していること。W.landscape_material_checkに問題がないこと。Layer Debug、崖のクローズアップ、日なたの草、マネキンを2、10、100 mの位置で確認します。 - 整理(P5、P6)。ファミリーごとにエディターのData Layerを使用します。
W.hlod_planからHLODレイヤーを作成し、テレポート先にStreaming Sourceコンポーネントを配置します。ゲート:W.data_layer_checkとW.hlod_actor_checkに問題がないこと。 - 村とキット(P7)。
W.kit_piece_checkとW.door_width_checkを実行します。家屋にはLevel InstancesまたはPacked Level Actorsを使用し、散乱物はタグ付きアセンブリ(W.tag_actors)にします。W.village_pathsでパスをランドスケープのスプラインにします。フェンスには文法文字列を使用します。インスタンスを分割する前にマップのバージョンを作成します。ゲート:キットのエラーがなく、パスにZファイティングや明らかな繰り返しがないこと。 - Nanite(P8)。DCCのエクスポートに対して
W.nanite_construction_check(W.obj_construction_stats(obj))を実行します。W.batch_nanite(paths, dry_run=True)を実行し、内容を確認してから本実行します。レイヤーごとの中心位置でW.tessellation_checkを実行します。ゲート:半透明のNaniteメッシュがないこと。Overdrawで樹冠を確認すること。変位した地面に足が接地していること。 - ベイク済みPCG:森林と岩(P9)。テンプレートグラフ(データがない場合の警告を含むレイヤーフィルター、傾斜に応じた密度、パス用のExtents ModifierからDifferenceへの接続、川岸でのDistanceによる間引き、樹木との差分による下層植生、Self Pruning、種テーブル、幹のみのコリジョン)を使用し、
W.pcg_graph_lintでチェックします。W.spawn_pcg_volume(..., hlod_layer=, data_layer=)を使用します。まず1つのボリュームをデバッグします(D)。ゲート:W.pcg_component_checkに問題がないこと。数がW.expected_pointsと一致すること。俯瞰とゲームプレイ時の高さから撮影し、パスや手作業で整えたエリアには何も配置されていないこと。 - ランタイム草(P10)。
W.grass_rings()を使用します(32 mセルで128 mまで密に配置し、128 mセルで256 mまで疎に配置し、遠端は再着色します)。メッシュのない草タイプからGenerate Grass Mapsを通じてマスクを生成します。各アセット配列にプレースホルダーを1つ配置し、エディタービューポートを生成ソースにします。ランドスケープキャッシュを使用し、pcg.FrameTimeを設定します。ゲート:W.runtime_grass_checkとW.find_gpu_transfersに問題がないこと。 Testビルドでレイテンシを測定し、W.generation_lead_checkを実行します。 - ビルド(P11)。
for name, args in W.build_pipeline(map, graphs): ue_run.run_commandlet(uproject, name, args):ランドスケープ、PCG、HLOD。ゲート:各コマンドの終了コードが0であること。レイヤーごとにHLODアクター数をカウントすること。W.changelist_checkの後、エディターからサブミットします。 - レビューと引き継ぎ(P12~P14)。
W.REVIEW_CONSOLEを使ったW.tour(...)をパスし、すべてのショットに対してue_review.image_checksを実行してから目視確認します。W.world_rules_check(W.world_census(), vocab)、W.budget_sheet、W.lighting_handoffを実行します。ゲート:批評ルーブリックに合格すること。キャプチャなしで完了と報告された項目がないこと。
数値
| 値 | 設定 | 相対値/出典 |
|---|---|---|
| 2 km のランドスケープ | 2017 x 2017、63 クワッド、2x2、最大 1024 コンポーネントのうち 256 | 1 m クワッド(Landscape ドキュメント) |
| Z スケール | スパン cm / 512 x 1.02、アクターの Z はスパンの中間点 | 16 ビットの高さ(ドキュメント)、余裕 [追加] |
| テンプレートグリッド | セル 25,600 cm、範囲 76,800 cm | プロファイルを最初に(Deiter [00:15:32]) |
| PCG パーティショングリッド | 25,600 cm | PCG World Actor(Oztalay frame 00:23:16) |
| 階層グリッド | 無制限、128 m、32 m | ランタイムグラス(icIFFlOyob4 [00:08:39]) |
| グラスのリング | 128 m まで密、256 m まで疎 | icIFFlOyob4 [00:15:30] |
| 32 m セルあたりのインスタンス数 | 1 万~2 万が適切 | ベース PS5、5.6 デモ [00:30:26] |
pcg.FrameTime | デフォルト 5 ms、デモでは 2 ms | 5.6 の注記、ベース PS5 [00:26:24] |
| 高さのアップロード | 32 m セルあたりゲームスレッドで約 0.5 ms | ベース PS5 [00:24:12] |
| ストリーミングされたインスタンス | ハードリミット 1600 万 | Nanite ドキュメント |
| Nanite の構築 | 250 MB 対 12 MB、見た目は同じ | 6igUsOp8FdA [00:02:46] |
| Nanite アセンブリ | アセットサイズの 5~10%、風に揺れるボーン 200~1,000 本 | aZr-mWAzoTg [00:07:13] [00:09:51] |
| ダイシング率 | 2。2 未満、および約 5 または 6 を超えると遅くなる | 6igUsOp8FdA [00:29:53] |
| ディスプレイスメントの中心 | 地面では 0.5、垂直な岩では 1、レイヤーごと | コリジョンサーフェス [00:22:58] |
| 地形のスペキュラー | 0.02(Sensei)、キャビティ駆動の上限として 0.5(Cloward) | 5ju7wyvZGBI [00:11:12]、0L5Azq6ugyo [00:01:19] |
| ティックの集約 | 配置済みインスタンスが 10~15 個を超える場合 | Dark [00:23:04] |
| モバイル向けランドスケープ | 3 レイヤー、16 サンプラー | ES3.1(ドキュメント) |
品質ゲート
- 測定可能: ワークフローのチェック(すべての
W.*_check、heightmap_clip_gate、pcg_graph_lint、find_gpu_transfers)、インポート時のue_audit、ビルダーの終了コードが 0 であること、視点ごとのstat unitとstat gpu、Test ビルドの Insights に表示される PCG 時間、-trace=WorldStreaming、wp.Runtime.HLOD 0/1の A/B テスト。 - 視覚: 失敗したセルのないランタイムハッシュオーバーレイ、黒い斑点のない Layer Debug、マネキンとの
タイリング、引き伸ばしのない崖、日光の下で草にプラスチックのような光沢がないこと、ディスプレイスされた
地面に足が接地していること、樹冠のオーバードロー、Hierarchical LOD Coloration と HLOD のシルエット、
フレーム単位の動画で確認するリングの切り替わりとポップイン、道に何もなく、土手の植生がまばらであること、
岩が地面に接地していること。評価基準:
references/critique.md。
よくある間違い
| 間違い | 発生する現象 | 修正方法 |
|---|---|---|
| 宣言した起伏に基づく Z スケール | インポート後に台地や窪みができる | フィットした形式でエクスポート、W.heightmap_clip_gate |
| 2048 のハイトマップ | インポートが拒否される、またはリサンプリングされる | 2017 または 4033 |
| すべてのレイヤーが高さブレンドで、Layer Info のないレイヤーがある | 黒い斑点ができる、レイヤーがまったく描画されない | ベースレイヤーを Alpha Blend にする。同じ名前の Layer Info を設定 |
| 2 つ目のランタイムグリッド | ストリーミングコストが増えるが、効果はない | グリッドは 1 つにし、距離に応じて HLOD を使用する |
| 整理のために Runtime Data Layers を使い、Level Blueprint から参照する | ひっかかりが発生する。アクターが常にロードされる | Editor Data Layers と Blueprint クラスを使用する |
| HLOD も Data Layer もない PCG ボリューム | 距離が離れるとベイク済みの森が表示されない | 生成前に両方を割り当てる |
| ランタイムグラフがエディターで見えない | アーティストに何も表示されない | Treat Editor Viewport as Generation Source に設定する |
| GPU グラフ内のレイヤーウェイト | 草のマスクが空になる | メッシュのない草タイプを使い、Generate Grass Maps を実行する |
| アーティスト用アセット配列が空 | 草のストリーミングが崩れる | 各配列にプレースホルダーを 1 つ設定する |
| Nanite にカリング距離や描画距離を設定する | 間引かれず、リング間で表示が切り替わらない | HLOD とリングごとの生成半径を使用する |
| GPU 専用の木 | Lumen に木が表示されない | 小さなものに限り GPU 専用にする |
| 草の半径をひたすら大きくする | インスタンスが爆発的に増え、端が見えてしまう | リングを 2 つにし、端の色を変える |
| 隙間の多いキットバッシュの岩 | アセットが巨大になり、距離が離れると穴が見える | 土台をつなげ、タイリングテクスチャを使う |
| Construction Script による散布 | 170,000 個のボディ、マップを開くのに 7 分(Oztalay [00:30:49]) | PCG 出力を使い、クラッターのコリジョンを無効にする |
| 生成した PCG アクターをリポジトリにコミットする | 競合や古いデータが発生する | 生成はビルダーが担当する |
| 大きなマップで全選択して編集する | エディターが停止する | W.region_batch またはビルダーを使う |
引き継ぎ
- scenario-unreal-pipeline-automation から受け取るもの:
ue_auditから渡されるメッシュ、標準キットの パーツ、ハイトレンジ付きの DCC ハイトマップ。構築に失敗した場合は差し戻します(scenario-maya-expert、scenario-blender-expert にも共有します)。 - scenario-unreal-materials から受け取るもの: Landscape インスタンスとレイヤーリスト(ブレンドタイプ、 急斜面レイヤー、アンチタイリング)、境界付きの RVT、グラスタイプ名、岩用の RVT ブレンド、オペークなフォリッジ。 スペキュラーは先方の担当です。ワールドアーティストは太陽光のキャプチャで確認した光沢を報告します。
- scenario-unreal-lighting-rendering へ引き渡すもの: マップ、World Bookmarks または
tour_viewpoints、W.lighting_handoff(テンプレートライト、Lumen シーン外の GPU 専用ロール、HLOD の遠景および 距離フィールドのフラグ、Data Layer の状態)。 - scenario-unreal-performance へ引き渡すもの:
W.budget_sheetとツアーパス。 - その他: scenario-unreal-gameplay(ストリーミングおよび生成ソース、Asset User Data、ティック
の集約);scenario-unreal-pipeline-automation(バリデーター用のワールドルール);
scenario-unreal-cinematics(
pcg.FrameTimeの一時停止、icIFFlOyob4 [00:28:51]);scenario-unreal-vfx (水のシェーディング)。
UE 5.8 に関する注意事項
- 新しい WP マップではパーティション付きランタイムハッシュ(5.4)を使用します。グリッド
プロパティを書き込む前に
world_facts()を読み取ってください [verify]。 - PCG はデフォルトで有効です。PCG Python Data Processor、PCG Builder Volume を使用します。Landscape Cache は 5.6 以降、オプトインです (有効にしないとランタイムの CPU 読み取りに失敗します)。
- Edit Layer は必須です(5.7)。
landscape.ForceLayersFullUpdateがForceLayersUpdateに置き換わります。WorldPartitionLandscapeBuilder(5.7)。水のブラシはグローバルマージを強制します。 - HLOD:Build HLOD for Selection または Region、
bForceRayTracingFarField、カスタム HLOD アクター(5.7)。 保存済みドキュメントには Approximate Mesh がありません [verify]。 - 実験的機能:Mesh Terrain、Nanite Foliage、PVE、FastGeo、World Streaming Insights。Mac:M2 以降では Nanite
と VSM Beta が有効です。クックプラットフォームは
Macです。
参考資料
references/expert-notes.md:タイムスタンプ付きの専門家による判断。references/procedures.md:P0 から P14 までの手順、全コード、ツールキットの背後で実行される エンジン呼び出し、テスト、ステータス。references/critique.md:各ゲートの評価基準。references/gui-paths.md:各手順のエディターメニュー。references/sources.md:ソース、認証情報、URL、タイムスタンプ、改訂履歴。