プロシージャル コンテンツ生成フレームワーク (PCG:Procedural Content Generation Framework) は、Unreal Engine 内で独自のプロシージャル コンテンツおよびツールを作成するためのツールセットです。PCG は、迅速で反復的なツールと、建造物やバイオームの生成といったアセット ユーティリティから、ワールド全体に至るまでのあらゆる複雑度のコンテンツをビルドする機能を、テクニカル アーティスト、デザイナー、およびプログラマーに提供します。
重要な概念と用語
- ポイント: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 (PCG グラフ)] を選択します。
- 新しいアセットの名前を選択して、Enter キーを押します。
PCG グラフを編集する
PCG グラフ エディタを使用して、PCG Graph アセットを設定および編集することができます。エディタの操作は、ブループリントまたはマテリアル エディタに似ています。また、いくつかの PCG 固有のツールやパネルも含まれています。
番号 | 説明 |
---|---|
1 | ツールバー |
2 | ノード パレット |
3 | ビューポート |
4 | Details (詳細) パネル |
5 | デバッグ ツリー |
6 | 属性リスト |
ブループリントでの作業と同様に、ノード パレットからビューポートにノードをドラッグするか、コンテキスト メニューを使用して、グラフにノードを追加することができます。
グラフが PCG コンポーネントに割り当てられ、コンテンツの生成に使用されている場合は、PCG グラフに行われた変更が、エディタのビューポートでリアルタイムに更新されます。
PCG ノード
PCG グラフは、一連の PCG ノードで構成されており、各ノードが最終結果に貢献する演算を実行します。
これらのノードは、次のカテゴリに分かれています。
カテゴリ | 説明 |
---|---|
Blueprint (ブループリント) | ブループリント関連のノードが含まれます。これには、PCGBlueprintElement から派生したユーザー ブループリントを実行するための一般的なノードが含まれます。 |
Control Flow (制御フロー) | グラフを通じてロジックのフローを制御するノードを含みます。 |
Debug (デバッグ) | デバッグに役立つノードが含まれます。 |
Density (密度) | ポイントの密度に影響するノードが含まれます。 |
Filter (フィルタ) | 基準に基づいて、またはポイント単位でデータをフィルタするノードが含まれます。 |
Generic (汎用) | データに影響するノードが含まれますが、空間データは含まれません。 |
Hierarchical Generation (階層生成) | Hierarchical Generation モードを制御するためのノードが含まれます。 |
Input Output (入出力) | Alembic およびその他の外部データをロードするためのノードが含まれます。 |
IO | 外部データとのインタラクションを制御するノードが含まれます。 |
Metadata (メタデータ) | ポイントの属性であるか、属性セットの属性であるかを問わず、属性を操作するノードが含まれます。 |
Param (パラメータ) | アクタまたはブループリント変数からのパラメータの取得を制御するノードが含まれます。 |
Point Ops | ポイントおよびそのプロパティに影響するノードが含まれます。 |
Sampler (サンプラ) | ボリューム、サーフェス、メッシュなど、空間データのソースからポイントを生成するノードが含まれます。 |
Spatial (空間) | データ間の空間的な関係を作成したり、内部の空間データを変更したり、データを取得したりするノードが含まれます。 |
Spawner (スポナー) | 新しいデータを作成したり、指定された位置にアクタを配置したりするノードが含まれます。 |
Subgraph (サブグラフ) | サブグラフの使用を処理するノードが含まれます。 |
ブループリントと同様に、グラフの可読性を高めるために、コメント と Reroute ノード を追加することができます。
属性およびメタデータ
属性は変数に似ており、名前と型で定義されるデータを格納します。属性には次の 2 つのタイプがあります。
- 静的属性:固定され、常に存在する属性です。
$Position
などのように$
で始まります。 - 動的属性:ランタイム時に作成され、グラフ データの メタデータ の一部として格納される属性です。
属性セレクター
いくつかの 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 |
Rotation (回転) | クォータニオン |
ローテータ | |
Pitch (ピッチ)、Yaw (ヨー)、Roll (ロール) | Double |
Forward (前)、Right (右)、Up (上向き) | Vector3 |
クォータニオン | |
Support Vector extractor (サポート ベクター エクストラクタ) | Vector |
Support Rotator extractor (サポート ローテータ エクストラクタ) | ローテータ |
C++ 設定のオーバーライド
一部の設定は、C++ プロパティ メタデータで PCG_Overridable としてマークが付けられます。ブループリント ノードの場合は、表示されていてインスタンスが編集可能な変数はオーバーライドできます。
オーバーライドされると、ピンが自動的に詳細ピンとしてノードに追加されます。ピンには次の 2 つのタイプがあります。
- グローバル オーバーライド:任意の数の属性を受け入れて、設定名と完全一致する各属性のすべての設定をオーバーライドします。
- 単独オーバーライド:任意の数の属性を受け入れて、設定名と完全一致する属性や、属性が 1 つしかない場合はどの名前でも、特定の設定をオーバーライドします。
属性型は一致する必要がありますが、一部の型は変換できます。
完全一致する名前や型を確認するには、オーバーライド ピンのツールチップを使用します。
グラフ パラメータ
マテリアル エディタのパラメータと同様に、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 コンポーネントに接続するには、次の手順を実行します。
- エディタのビューポートまたは アウトライナー で、接続先の PCG ボリューム または ブループリント クラス を選択します。
-
[Details] パネルで、[PCG Component (PCG コンポーネント)] をクリックします。
-
[Graph (グラフ)] ドロップダウンをクリックして、使用したい PCG ノード グラフを選択します。
-
[Generate (生成)] ボタンをクリックして、結果を確認します。
PCG でデバッグを行う
デバッグは、PCG ワークフローに欠かせないプロセスです。
各ノードには、PCG グラフの各ステップでポイント データを視覚化するために使用できる、次のデバッグ オプションがあります。
- Debug Rendering (デバッグ レンダリング)
- Enable / Disable node (ノードの有効化/無効化)
- Inspect (調査)
ノードの [Details] パネルで [Debug (デバッグ)] チェックボックスをオンにするか、D キーを押して、各ノードで [Debug Rendering] のオン/オフを切り替えます。
各ノードのオン/オフを切り替えるには、ノードの [Details] パネルで [Enabled (有効)] チェックボックスをオンにするか、E キーを押します。
また、ノードを調べることで、ノードが生成するすべてのポイントを 属性 リストに表示することができます。
- デバッグ ツリーから PCG コンポーネントを選択します。
- 調べたいノードを右クリックします。
- [Inspect (調べる)] を選択します。または、A キーを押すこともできます。
シンプルな森林ボリュームを作成する
プロシージャル生成ツールの一般的な使用例は、オープンなワールド環境でのバイオームの生成です。
基本的な森林バイオーム ジェネレータを作成するには、次の手順を実行します。
このサンプルでは、マーケットプレイスでダウンロードした Megascans Trees:セイヨウシデ コレクションのマテリアルとスタティックメッシュを使用しています。
レベルを作成する
- Unreal Engine で 新規プロジェクトを作成 します。
- [Basic (基本)] レベル テンプレートを使用して、新しいレベルを作成 します。レベルを保存します。
- 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 Volume] を選択します。
- [Details] パネルで、[PCG Component] をクリックします。
-
[Graph] ドロップダウンをクリックし、リストから PCG_ForestGen を選択します。
ポイントを作成する
- PCG グラフ エディタ ウィンドウで、Surface Sampler ノードをグラフに追加します。
-
Input ノードの下向き矢印をクリックして展開し、Landscape アウトプットを Surface Sampler の Surface インプットに接続します。
- 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 (絶対回転)] チェックボックスをオンにすると、この追加の回転を無効にすることができます。
-
サイズにバリエーションを追加するには、[Scale Min (スケール最小)] の [X]、[Y]、[Z] の値をそれぞれ「0.5」に変更します。[Scale Max (スケール最大)] の [X]、[Y]、[Z] の値をそれぞれ「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 は、すべてのスタティックメッシュ エントリのウェイト値を加算し、その数値をそれぞれのウェイトで除算して、各エントリがスポーンする確率を決定します。