「Nanite フォリッジ」と「World Partition HLOD」の運用方針について

お世話になっております。

現在、私たちのプロジェクトでは「Nanite フォリッジ」と「World Partition HLOD」の運用方針について検討しております。

Unreal Engine 5.7 のドキュメントを確認したところ、

Nanite フォリッジと HLOD の関係性について明確な記載を見つけることができませんでしたため、お問い合わせいたします。

Nanite フォリッジに関するドキュメントでは、Nanite ボクセル等の技術により大規模な森林表現を実現できる旨が説明されていますが、

この運用においては Nanite フォリッジを World Partition HLOD の対象として扱うことも想定されておりますでしょうか。

あるいは、Nanite フォリッジを利用する場合、樹木アセットについては World Partition HLOD に含めずに運用することを推奨されておりますでしょうか。

貴社における推奨運用やご見解をご教示いただけますと幸いです。

お忙しいところ恐縮ですが、ご確認のほどよろしくお願いいたします

[Attachment Removed]

はい。対応しております。

NaniteFoliageは一般的にInstancedSkinnedMeshComponentとして配置されます。

このプリミティブはInstancedタイプのHLODではデフォルトで収集されてHLODにInstancingとして含まれます。

MergeやSimplified設定などの他のHLOD設定の場合コンポーネント毎のHLODBatchingPolicyがInstancingの場合のみ収集されます。これによって比較的小さなNaniteFoliageを手動で除外するなどの設定を適用することが可能です。

[Attachment Removed]

InstancedSkinnedMeshComponentをブループリント内で配置した時にMobilityのパラメータを編集できないのは、このコンポーネントがPCGによって配置されることを想定していて、ブループリント内で扱われることを想定していないためです。

しかしMobilityプロパティが無くなったわけではないので、例えばInstancedSkinnedMeshComponentを直接、またはこの派生クラスのUCLASSのメタデータに "ShowCategory=(Mobility)"を追加するとBP内で編集できるようになります。

簡単にこの問題を修正するのであれば、ConstructionScriptでSetMobilityをしてあげることがもっとも簡単な解決策になると思います。前回ご回答させていただいた通りInstancingのHLODTypeを使われているのであればHLOD Batching Policyの設定も必要です。

ちなみに Procedural Actor Foliage Base は自作のアクタークラスということで特別な機能は持っていないということでよろしいでしょうか?

[Attachment Removed]

ご返答ありがとうございます。

「InstancedSkinnedMeshComponentのHLODビルド処理」に関して、追加でご質問させていただきます。

現在のプロジェクトはUE5.7を使用しており、Nanite Foliageでは「Procedural Actor Foliage Base」を継承したBlueprintを配置し、InstancedSkinnedMeshComponentを管理しています。

配置方法には以下の2パターンがございます。

  • Blueprint Actorとして直接Outlinerに配置する方法
  • Foliage Mode経由(アクターフォリッジ)で配置する方法

Blueprint内のコンポーネント構成は下記の通りです。

Procedural Actor Foliage Base

├─ DefaultSceneRoot

├─ InstancedSkinnedMeshComponent (Nanite Foliage用)

├─ InstancedStaticMeshComponent (Nanite Foliage未使用時の通常Static Mesh、Nanite Foliage使用時はBP処理で削除)

└─ StaticMeshComponent (コリジョン用Static Mesh、通常は非表示)

その中で、HLODの対象となるか判定する関数「UInstancedSkinnedMeshComponent::IsHLODRelevant」において、

配置されたすべてのInstancedSkinnedMeshComponentのMobilityが「Movable」になっているため、HLOD対象から除外されていることを確認しました。

詳細ウィンドウ上ではInstancedSkinnedMeshComponentのMobilityを変更できないように見受けられます。

EngineのC++ソースコードを調査したところ、

InstancedSkinnedMeshComponentのMobilityはデフォルトでStaticとなっていますが、親クラスのコンストラクタ呼び出し順により、最終的に必ずMovableに設定されている様子です。

親クラスのコンストラクタ呼び出しは以下の通りです。

UInstancedSkinnedMeshComponent::UInstancedSkinnedMeshComponent(…)

→ USkinnedMeshComponent::USkinnedMeshComponent(…)

→ UMeshComponent::UMeshComponent(…)

→ UPrimitiveComponent::UPrimitiveComponent(…)

→ USceneComponent::USceneComponent(…) // ここでMobilityがMovableに設定されている

つきましては、以下をご教示いただきたく存じます。

① InstancedSkinnedMeshComponentをHLODの対象とするためには、Mobilityをどのように設定すればよいでしょうか。

② Nanite FoliageをHLODへ組み込む際に、その他注意すべきポイントがございましたら、ご教示いただけますと幸いです。

お忙しいところ恐れ入りますが、何卒よろしくお願い申し上げます。

[Attachment Removed]