プロシージャル コンテンツ生成フレームワーク (PCG:Procedural Content Generation Framework) は、Unreal Engine 内で独自のプロシージャル コンテンツおよびツールを作成するためのツールセットです。 PCG は、迅速で反復的なツールと、建造物やバイオームの生成といったアセット ユーティリティから、ワールド全体に至るまでのあらゆる複雑度のコンテンツをビルドする機能を、テクニカル アーティスト、デザイナー、およびプログラマーに提供します。
重要な概念と用語
Points (ポイント):PCG グラフによって生成される 3D 空間内の位置。多くの場合、メッシュのスポーンに使用されます。 ポイントは、トランスフォーム、境界、色、密度、スティープネス、シードに関する情報を含んでいます。 ポイントにはユーザー定義属性を割り当てることができます。
Point Density (ポイント密度):各種グラフ ノードで使用される値。 これは、デバッグ ビューでは各ポイントのグラディエントとして表され、その位置にポイントが存在する確率を表します。 密度が 0 の場合は黒で、1 の場合は白です。
必要な設定
プロシージャル コンテンツ生成フレームワークは、プロジェクトで Procedural Content Generation Framework プラグインが有効になっている必要があります。 プラグインを有効にする方法の詳細については、「プラグインを操作する」を参照してください。
スタティックメッシュ上のポイントをサンプリングするには、Procedural Content Generation Framework Geometry Script Interop プラグインが必要です。
プロシージャル ノード グラフ
プロシージャル ノード グラフは、プロシージャル コンテンツ生成フレームワークの中心的な構成要素です。
マテリアル エディタと同様の形式を使用して、空間データがレベル内の PCG コンポーネントからグラフに入力され、ポイントの生成に使用されます。 ポイントは、一連のノードを使用してフィルタして、変更され、アウトプットはリアルタイムで更新されます。 生成されたポイントは、各種アセットのスポーンに使用することができます。
PCG Graph アセットを作成する
PCG Graph アセットを作成するには、次の手順を実行します。
コンテンツ ドロワーまたはコンテンツ ブラウザ内を右クリックして [Create Advanced Asset (高度なアセットを作成)] > [PCG] に移動し、[PCG Graph] を選択します。
新しいアセットの名前を選択して、Enter キーを押します。
PCG グラフのテンプレート
PCG グラフを作成した後、そのグラフをテンプレートとしてマークすると、新しいグラフを作成するときにコンテキスト メニューから選択できるようになります。 Niagara テンプレートと同様に、空白のグラフから開始するのではなく、PCG グラフ テンプレートを使用してワークフローを迅速化できます。
PCG グラフをテンプレートとして設定する
PCG グラフをテンプレートとして定義するには、グラフを開いて次の手順を実行します。
ツールバーで [Graph Settings (グラフ設定)] ボタンをクリックすると、[Details] パネルにグラフ設定が表示されます。
[Details] パネルのアセット情報セクションに移動し、Is Template プロパティを有効にします。
グラフがテンプレート グラフとして定義されました。
テンプレートを使用して新しいグラフを作成する
新しいグラフを作成するときに、アセットの名前と場所を選択した後、[Create Graph From Template (テンプレートからグラフを作成)] ウィンドウからグラフ テンプレートを選択できるようになりました。 使用するグラフ テンプレートを選択し、[Initialize From Template (テンプレートから初期化)] ボタンをクリックして、テンプレートを使用して新しいグラフを作成します。
新しい PCG グラフを作成するときにテンプレート プロンプトを無効にするには、メニュー バーで [Edit (編集)] > [Editor Preferences (エディタの環境設定)] に移動します。 次に、検索バーを使用するか、プロパティの [PCG Editor (PCG エディタ)] セクションに移動して、[Show Template Picker on New Graph (新しいグラフ上にテンプレート ピッカーを表示)] プロパティを無効にします。
このプロパティを無効にすると、新しい PCG グラフを作成するときに [Create Graph From Template] ウィンドウは表示されません。
PCG グラフを編集する
PCG グラフ エディタを使用して、PCG Graph アセットを設定および編集することができます。 エディタの操作は、ブループリントまたはマテリアル エディタに似ています。 また、いくつかの PCG 固有のツールやパネルも含まれています。
| 番号 | 説明 |
|---|---|
1 | ツールバー |
2 | ノード パレット |
3 | ビューポート |
4 | Details panel (詳細パネル) |
5 | デバッグ ツリー |
6 | 属性リスト |
ブループリントでの作業と同様に、ノード パレットからビューポートにノードをドラッグするか、コンテキスト メニューを使用して、グラフにノードを追加することができます。
グラフが PCG コンポーネントに割り当てられ、コンテンツの生成に使用されている場合は、PCG グラフに行われた変更が、エディタのビューポートでリアルタイムに更新されます。
PCG ノード
PCG グラフは、一連の PCG ノードで構成されており、各ノードが最終結果に貢献する演算を実行します。
これらのノードは、次のカテゴリに分かれています。
| カテゴリ | 説明 |
|---|---|
ブループリント | ブループリント関連のノードが含まれます。 これには、PCGBlueprintElement から派生したユーザー ブループリントを実行するための一般的なノードが含まれます。 |
制御フロー | グラフを通じてロジックのフローを制御するノードを含みます。 |
Debug | デバッグに役立つノードが含まれます。 |
密度 | ポイントの密度に影響するノードが含まれます。 |
フィルタ | 基準に基づいて、またはポイント単位でデータをフィルタするノードが含まれます。 |
一般 | データに影響するノードが含まれますが、空間データは含まれません。 |
階層生成 | Hierarchical Generation モードを制御するためのノードが含まれます。 |
入出力 | Alembic およびその他の外部データをロードするためのノードが含まれます。 |
IO | 外部データとのインタラクションを制御するノードが含まれます。 |
Metadata | ポイントの属性であるか、属性セットの属性であるかを問わず、属性を操作するノードが含まれます。 |
Param | アクタまたはブループリント変数からのパラメータの取得を制御するノードが含まれます。 |
Point Ops | ポイントおよびそのプロパティに影響するノードが含まれます。 |
Sampler | ボリューム、サーフェス、メッシュなど、空間データのソースからポイントを生成するノードが含まれます。 |
Spatial | データ間の空間的な関係を作成したり、内部の空間データを変更したり、データを取得したりするノードが含まれます。 |
Spawner | 新しいデータを作成したり、指定された位置にアクタを配置したりするノードが含まれます。 |
Subgraph | サブグラフの使用を処理するノードが含まれます。 |
ブループリントと同様に、グラフの可読性を高めるために、コメントと Reroute ノードを追加することができます。
グラフ編集のカスタマイズ
PCG グラフの編集は、[グラフ設定] パネルでアクセスできる一連の専用プロパティを使用してカスタマイズできます。
これらのプロパティを使用して、PCG グラフの動作とワークフローをカスタマイズすることで、よりキュレートされたエクスペリエンスを実現できます。 これらの設定は、プロジェクトに合わせて PCG グラフのワークフローを調整できる PCG グラフ テンプレート を作成するために使用できます。
ノード フィルタリング
ノード フィルター設定を使用すると、カテゴリー別にノードの選択をフィルタリングできます。 フィルタリングは、含めるか除外するかに基づいて実行されます。 選択コンテキスト メニューでノードをフィルタリングするには、[ノードをカテゴリでフィルタリング] プロパティを有効にしてから、[追加] (+) ボタンを使用して [フィルタリングされたカテゴリー] プロパティにインデックスを追加します。 インデックスを追加した後、テキストフィールドにカテゴリー名を入力するか、ドロップダウンメニューを使用してノード カテゴリーを選択できます。
フィルターを変更すると、ノード パレットとコンテキスト メニューで使用可能な選択肢が更新されます。
グラフ フィルタリング
グラフの利用可能なノードをフィルターするだけでなく、利用可能なサブグラフをフィルターすることもできます。 ノード フィルタリングと同様に、まず [フィルター サブグラフ] プロパティを有効にしてから、新しいインデックスを追加 (+) し、グラフで選択可能にするサブグラフを選択します。
属性およびメタデータ
属性は変数に似ており、名前と型で定義されるデータを格納します。 属性には次の 2 つのタイプがあります。
静的属性:固定され、常に存在する属性です。
$Positionなどのように$で始まります。動的属性:ランタイム時に作成され、グラフ データのメタデータの一部として格納される属性です。
メタデータ ドメイン
PCG グラフで属性を使用する場合、メタデータが存在するドメインを考慮する必要があります。 このドメインは、保存できる情報の種類や、後で使用して操作する方法を制御します。 各メタデータ ポイントで、サポートされているドメインとデフォルトであるドメインを把握する必要があります。 ドメインには、選択時に @ がプレフィックスとして付けられます。
属性リスト ビューには、ドメインを切り替えるフィールドがあります。
PCG グラフを操作するときに使用できるドメインが 3 つあります。 まず、データ自体に設定されている属性に Data ドメインを使用できます。 Data ドメインは単一の値に制限されています。つまり、属性セットのような複数の値を格納できません。 Data ドメインは、他のドメインと同様に操作できます。 属性のプレフィックスとして @Data を付けると、属性を作成または追加したり、メタデータ操作で操作したりできます。 たとえば、Data ドメインの属性 MyAttr は @Data.MyAttr になります。 Data ドメインは、その他すべての空間データのデフォルト ドメインで、ドメイン @Data がデフォルトです。 ドメインが指定されていない場合。
2 つ目のドメインは、プレフィックス @Points を使用した Points ドメインです。
3 つ目のドメインは Elements ドメインで、属性セットに使用され、@Elements プレフィックスを使用します。
属性セレクター
いくつかの PCG グラフ ノードは、属性セレクターを通じて静的属性と動的属性との間の相互運用性を提供するために使用できます。
属性セレクターには、選択したノードで使用できる属性のリストが表示されます。 属性セレクターでは次の命名規則が使用されます。
「$」で始まる名前は静的属性で、それ以外の名前は動的属性です。
「
@Last」は前のノードで操作された最後の動的属性を表します。
たとえば、Math ノードを使用して、静的属性と動的属性に対して数学的演算を実行します。
画像をクリックすると拡大表示されます。
属性セレクターの名前フィールドを使用して、コンポーネントからデータを抽出することもできます。
上の画像では、$Position.ZYX は $Position のコンポーネントの逆を提供します。 次の図は、この方法で操作できるコンポーネントとその種類を示しています。
| コンポーネント | 型 |
|---|---|
ベクター | |
X、Y、Z、W、x、y、z、w | Double。 RGBA と組み合わせることはできません。 |
R、G、B、A、r、g、b、a | Double。 XYZW と組み合わせることはできません。 |
Length (長さ)、Size (サイズ) | Double。 ベクターの長さを返します。 |
トランスフォーム | |
Location (所在地)、Position (位置) | Vector3 |
Scale (スケール)、Scale3D | Vector3 |
回転 | クォータニオン |
ローテーター | |
Pitch (ピッチ)、Yaw (ヨー)、Roll (ロール) | Double |
Forward (前)、Right (右)、Up (上向き) | Vector3 |
クォータニオン | |
Support Vector extractor (サポート ベクター エクストラクタ) | ベクター |
Support Rotator extractor (サポート ローテータ エクストラクタ) | ローテータ |
C++ 設定のオーバーライド
一部の設定は、C++ プロパティ メタデータで PCG_Overridable としてマークが付けられます。 ブループリント ノードの場合は、表示されていてインスタンスが編集可能な変数はオーバーライドできます。
オーバーライドされると、ピンが自動的に詳細ピンとしてノードに追加されます。 ピンには次の 2 つのタイプがあります。
グローバル オーバーライド:任意の数の属性を受け入れて、設定名と完全一致する各属性のすべての設定をオーバーライドします。
単独オーバーライド:任意の数の属性を受け入れて、設定名と完全一致する属性や、属性が 1 つしかない場合はどの名前でも、特定の設定をオーバーライドします。
属性型は一致する必要がありますが、一部の型は変換できます。
完全一致する名前や型を確認するには、オーバーライド ピンのツールチップを使用します。
ドメインは各データに固有であるため、UPCGData の C++ API には、サポートされているドメインを把握したり、メタデータ ドメインを指定する内部クラスである FPCGMetadataDomainID と属性やプロパティを選択するための公開されたクラスである FPCGAttributePropertySelector との間で変換する関数があります。 各 FPCGMetadataDomain には独自の属性およびエントリのセットがあり、互いに独立しています。 アクセサーは、FPCGAttributePropertySelector を使用して適切なドメインにアクセスするように更新されます。
スプライン メタデータの例
以下のセクションでは、実用的な PCG メタデータ ワークフローのサンプル設定をいくつか紹介します。
スプライン属性
属性を使用すると、制御点のプロパティを直接操作できます。 [追加(+)] > [スプライン] > [制御点] を使用すると、以下の属性プロパティにアクセスできます。
| 名前 | 説明 | 型 |
|---|---|---|
$Position | 制御点のトランスフォームの位置コンポーネント (ワールド参照) | ベクター |
$Rotation | 制御点のトランスフォームの回転コンポーネント (ワールド参照) | クォータニオン/ ローテータ |
$Scale | 制御点のトランスフォームのスケール コンポーネント (ワールド参照) | ベクター |
$Transform | 制御点のワールド トランスフォーム | トランスフォーム |
$ArriveTangent | 制御点での到達接線 | ベクター |
$LeaveTangent | 制御点での離脱接線 | ベクター |
$InterpType | 制御点での位置の補間のタイプ (スプライン制御点に設定されているのと同じ) | ESplinePointType |
$LocalPosition | ベクター | |
$LocalRotation | 制御点のトランスフォームの回転コンポーネント (スプライン参照) | クォータニオン/ ローテータ |
$LocalScale | 制御点のトランスフォームのスケール コンポーネント (スプライン参照) | ベクター |
$LocalTransfrom | 制御点のローカル トランスフォーム | トランスフォーム |
スプラインデータ
データのプロパティを直接操作することもできます。 [追加(+)] > [スプライン] > [グローバル] を使用すると、以下のデータ プロパティにアクセスできます。
| 名前 | 説明 | 型 |
|---|---|---|
@Data.$SplineTransform | スプラインのトランスフォーム | FTransform |
@Data.$IsClosed | スプラインが閉じているかどうか (読み取り専用) | bool |
スプラインメタデータ
制御点のプロパティに加えて、制御点にアタッチされたスプライン データに属性を追加することができます。 このメタデータは、スプラインをサンプリングするときに補間されます このようなメタデータは、ポイントまたは属性セットのメタデータと同じように動作します。
ポイントと同様に、[属性を追加] を使用して新しい属性を作成したり、メタデータ演算を使用してこの属性に書き込む特定の出力ターゲットを指定したりできます。
また、スプライン メタデータは制御点のメタデータがデフォルトですが、@ControlPoints を使って明示することもできます。
グラフ パラメータ
マテリアル エディタのパラメータと同様に、PCG グラフのパラメータはユーザーが作成するオーバーライド可能な値であり、これを使用してさまざまな状況に合わせてカスタマイズ可能なグラフを作成できます。 新しいパラメータを作成するには、次の手順を実行します。
[PCG Graph Settings (PCG グラフの設定)] を開きます。
[Parameters (パラメータ)] の横にある [+] ボタンをクリックします。 これにより、新しいパラメータが作成されます。
新しいパラメータの隣にある下向き矢印をクリックします。 名前を変えて、型を選択します。
PCG グラフのパラメータ値を変更するには、次の手順を実行します。
グラフ パラメータか、PCG アセットの [Details (詳細)] パネルで値を変更します。
PCG グラフ インスタンスのパラメータ値を変更するには、次の手順を実行します。
コンテンツ ブラウザでアセットを開き、PCG アセットの [Details] パネルで値を変更します。
グラフ インスタンス
PCG グラフ インスタンスはマテリアル インスタンスと同様に機能し、グラフ パラメータを活用して既存のグラフをインスタンスや PCG サブグラフとして再利用できます。
PCG グラフ インスタンスを作成するには、次の手順を実行します。
レベル内の PCG アセットを選択します。
[Details] パネルで PCG コンポーネントを選択します。
[Save Instance (インスタンスを保存)] ボタンをクリックして新しいインスタンスを作成します。
新しいグラフ インスタンスに名前をつけて Enter キーを押します。
PCG コンポーネント
プロシージャル ノード グラフは、PCG コンポーネントを使用してレベルをサンプリングすることができます。 このコンポーネントは、プロシージャル ノード グラフのインスタンスを保持し、エディタとランタイム時の両方で、プロシージャル コンテンツの生成を管理します。 PCG コンポーネントは、アクタにコンポーネントとして追加したり、PCG ボリュームの一部として使用します。PCG ボリュームはプロシージャル コンテンツをすばやく設定するうえで役立つ基本ボリュームです。
PCG グラフを PCG コンポーネントに接続するには、次の手順を実行します。
エディタのビューポートまたはアウトライナーで、接続先の PCG ボリュームまたはブループリント クラスを選択します。
[Details (詳細)] パネルで、[PCG Component (PCG コンポーネント)] をクリックします。
[Graph (グラフ)] ドロップダウンをクリックして、使用したい PCG ノード グラフを選択します。
[Generate (生成)] ボタンをクリックして、結果を確認します。
World Partition サポート
PCG アセットが World Partition - データ レイヤーと HLOD レイヤーに割り当てられると、PCG グラフはアクタを生成し、同じデータ レイヤーと同じ HLOD レイヤーに割り当てます。
World Partition での PCG の使用の詳細については、「World Partition での PCG の使用」を参照してください。
PCG でデバッグを行う
デバッグは、PCG ワークフローに欠かせないプロセスです。
各ノードには、PCG グラフの各ステップでポイント データを視覚化するために使用できる、次のデバッグ オプションがあります。
デバッグ レンダリング
Enable / Disable node (ノードの有効化/無効化)
Inspect (調査)
ノードの [Details] パネルで [Debug (デバッグ)] チェックボックスをオンにするか、D キーを押して、各ノードで [Debug Rendering] のオン/オフを切り替えます。
各ノードのオン/オフを切り替えるには、ノードの [Details] パネルで [Enabled (有効)] チェックボックスをオンにするか、E キーを押します。
また、ノードを調べることで、ノードが生成するすべてのポイントを属性リストに表示することができます。
デバッグ ツリーから PCG コンポーネントを選択します。
調べたいノードを右クリックします。
[Inspect (調べる)] を選択します。 または、A キーを押すこともできます。
シンプルな森林ボリュームを作成する
プロシージャル生成ツールの一般的な使用例は、オープンなワールド環境でのバイオームの生成です。
基本的な森林バイオーム ジェネレータを作成するには、次の手順を実行します。
このサンプルでは、Fab でダウンロードした Megascans Trees:セイヨウシデ コレクションのマテリアルとスタティックメッシュを使用しています。
レベルを作成する
Unreal Engine で新規プロジェクトを作成します。
基本レベル テンプレートを使用して新しいレベルを作成します。 レベルを保存します。
Floor スタティックメッシュを削除し、ランドスケープ モードを使用して、レベルに新しいランドスケープを追加します。
スカルプト ツールを使用して、ランドスケープにバリエーションを加えます。
PCG ボリュームを作成する
[Selection (選択)] モードに戻り、表示されていない場合は [Place Actors (アクタを配置)] ウィンドウを有効にします。
クラス検索ボックスを使用して、PCG Volume を見つけ、レベルに 1 つ追加します。
PCG ボリュームを X=8.0、Y=8.0、Z=8.0 にスケールします。
PCG Graph アセットを作成する
コンテンツ ドロワーまたはコンテンツ ブラウザ内を右クリックして [Create Advanced Asset] > [PCG] に移動し、[PCG Graph] を選択します。
新しいアセットに「PCG_ForestGen」という名前を付けて、Enter キーを押します。
PCG_ForestGen をダブルクリックして、PCG グラフ エディタを開きます。
PCG コンポーネントを接続する
エディタ ビューポートまたはアウトライナーで、PCG ボリュームを選択します。
[Details (詳細)] パネルで、[PCG Component (PCG コンポーネント)] をクリックします。
グラフ ドロップダウンをクリックし、リストから PCG_ForestGen を選択します。
ポイントを作成する
PCG グラフ エディタ ウィンドウで、Get Landscape Data ノードをグラフに追加します。
Get Landscape Data の出力からドラッグし、Surface Sampler ノードを追加します。
Surface Sampler を選択し、D キーを押して、デバッグ レンダリングに切り替えます。
エディタのウィンドウに戻り、PCG ボリュームを選択して、[Details] パネルの [Generate] ボタンをクリックします。
これで、エディタのビューポートに生成されるポイントが表示されるようになりました。 ポイントは、ランドスケープの形状に一致しています。
バリエーションを加える
PCG グラフ エディタで、Surface Sampler を選択します。
[Details] パネルで Points Per Square Meter、Points Extents、Looseness の各プロパティを調整して、ポイントを追加します。
[Points Per Square Meter] を「0.15」に調整すると、空間にさらにポイントが追加されます。
Points Extends プロパティは、各ポイントの境界の大きさを制御します。 [X]、[Y]、[Z] の値をそれぞれ 50 に変更します。
Looseness プロパティは、生成されたポイントがグリッド形状にどれだけ忠実に一致しているかを決定します。 Looseness の値は 1.0 のままにしておきます。
次に、Transform Points ノードを追加します。 このノードは、定義された範囲でポイントに追加の移動、回転、およびスケールの変更を行います。 Surface Sampler ノードの Output ピンを Transform Points ノードの Input ピンに接続します。
Surface Sampler ノードで [Debug Rendering] を無効にし、Transform Points ノードで [Debug Rendering] を有効にします。
回転にバリエーションを加えるには、[Max Rotation (最大回転)] の [Z] 値を「360」に変更します。 これにより、すべてのポイントが 0~ 360 度の間でランダムに回転するようになります。
PCG グラフはポイントをスポーンし、ランドスケープの通常の方向と一致するようにポイントを回転させます。 [Absolute Rotation (絶対回転)] チェックボックスをオンにすると、この追加の回転を無効にすることができます。
サイズのバリエーションを追加するには、[X]、[Y]、[Z] の [Scale Min (スケール最小)] の最小値を「0.5」に設定します。 [X]、[Y]、[Z] の [Scale Max] の最大値を「1.2」に変更します。
最終結果では、十分なバリエーションを備える一連のポイントが生成されます。
スタティックメッシュをスポーンする
PCG グラフ エディタで、Static Mesh Spawner ノードをグラフのビューポートに追加します。 Transform Points ノードの Output ピンを Static Mesh Spawner の Input ピンに接続します。
Static Mesh Spawner を選択します。
[Details] パネルで、[Mesh Entries (メッシュ エントリ)] オプションを特定し、[+] ボタンをクリックして、スポーンするスタティックメッシュを追加します。
[Mesh Entries] の横にある下向き矢印をクリックして、配列を開きます。
[Index [0]] の横にある下向き矢印をクリックします。
[Descriptor (記述子)] の横にある下向き矢印をクリックします。
[Static Mesh (スタティックメッシュ)] のドロップダウン メニューをクリックして、スポーンしたい樹木を選択します。 この例では、SM_EuropeanHornbeam_Forest_01 を使用します。
配列内の各メッシュ エントリの Weight プロパティを使用して、スタティックメッシュを追加することで、バリエーションのバランスをとることができます。 Unreal Engine は、すべてのスタティックメッシュ エントリのウェイト値を加算し、その数値をそれぞれのウェイトで除算して、各エントリがスポーンする確率を決定します。