BLOGブログ

2023.06.21UE5

[UE5] PCGの特徴と使い方

執筆バージョン: Unreal Engine 5.2

こんにちは、アートディレクターのくろさわです。
みなさん、プロシージャルしてますか?

昨今のゲームは高品質なアセットを大量に作る必要があるため、ますますプロシージャル技術を切り離すことができなくなってきました。

そんななか Unreal Engine 5.2 にはプロシージャルコンテンツ生成フレームワーク( Procedural Content Generation Framework )(以下 PCG )という新たな機能が追加されました。

PCG はルールを作成し、そのルールに沿って植物などを大量に配置することができます。そう聞くと Unreal Engine にこれまで搭載されていた Foliage とはどう違うのか、気になる方も多いと思います。

今回は作例を作ってみましたので、まずはその作り方を解説し、最後にまとめとしてこれまでのツールとの比較という形で解説したいと思います。

PCGを有効にする

PCG はまだ実験的機能です。
PCG を使うにはプラグイン設定から以下のプラグインを有効にしてください。チェックボックスでプラグインを有効にしたらエンジンの再起動を行ってください。

PCG を作成する

PCG を作成するにはコンテンツブラウザの Add ボタンから Create Advanced Assets > PCG > PCG Graph を選択してください。

       

作成した PCG Graph を開き、 Input ノードを下部の矢印をクリックしてオプションを開き、 Landscape の項目と、作成した Surface Sampler を接続してください。 Surface Sampler を右クリックして Debug を有効にしてください。

レベルに Landscape を配置し、 PCG Graph を Landscape に触れるように配置すると、 PCG が触れている Landscape に白黒の箱が配置されます。この箱はあくまでもプレビューですが、この箱の数だけメッシュを配置することができ、箱それぞれが座標などの値(アトリビュート)をもっています。

PCG の上部のタブから No Debug object selected と書かれている項目をプルダウンで変更し、現在の PCG Graph 名 / PCG Compornet を選んでください。ノードを右クリックして Inspect と選ぶと、そのノード時点の配置ポイントの持つアトリビュートが表示されます。

それでは実際にメッシュを配置してみましょう。 Static Mesh Spawner を作成し、 Mesh Entries の項目に樹木などを登録してください。箱ではなく設定した樹木が配置されました。( Hierarchical Instanced StaticMesh で配置されてます)

 

木の大きさや配置が揃いすぎているので調整してみましょう。
Density Filter というノードを使うと、Dencity というアトリビュートを閾値につかって配置ポイントを削除することができます。また Transform Points というノードを使うことでトランスフォームのアトリビュートにランダムな値を加えることができます。ここではスケールをランダムにしました。

 
このように、様々なアトリビュートを加えて配置されるメッシュの情報に変化を加えるのが PCG の基本になります。
Houdini を使っている方は、 Copy To Point みたいなものだといえばすぐに理解できるでしょう。

PCGを応用する

もう少し様々な情報にアクセスして複雑なサンプルを作ってみました。
ハート型の湖とその周辺に森があり、空には島が浮いていて、黄色っぽい草が茂っています。

樹木の配置

Landscape にポイントを均一に配置したあと、 Sample Landscape ノードで特定の Landscape レイヤーだけ残して削除します。この作例では、草の生えている見た目の部分だけ残しました。

ハート型のスプラインの内部に  Spline Sampler でポイントを配置して、 Landscape の高さに Projection ノードでフィットさせます。 Landscape 上の配置ポイントからハート型の配置ポイントを Distance で Dencity をとり、 Dencity Filter で削り取ります。

大きさや配置位置のノイズを加えて、 StaticMesh Spawner で配置します。 StaticMesh Spawner には複数のアセットをそれぞれどんな頻度で発生するか設定することができます。

空島の配置

Volume Sampler で PCG の空間内に均一な密度でポイントを配置します。 Surface Sampler で Landscape を取得し、 Distance で Landscape との距離を取ります。 Dencity Filter で低い値をカットすることで、地面に近い場所は削除し、このポイントを空島の発生源として使います。

Create Points Grid で グリッド状にポイントを配置して、先程の発生源ごとにグリッドポイントを配置して、ランダムに移動して間引くことで不定形だけど偏りのある発生源をつくり、そこに空島のメッシュを配置します。グリッドが平面なので、各空島で高さは揃っています。

空島に使ったメッシュと同じモデルに Mesh to Point でポイントを配置します。それを空島の位置に Copy Point で配置します。

Normal To Dencity で上向きの面にだけポイントを残します。 Copy Point で、空島の面の向きを継承しているため、空島の上向きの面にだけポイントを残すことができます。これを空島の草の発生源とします。

これまでの機能との比較

PCG はランドスケープ、スプライン、メッシュなど様々なアクターの情報を使って複雑な配置ができることがわかりました。これまでも Unreal Engine には様々な配置機能が入っていますので、あらためて各機能の特徴を記載してみます。

Foliage

Foliage Type にアセットを登録することで、アクターや Landscape 上に簡単に配置できます。ブラシで感覚的に配置したりそれぞれの位置の調整を自由に変更できますが、自動化の設定は密度くらいしかないので、広い面積を自動的に埋めるのは(品質的に)難しいです。

[UE4] Foliageを使って背景に木や岩を並べる手順

Landscape Grass

マテリアルの Grass ノードで  Landscape のマテリアルレイヤーの種類を指定することで、特定の Landscape レイヤー上に、自動的にアセットを配置できます。マテリアルが設定してあると自動的に配置できる点は便利ですが、設定が少なく名前の通り草の配置専用と思ったほうがよいです。

[UE4] Landscape Grassを使ってみよう。

コンストラクションスクリプト

Actor Blueprint でのレベル生成時に実行する特別なイベントです。スプライン上に並べるなどのプロシージャルな処理を作ることができます。自由に処理がかけるのでできることは多いですが、Blueprint の外の要素( Landscape など)との連携が難しいです。

[UE4] コンストラクションスクリプトでお手軽にプロシージャルなアクターを作る

Houdini Engine

メッシュ、ランドスケープ、スプラインなどの様々なデータを受け取り、 Houdini で処理を行なって Unreal Engine にデータを返すことができます。メッシュの生成、ランドスケープの生成、 Instanced StaticMesh の配置など何でもできますが、別のツールにデータを移動するため、 Unreal Engine の中で完結する機能に比べ生成するのにデータの転送時間がかかります。
別途、 Houdini を購入する必要があります。

[UE4]Houdini Engineの紹介

新しい機能が増えたことで、どの機能で実装するべきか、再検討が必要になりますね。
ではまた。