プロシージャル コンテンツ生成フレームワーク (PCG:Procedural Content Generation Framework) は、Unreal Engine 内で独自のプロシージャル コンテンツおよびツールを作成するためのツールセットです。フレームワークには、PCG を使用してより大きなワールドの作成を支援する PCG 生成モードがいくつか含まれています。生成モードは PCG コンポーネントの生成ドメインをグリッドに分割し、各セルに独自のローカル PCG コンポーネントを含めます。
斜面に樹木、草、コケなどがスポーンされている PCG の森サンプル。
大きなグリッドには、木や岩などの大きく、見栄えのするメッシュを生成できます。小さなグリッドには、草や花、石などの小さなディテールを作成できます。このアプローチは PCG ツールの実行をより細かく制御でき、広い領域をカバーするツールのパフォーマンスを微調整するために使用されます。
PCG には 4 つの生成モードがあります。
- 非パーティション化生成 (デフォルト)
- パーティション化生成
- 階層生成
- ランタイム生成
パーティション化生成を使用する
デフォルトでは、PCG コンポーネントによって生成されたすべてのメッシュは、ボリュームなどのコンポーネントのドメインに含まれたり、スプラインに関連付けられたりします。このモードは小さな PCG アセットには機能しますが、広い領域をカバーするアセットに使用するとパフォーマンスの問題が発生する可能性があります。パーティション化生成では、ユーザー定義のグリッド全体に結果のメッシュが生成されます。データは各セル間で分割されるため、World Partition や レベルのインスタンス化 など、他のシステムを使用するストリーミングが簡単になります。
パーティション化された PCG コンポーネントの例。
グラフでパーティション化を有効にする
PCG コンポーネントでパーティション化生成に切り替えるには、次の手順を実行します。
PCG ボリュームの [Details (詳細)] パネルで PCG パーティション生成に切り替えます。
- レベル内の PCG アセットを選択します。
- [Details] パネルで [Is Partitioned (パーティション化)] の隣にあるチェックボックスをクリックしてオンにします。
パーティション グリッド サイズを設定する
パーティション グリッドのサイズは、PCGWorldActor の [Partition Grid Size (パーティション グリッド サイズ)] オプションで定義されます。
PCGWorldActor で [Partition Grid Size] オプションを設定します。
グリッド サイズを設定するには、次の手順を実行します。
- アウトライナー で PCGWorldActor を選択します。
- [Partition Grid Size] オプションの値を調整します。
- レベル内の各 PCG アセットを選択し、[Details] パネルの [Cleanup (クリーンアップ)] をクリックします。
- [Generate (生成)] ボタンをクリックして、結果を生成します。
階層生成を使用する
階層生成では、複数のスケールで PCG を使用するメッシュの生成をサポートします。この生成タイプは、Grid Size ノードを使用してパーティション化生成で使用されるパーティション グリッド サイズをオーバーライドし、メッシュの生成を微調整できるようになります。
小さなグリッド サイズで生成された岩が強調表示されている例。
Grid Size ノードは、下流で生成されるすべてのデータの生成グリッドのサイズをカスタマイズします。これはサンプラ ノードの前に配置する必要があります。
グラフで階層生成を有効にする
PCG グラフで階層生成を有効にするには、次の手順を実行します。
PCG グラフの設定で PCG の階層生成に切り替えます。
- PCG グラフを開き、[Graph Settings (グラフ設定)] をクリックします。
- [Use Hierarchical Generation (階層生成を使用)] の隣にあるチェックボックスをクリックしてオンにします。
- [HiGen Default Grid Size (階層生成のデフォルト グリッド サイズ)] のドロップダウン ボックスを開いて値を選択します。
- PCG グラフを保存します。
階層生成では、PCG コンポーネントがパーティション化されている必要があります。この機能を使用する前に、レベルで パーティション化生成 が有効になっていることを確認してください。
グリッド サイズを設定する
Grid Size ノードを使用して、PCG グラフでのメッシュの生成をカスタマイズします。
Grid Size ノードを使用して階層生成のグリッド サイズを設定します。
- デフォルトの階層生成のグリッド サイズをオーバーライドする PCG グラフの各ブランチで、サンプラ ノードの前に Grid Size ノードを検索して追加します。
- Grid Size ノードをクリックし、[HiGen Grid Size (階層生成のグリッド サイズ)] 設定を調整します。
- グラフを保存します。
- レベルで結果を再生成します。
メッシュのサイズを使用して、グラフ内の適切なグリッド サイズを決定します。大きなメッシュは小さなメッシュよりも数が少ないことが多いため、より大きなグリッドに配置してストリーミングを容易にする必要があります。小さなメッシュは数が多くなるため、より小さなグリッド サイズに配置する必要があります。
階層生成では、次の実行ガイドラインが使用されます。
- PCG グラフ内の Grid Size ノードに従わないノードは、[HiGen Default Grid Size] 設定に定義されている値を使用してデータを生成します。
- 大きなグリッド サイズで生成されたデータは、小さなグリッドの実行中にキャッシュ済みのデータとして使用できます。グラフは大きなグリッド サイズから小さなグリッド サイズへカスケードしますが、小さなグリッドから大きなグリッドへはカスケードしません。
- 複数のグリッド サイズのデータを使用する入力がノードに複数ある場合、出力は最も小さいグリッド サイズを使用して生成されます。
境界のないグリッド サイズを使用する
次の例では、Mesh Sampler ノードが PCG ボリューム全体で岩のメッシュをサンプリングしています。
境界のないグリッド サイズの使用例
サンプラはボリューム コンテンツを HiGen Default Grid Size でサンプリングし、パフォーマンス重視の操作をボリューム内のグリッド セルごとに 1 回、合計 4 回実行しています。このグラフ設定では、ボリューム サイズが増えるほどパフォーマンスは低下します。
このような場合は、Unbounded (境界なし) のグリッド サイズを使用することをお勧めします。Unbounded によって PCG コンポーネントのグリッド制限が取り除かれ、そのグリッド サイズを使用してノードが一度、実行されます。その後は、Grid Size ノードを使用してグリッド制限を適用できます。
PCG サブグラフではグリッド サイズが無効になり、入力データまたは親グラフのグリッド サイズが使用されます。
大きなグリッドから小さなグリッドへデータを渡すときに、重複するポイント データが生成される可能性があります。これは大きなグリッド用に生成されたデータが小さなグリッドのすべてのセルにレプリケートされるときに発生し、パフォーマンスに大きな影響を与えます。重複するデータは、Cull Points Outside Actor Bounds ノードを使用して、より小さなグリッド セルの外側に存在するポイント データからポイントを削除することで取り除くことができます。
ランタイム生成を使用する
ランタイム生成は、PCG 生成ソース の近くで動的に生成してクリーンアップする PCG コンポーネントの特別な生成モードです。これはインエディタ、PIE、スタンドアローンのビルドで利用できます。

