プロシージャル コンテンツ生成フレームワーク (PCG:Procedural Content Generation Framework) は、Unreal Engine 内で独自のプロシージャル コンテンツおよびツールを作成するためのツールセットです。 フレームワークには、PCG を使用してより大きなワールドの作成を支援する PCG 生成モードがいくつか含まれています。 生成モードは PCG コンポーネントの生成ドメインをグリッドに分割し、各セルに独自のローカル PCG コンポーネントを含めます。
大きなグリッドには、木や岩などの大きく、見栄えのするメッシュを生成できます。 小さなグリッドには、草や花、石などの小さなディテールを作成できます。 このアプローチは PCG ツールの実行をより細かく制御でき、広い領域をカバーするツールのパフォーマンスを微調整するために使用されます。
PCG には 4 つの生成モードがあります。
非パーティション化生成 (デフォルト)
パーティション化生成を使用する
デフォルトでは、PCG コンポーネントによって生成されたすべてのメッシュは、ボリュームなどのコンポーネントのドメインに含まれたり、スプラインに関連付けられたりします。 このモードは小さな PCG アセットには機能しますが、広い領域をカバーするアセットに使用するとパフォーマンスの問題が発生する可能性があります。 パーティション化生成では、ユーザー定義のグリッド全体に結果のメッシュが生成されます。 データは各セル間で分割されるため、World Partitionやレベル のインスタンス化など、他のシステムを使用したストリーミングが容易になります。
グラフでパーティション化を有効にする
PCG コンポーネントでパーティション化生成に切り替えるには、次の手順を実行します。
レベル内の PCG アセットを選択します。
[Details (詳細)] パネルの [Is Partitioned] の横にあるチェックボックスをクリックします。
パーティション グリッド サイズを設定する
パーティション グリッドのサイズは、PCGWorldActor の [Partition Grid Size (パーティション グリッドサイズ)] オプションで定義されます。
グリッド サイズを設定するには、次の手順を実行します。
[Outliner (アウトライナー)] で [PCGWorldActor] を選択します。
[Partition Grid Size] オプションの値を調整します。
レベル内にある各 PCG アセットを選択し、[Details (詳細)] パネル内で [Cleanup (クリーンアップ)] をクリックします。
[Generate (生成)] ボタンをクリックして結果を再生成します。
階層生成を使用する
階層生成では、複数のスケールで PCG を使用するメッシュの生成をサポートします。 この生成タイプは、Grid Size ノードを使用してパーティション化生成で使用されるパーティション グリッドサイズをオーバーライドし、メッシュの生成を微調整できるようにします。
Grid Size ノードは、下流で生成されるすべてのデータの生成グリッドのサイズをカスタマイズします。これはサンプラ ノードの前に配置する必要があります。
グラフで階層生成を有効にする
PCG グラフで階層生成を有効にするには、次の手順を実行します。
PCG グラフを開き、[Graph Settings (グラフ設定)] をクリックします。
[Use Hierarchical Generation (階層生成を使用)] の隣にあるチェックボックスをクリックしてオンにします。
[HiGen Default Grid Size (階層生成のデフォルト グリッド サイズ)] のドロップダウン ボックスを開いて値を選択します。
PCG グラフを保存します。
階層生成では、PCG コンポーネントがパーティション化されている必要があります。 この機能を使用する前に、レベルで [Partitioned Generation (パーティション化生成)] が有効であることを確認してください。
グリッド サイズを設定する
Grid Size ノードを使用して、PCG グラフでのメッシュの生成をカスタマイズします。
デフォルトの階層生成グリッド サイズをオーバーライドする PCG グラフの各ブランチで、sampler ノードの前に Grid Size ノードを検索して追加します。
Grid Size ノードをクリックし、 HiGen Grid Size 設定を調整します。
グラフを保存します。
レベルで結果を再生成します。
メッシュのサイズを使用して、グラフ内の適切なグリッド サイズを決定します。 大きなメッシュは小さなメッシュよりも数が少ないことが多いため、より大きなグリッドに配置してストリーミングを容易にする必要があります。 小さなメッシュは数が多くなるため、より小さなグリッド サイズに配置する必要があります。
階層生成では、次の実行ガイドラインが使用されます。
PCG グラフ内の Grid Size ノードに従わないノードは、[HiGen Default Grid Size] 設定に定義されている値を使用してデータを生成します。
大きなグリッド サイズで生成されたデータは、小さなグリッドの実行中にキャッシュ済みのデータとして使用できます。 グラフは大きなグリッド サイズから小さなグリッド サイズへカスケードしますが、小さなグリッドから大きなグリッドへはカスケードしません。
複数のグリッド サイズのデータを使用する入力がノードに複数ある場合、出力は最も小さいグリッド サイズを使用して生成されます。
境界のないグリッド サイズを使用する
次の例では、Mesh Sampler ノードが PCG ボリューム全体で岩のメッシュをサンプリングしています。
サンプラはボリューム コンテンツをHiGen Default Grid Sizeでサンプリングし、高いパフォーマンスの演算をボリューム内のグリッド セルごとに 1 回、合計 4 回実行しています。 このグラフ設定では、ボリューム サイズが増えるほどパフォーマンスは低下します。
このような場合は、Unbounded grid size (境界のないグリッド サイズ) を使用することをお勧めします。 Unbounded によって PCG コンポーネントのグリッド制限が取り除かれ、そのグリッド サイズを使用してノードが一度、実行されます。 その後は、Grid Size ノードを使用してグリッド制限を適用できます。
PCG サブグラフではグリッド サイズが無効になり、入力データまたは親グラフのグリッド サイズが使用されます。
大きなグリッドから小さなグリッドへデータを渡すときに、重複するポイント データが生成される可能性があります。 これは大きなグリッド用に生成されたデータが小さなグリッドのすべてのセルにレプリケートされるときに発生し、パフォーマンスに大きな影響を与えます。 重複するデータは、Cull Points Outside Actor Bounds ノードを使用して、より小さなグリッド セルの外側に存在するポイント データからポイントを削除することで取り除くことができます。
ランタイム生成を使用する
ランタイム生成は、PCG コンポーネント向けの特別な生成モードで、PCG 生成ソース に近接して、動的に生成とクリーンアップを行います。 これはインエディタ、PIE、スタンドアローンのビルドで利用できます。
ランタイム生成は階層生成と組み合わせると最も効果的になり、より高い詳細度を効率的に必要な場所にのみ適用します。
生成ソース
生成ソースは、近くのランタイム生成されたコンポーネントにメッシュを生成させるワールド内のポイントを表します。
World Partition と同様に、PCG はストリーミング ソースとして次のものを使用します。
エディタ ビューポート ソース: [Treat Editor Viewport as Generation Source (エディタ ビューポートを生成ソースとして扱う)] オプションが PCGWorldActor で切り替えられたときに、アクティブなエディタ ビューポートまたはフォーカスされたエディタ ビューポートにアタッチされるソース。
プレイヤー ソース:レベル内のプレイヤー コントローラーにアタッチされるソース。
World Partition ストリーミング ソース: World Partition システム (PlayerController、WorldPartitionStreamingSourceComponent など) からストリーミング ソース プロバイダとして機能する全てのものにアタッチされるソース。
PCG 生成ソース コンポーネント: 任意のアクタにアタッチできる汎用的な生成ソースとして使用されるソース。
PCG グラフの [Generation Radii](生成半径)] 設定は、PCG コンポーネントに影響を与える生成ソースの範囲を決定するもので、パーティション化された各グリッド サイズに設定されます。 ランタイム生成された PCG コンポーネントがこの半径内にあると、生成がスケジュールされます。 コンポーネントがこの半径内からなくなると 、(Cleanup Radius Multiplier (クリーンアップ半径乗数) によってスケーリングされる場合)、クリーンアップされます。
生成半径は、[Override Generation Radii (生成半径をオーバーライド)] 設定に切り替えることで、 [Details] パネルを使用してレベル内の各 PCG コンポーネントでオーバーライドすることもできます。
基本の生成半径はパーティション化されていないコンポーネントに適用され、Unbounded grid level (境界のないグリッドレベル) はパーティション化された階層生成コンポーネントに適用されます。
小さなグリッド サイズには、大きなグリッド サイズよりも大きな生成半径を設定しないことをお勧めします。 各生成半径は、前の半径より大きなサイズにする必要があります。
スケジュール ポリシー
スケジュール ポリシーは、ランタイム生成されるコンポーネントの生成スケジュールに対する実用的なルールを提供するために使用されます。 デフォルトのスケジュール ポリシーは距離と視線方向を使用して、生成ソースの前および近くにあるコンポーネントの生成を優先させます。
スケジュール ポリシーはコンポーネントごとに設定されるもので、PCG コンポーネントの [Details] パネルにあります。
Unreal Engine 5.5では、HiGen Grid Size Exponential (HiGen グリッドサイズ指数関数) が追加されたことにより、スケジュール ポリシーにおけるDirection Weight (ディレクション ウェイト) の相対的な重要度が大幅に増加しました。 コンテンツがバージョン 5.5 より前に作成された場合は、ディレクション ウェイトを減らす必要があるかもしれません。
錐台カリングを使用
PCG アセットの [Detauks (詳細)] パネルで Use Frustum Culling が選択されている場合、そのアセットはコンポーネントを生成する前に、指定されている視錐台に基づいてそのコンポーネントが見えるかどうかを確認します。 たとえば、プレイヤー カメラが視錐台を提供した場合、アセットはプレイヤー カメラの視点に基づいてカリングするか、非表示になるコンポーネントを生成しないように決定します。
コンポーネントが視錐台に入る前にコンポーネントを生成するか、または一定の距離でクリーンアップするには、Generate Bounds Modifier と Cleanup Bounds Modifier の各コントロールを使用します。 これにより、カメラを向けている間にコンポーネントが突然表示されないようにすることができます。 クリーンアップ モディファイアは常に生成モディファイア以上の値になります。
ランタイム生成を有効にする
PCG グラフでランタイム生成を有効にするには、次の手順を実行します。
PCG アセットの [Details (詳細)] パネルで、[Generation Trigger (生成トリガー)] を [Generate at Runtime (ランタイム時に生成)] に変更します。
ランタイム生成をビューポートでテストするには、次の手順を実行します。
[Outliner (アウトライナー)] で [PCGWorldActor] を選択します。
[Treat Editor Viewport as Generation Source (エディタビューポートを生成ソースとして扱う)] のチェックボックスがオンになっていることを確認します。
ビューポートのカメラ ビューの半径範囲内にメッシュが生成されていることが確認できます。
ランタイム生成を設定する
生成半径は、PCG グラフ設定で各グリッド サイズ レベルに対して定義するか、レベルのニーズに合わせて PCG コンポーネントの[Details (詳細パネル)] で設定できます。
生成半径を設定するには、次の手順を実行します。
PCG Graph Settings (PCG グラフの設定) を開き、[Runtime Generation (ランタイム生成)] > [Generation Radii (生成半径)] を展開します。
グリッド サイズごとに生成半径を調整します。 [Generation Radius (生成半径)] オプションはデフォルトのグリッド サイズに適用されるか、[Unbounded] オプションを使用する際に適用されます。
Cleanup Radius Multiplier (クリーンアップ半径乗数)を調整します。 この乗数は、メッシュがレベルから削除される半径を決定する生成半径に適用されます。
グラフを保存します。
PCG アセットがビューア周辺の半径内にのみメッシュを生成するようになりました。
デバッグとランタイム オーバーライド
ランタイム時にランタイム生成をデバッグするための便利なコンソール コマンドがいくつかあります。
| コンソールコマンド | 説明 |
|---|---|
pcg.RuntimeGeneration.Enable | ランタイム生成に切り替えます。 |
pcg.RuntimeGeneration.EnableDebugging | Runtime Generation Scheduler の詳細ログに切り替えて、正確な動作について把握します。 |
pcg.RuntimeGeneration.EnablePooling | ランタイム生成されたパーティション アクタのプーリングに切り替え、一定の割り当てを防ぎます。 このオプションはデフォルトでオンになっています。 |
pcg.RuntimeGeneration.BasePoolSize | プールでランタイム生成されるパーティション アクタの初期番号を設定します。 デフォルトでは |
pcg.RuntimeGeneration.FramesBetweenGraphSchedules | Runtime Generation Scheduler がコンポーネントの生成をスケジュールする間に待機する必要があるティック数を設定します。 スケジュール ポリシーをデバッグする際に、コンポーネントがスケジュールされる正確な順序を確認する場合に役立ちます。 デフォルトでは「0」に設定されます。これにより、1 つのティックですべての生成をスケジュールできます。 |
pcg.RuntimeGeneration.NumGeneratingComponents | 同時に生成される PCG コンポーネントの数を設定します。このことは、PCG の CPU 使用量を制限し、特定のコンポーネントの画面表示時間を制御するのに役立ちます。 コンポーネントの生成が同時に行われる場合、実行は保証されないため、この値が小さいと、距離とディレクション ウェイティングの視覚化に大きな影響を及ぼします。 デフォルトでは |
pcg.FrameTime | PCG がフレームごとに実行する時間を割り当てます (ミリ秒単位)。 デフォルトでは |
pcg.EditorFrameTime | PCG をエディタで実行する場合 (PIE 以外) のフレームごとに実行する時間を割り当てます (ミリ秒単位)。 デフォルトでは |
PCG グラフでグリッド サイズを視覚化する
デバッグ オブジェクト ツリーを使用して、PCG グラフの各ノードで使用されるグリッド サイズを視覚化します。
PCG グラフでグリッド サイズを視覚化するには、次の手順を実行します。
左下にあるデバッグ オブジェクト ツリーのリストからローカル PCG コンポーネントを選択します。 各コンポーネントの名前にはグリッド サイズが含まれています。 たとえば、
PCGPartitionActor_12800_1_5_0/PCGComponent_1/NewPCGGraphは 12800 cm グリッドの一部です。コンポーネント名の隣にある矢印をクリックしてコンポーネントを設定します。
この例では、木のメッシュをスポーンするコンポーネントが選択されています (1)。 岩のメッシュをスポーンするノード (2) と草のメッシュをスポーンするノード (3) はグレー表示されています。これは、これらのノードが小さなグリッド サイズでスポーンし、木のノードの後で実行されることを示しています。 各ノードの右上には、グリッド サイズがメートル単位で表示されています。