タイトル: 古いHLODアクタを検出、HLODをリビルドする必要があります
SEOタイトル: UE5「古い HLOD アクタを検出」の対処法完全ガイド
| この記事の要点 |
|
警告の概要
Unreal Engine 5 の World Partition 機能を使ったレベルを開いたとき、出力ログやマップチェックに次のような警告が表示されます:
LogWorldPartition: Warning: Found 23 stale HLOD actors. HLODs need to be rebuilt.
LogWorldPartition: Please run "Build > Build HLODs" or use the WorldPartitionBuilderCommandlet.
MapCheck: 古い HLOD アクタを検出しました。HLOD をリビルドする必要があります。
HLOD とは
Hierarchical Level of Detail (HLOD) は、遠距離のオブジェクト群を 1 つの結合メッシュにまとめて描画コール・三角形数を削減する仕組みです。World Partition と組み合わせて広大なオープンワールドを実現します。
| 距離 | 表示 | 負荷 |
|---|---|---|
| 近距離 (0-100m) | 個別 Actor / Nanite Mesh | 高品質・高負荷 |
| 中距離 (100-500m) | HLOD Level 0(結合メッシュ) | 中品質・中負荷 |
| 遠距離 (500m-) | HLOD Level 1+ / Imposter | 低品質・低負荷 |
原因
- HLOD 生成後に新しい Actor を追加した
- 既存 Actor の Transform / Mesh を変更した
- Actor を削除した
- HLOD Layer 設定を変えた
- Git 等で別環境から HLOD 未生成のデータを取得した
対処1: Editor から Build HLODs
- レベルを開く(World Partition のレベル)
- メニューから Build → Build HLODs
- ダイアログで Build 範囲を選択(Whole Map / Selected Cells)
- 完了するまで待つ(数分〜数十分、規模次第)
- レベルを保存(Ctrl+S)
対処2: コマンドラインで Build
大規模マップは Editor がフリーズしがちなので、コマンドライン Commandlet が推奨:
# Windows
"C:\Program Files\Epic Games\UE_5.3\Engine\Binaries\Win64\UnrealEditor-Cmd.exe" ^
"C:\Path\To\MyProject\MyProject.uproject" ^
-run=WorldPartitionBuilderCommandlet ^
/Game/Maps/MyOpenWorld ^
-Builder=WorldPartitionHLODsBuilder ^
-AllowCommandletRendering ^
-unattended
# Linux / Mac
./UnrealEditor-Cmd \
/path/to/MyProject.uproject \
-run=WorldPartitionBuilderCommandlet \
/Game/Maps/MyOpenWorld \
-Builder=WorldPartitionHLODsBuilder \
-AllowCommandletRendering
HLOD Layer の設定
各 Actor は HLOD Layer プロパティを持ち、どのレイヤーに属するかで生成方法が決まります:
HLOD Layers(典型例):
HLODLayer_Mesh ← 通常メッシュ (StaticMesh を結合)
→ Source: StaticMesh
→ Algorithm: Mesh Merge
→ Loading Range: 25600 (256m)
HLODLayer_Instancing ← 大量配置 (Foliage / Grass)
→ Source: ISM (Instanced Static Mesh)
→ Algorithm: Instancing
→ Loading Range: 51200 (512m)
HLODLayer_Imposter ← 遠景ビルボード
→ Source: StaticMesh
→ Algorithm: Imposter
→ Loading Range: 102400 (1024m)
Content Browser で右クリック → Miscellaneous → HLOD Layer で作成します。
Streaming Source(プレイヤー周辺をロード)
World Partition はStreaming Source の周囲だけをロードします。HLOD 生成前にこの設定が必要:
// プレイヤーキャラクターに WorldPartitionStreamingSourceComponent を追加
APlayerCharacter::APlayerCharacter()
{
StreamingSource = CreateDefaultSubobject(
TEXT("StreamingSource"));
StreamingSource->TargetGrid = TEXT("MainGrid");
StreamingSource->Priority = EStreamingSourcePriority::High;
}
Nanite と HLOD
Unreal Engine 5 の Nanite は数千万ポリゴンを描画できる仕組みですが、HLOD は依然として必要です:
- Nanite はメッシュごとの描画コールは減らさない → 大量 Actor がある場合 HLOD で結合
- Foliage / Instanced Static Mesh は Nanite 対応しても HLOD でまとめるとカリングが効率化
- 動的ライティングは HLOD 化されたメッシュには適用されない → Lightmass / Lumen 設定要確認
Memory Budget の設定
Project Settings → World Partition
Streaming Performance:
Editor Streaming Disabled: false
Server Streaming Out Enabled: true
Memory Budget MB: 4096 ← 一度にロードするセルの合計上限
Runtime Hash:
Grid Cell Size: 25600 (256m × 256m)
Loading Range: 51200 (512m)
確認方法
- Window → World Partition → Map Check で HLOD 警告を確認
- Show → Visualize → HLOD Outline で生成済領域を可視化
stat WorldPartitionで実行時のロード状況確認wp.Runtime.ToggleDrawRuntimeHash3Dで 3D 表示
FAQ
Q: Build HLODs に何時間もかかる
A: 大規模マップは仕方ない。コマンドライン Commandlet で夜間バッチとして実行することを推奨。
Q: ビルド後も警告が消えない
A: 別のレベルが古い HLOD を持っている可能性。すべての World Partition レベルでビルド実行が必要。
Q: Git でチームと HLOD データを共有すべきか
A: HLOD は巨大なファイルになるので Git LFS が必須。または CI で毎回再生成する運用も多い。