ランタイム生成は階層生成と組み合わせると最も効果的になり、より高い詳細度を効率的に必要な場所にのみ適用します。
生成ソース
生成ソースは、近くのランタイム生成されたコンポーネントにメッシュを生成させるワールド内のポイントを表します。
World Partition と同様に、PCG はストリーミング ソースとして次のものを使用します。
- エディタ ビューポート ソース:PCGWorldActor の [Treat Editor Viewport as Generation Source (エディタ ビューポートを生成ソースとして扱う)] オプションがオンになっている場合に、アクティブなエディタ ビューポートまたはフォーカスされたエディタ ビューポートにアタッチされているソースです。
- プレイヤー ソース:レベル内のプレイヤー コントローラーにアタッチされているソースです。
- World Partition ストリーミング ソース:World Partition システム (PlayerController、WorldPartitionStreamingSourceComponent など) からストリーミング ソース プロバイダとして機能するものにアタッチされているソースです。
- PCG 生成ソース コンポーネント:任意のアクタにアタッチできる汎用的な生成ソースとして使用されるソースです。
PCG グラフの [Generation Radii (生成半径)] 設定は、PCG コンポーネントに影響を与える生成ソースの範囲を決定するもので、パーティション化されたグリッド サイズごとに設定されます。ランタイム生成された PCG コンポーネントがこの半径内にあると、生成がスケジュールされます。コンポーネントがこの範囲内からなくなると (クリーンアップ半径乗数 によってスケーリングされる場合)、クリーンアップされます。
生成半径は、[Override Generation Radii (生成半径をオーバーライド)] 設定に切り替えると [Details] パネルを使用してレベル内の各 PCG コンポーネントでオーバーライドすることもできます。
基本の 生成半径 は、パーティション化されていないコンポーネントと、パーティション化された階層生成コンポーネントの境界なしのグリッド レベルに適用されます。
[PCG Graph (PCG グラフ)] 設定の [PCG Generation Radii (PCG 生成半径)] 設定。
小さなグリッド サイズには、大きなグリッド サイズよりも大きな生成半径を設定しないことをお勧めします。各生成半径は、前の半径より大きなサイズにする必要があります。
スケジュール ポリシー
スケジュール ポリシーは、ランタイム生成されるコンポーネントの生成スケジュールに対する実用的なルールを提供するために使用されます。デフォルトのスケジュール ポリシーは距離と視線方向を使用して、生成ソースの前および近くにあるコンポーネントの生成を優先させます。
スケジュール ポリシーはコンポーネントごとに設定されるもので、PCG コンポーネントの [Details] パネルにあります。
PCG アセットの [Details] パネルにある [PCG Scheduling Policy (PCG スケジュール ポリシー)] 設定。
ランタイム生成を有効にする
PCG グラフでランタイム生成を有効にするには、次の手順を実行します。
PCG アセットの [Details] パネルで、[Generation Trigger (生成トリガー)] を [Generate at Runtime (ランタイム時に生成)] に設定します。
ランタイム生成をビューポートでテストするには、次の手順を実行します。
- アウトライナーで 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 | プールでランタイム生成されるパーティション アクタの初期番号を設定します。デフォルトでは「100」に設定されます。 |
| pcg.RuntimeGeneration.FramesBetweenGraphSchedules | Runtime Generation Scheduler がコンポーネントの生成をスケジュールする間に待機する必要があるティック数を設定します。スケジュール ポリシーをデバッグする際に、コンポーネントがスケジュールされる正確な順序を確認する場合に役立ちます。デフォルトでは「0」に設定されます。これにより、1 つのティックですべての生成をスケジュールできます。 |
| pcg.FrameTime | PCG がフレームごとに実行する時間を割り当てます (ミリ秒単位)。デフォルトでは「16.667 ミリ秒」に設定されます。 |
| pcg.EditorFrameTime | PCG をエディタで実行する場合 (PIE 以外) のフレームごとに実行する時間を割り当てます (ミリ秒単位)。デフォルトでは「50 ミリ秒」に設定されます。 |
PCG グラフでグリッド サイズを視覚化する
デバッグ オブジェクト ツリーを使用して、PCG グラフの各ノードで使用されるグリッド サイズを視覚化します。
PCG グラフでグリッド サイズを視覚化するには、次の手順を実行します。
- 左下にあるデバッグ オブジェクト ツリーのリストからローカル PCG コンポーネントを選択します。各コンポーネントの名前にはグリッド サイズが含まれています。たとえば、「
PCGPartitionActor_12800_1_5_0/PCGComponent_1/NewPCGGraph」は 12800 cm のグリッドの一部です。 - コンポーネント名の隣にある矢印をクリックしてコンポーネントを設定します。
階層生成 のグリッド サイズが視覚化されている例。
この例では、木のメッシュをスポーンするコンポーネントが選択されています (1)。岩のメッシュをスポーンするノード (2) と草のメッシュをスポーンするノード (3) はグレー表示されています。これは、これらのノードが小さなグリッド サイズでスポーンし、木のノードの後で実行されることを示しています。各ノードの右上には、グリッド サイズがメートル単位で表示されています。