Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE5 PCG(Procedural Content Generation)ガッツリ入門

少し前にUE5.2が正式にリリースされました!!

docs.unrealengine.com

様々な新機能が追加される中、特に注目度が高いのがPCG(Procedural Content Generation)です。PCGとはプロシージャルにメッシュを配置しますが、配置ロジックを一定ルールで行えるようにノードグラフでロジックを制作可能な新機能です。

こちらの機能ハイライトでも最初の部分で大きく取り上げられています。
www.youtube.com

凄いことが出来そうな気がするPCGですが、現状ではその使い方が難しそうに思う人が多そうです。今回はなるべく簡単にPCGをしっかり使える基礎的な部分までを解説していきたいと思います。

それでは早速触っていきましょう!

プラグインをオン

まず最初にPCG用のプラグインをオンにする必要があります。
『Procedural Content Generation Framework』と『Procedural Content Generation Framework Geometry Script Interopプラグインをオンにしておいてください。プラグインをオンにしてエディター再起動することで利用可能になります。


地形の準備

現状でPCGはランドスケープ上でしか動作しないようです。なので、簡単なランドスケープでもいいので作成を行いましょう。左上メニューから『ファイル』→『新規レベル』→『Open Wolrd』で生成される地形が最初からランドスケープになっているので、とりあえずであればそれで十分です。

アクタを配置パネルから『PCGVolume』アクターを適当な位置に配置し、サイズを少し大きめに調整します。PCGはこの『PCGVolume』の範囲内にのみ効果が発生しますので、必要に応じてサイズを調整しましょう。

コンテンツブラウザから新規アセットを制作で『PCG』→『PCGグラフ』を選択し、PCGアセットを作成します。

PCGVolumeアクターを選択し、コンポーネント一覧から『PCGComponent』を選択して、『Graph』に先程制作した『PCGグラフ』アセットを設定しておきます。

これで地形用の初期設定準備が完了しました!ここからいよいよPCGを触っていきます。

PCGグラフの基本の使い方

PCGグラフアセットを開くとブループリントなどのノードグラフと似たような画面になります。また基本的なノード操作についてはブループリントエディターとも同様なので解説しません。

今回特に重要なノードをいくつか紹介していきます。まず最初に使うのがInputノードですが▽から隠れているピンを表示すると、『Landscape』ピンと『Landscape Height』ピンが出てきます。これはランドスケープの情報を取得することが可能ですが、前者と違い、後者はランドスケープの高さ情報のみを扱うので、今回は使用しません。

次に『Surface Sampler』ノードです。このノードは名前の通りSurface(面)をサンプリングし、そのポイント情報を使って様々な効果を与えることが出来ます。また設定の中にはいくつか重要なプロパティがあります。

Points Per Squared Meter → 平方メートルあたりのポイント数を指定します。数値が大きいほど生成メッシュが多くなります。
Point Extents → ポイント辺り範囲の大きさです。配置メッシュサイズに合わせたサイズで調整することになります。
Looseness → ポイントの配置をよりルーズ(不均等)な配置にします。数値が多いとより不均等になりポイント数も減少します。

ひとまず下記のように配置してみます。

ここで『Surface Sampler』ノード左上の水色アイコンがついていることに気づきます。これはPCGグラフのデバッグモードで、ノード選択時に"D"キーを押すことでトグルすることができます。この機能を使うことで、現在サンプリングされているポイントを可視化してくれるので、PCGで制作中に非常にお世話になりますので、ぜひ覚えておきましょう。

デバッグモードをオンにしてビューポートを確認すると以下のようになっています。

もうひとつのデバッグ機能として、ノードの有効化、無効化切り替えを"E"キーで切り替え可能です。こちらもPCGで制作中、非常に良く利用する機能となりますので覚えておきましょう。

次に『Transform Points』ノードです。これは名前の通りポイント毎のトランスフォームを変化させるノードです。

Offset Min,MaxとRotation Min,MaxとScale Min,Maxなどを個別に設定可能です。以下のような設定を入力すると、

ポイントの配置が変化し、よりランダム性の高いものへと変化していることがわかります。

あとはこれらを実際に配置するメッシュに変化させます。これは『Static Mesh Spawner』ノードで行うことが可能です。メッシュを指定する場合には『Mesh Entries』から配列を1つ追加し、追加インデックス番号の『Descriptor』内の『Static Mesh』からメッシュを指定可能です。

ここまでで、PCGグラフの基本の使い方は完了です!これだけでも十分PCGが活用できますが、この後はもう少し配置ロジックの制御を行ってみましょう。

Bounds ModifierとSelf Pruning

ここまでである程度配置はできましたが、もし複数のメッシュを配置したり、同じメッシュ同士が重なりあうようなことがある場合、対処しなくてはなりません。そこで使うのが『Bounds Modifier』ノードと『Self Pruning』ノードです。

Bounds Modifierはポイントのバウンズ(境界)を変化させます。バウンズはメッシュ同士が重ならないように判定に使われる範囲だと思ってください。例えば何も考えずに大量のポイントを配置すると、バウンズが重なってしまいます。

これをBounds Modifierで調整することが可能です。

これでメッシュ境界の重なりは少なくなりました。しかしこれでもまだ一部の境界は重なっているようです。そこで登場するのが『Self Pruning』ノードです。このノードは名前の通り自己剪定(自身で重なったもの同士を取り除く)することが可能です。

『Pruning Type』で『Large to Small』や『Small to Large』を選択することで重なったもので取り除く側を大きいものにするか、小さいものにするかなどの選択が可能が可能です。これで重なっているものをかなり取り除くことができました。

Differenceで比較

最後に重要となるのが、『Difference』ノードです。このノードは名前の通り比較を行い、比較条件に指定したポイントを取り除きます。

『Source』と『Differences』ピンにそれぞれ接続を行い、『Density Function』で指定した密度関数を使って比較を行います。密度関数は3つ選択がありますが『Binary』以外での選択では正しく動作しないようです。『Source』側と『Differnces』側でそれぞれ重なるポイントがあった場合、そこが取り除かれた結果を出力してくれます。

まずはDiffernceを指定しない状態での配置を確認してみます。重なりがわかりやすいようにシンプルなメッシュで配置しています。

画像のように一部メッシュが突き刺さっていることが確認できます。次にDifferenceで重なった部分を取り除いた場合です。

見事に少しでも重なっていた部分のメッシュが取り除かれていることがわかります!ただ全体的に密度が少し寂しくなっちゃいましたね。この辺りはやはり細かい調整が必要になりそうです。

以下がノード全体の画像です。

原理的にはこれだけで十分に様々な制御が可能なはずです!
あとはStatic Mesh Spawnerでメッシュを切り替えるだけで簡単に使えるはず!

動作が重くなってきた場合

PCGで大量のメッシュを配置すると、途端に重くなってくることがあります。この原因は大抵の場合メッシュ自体のコリジョンをスポーン時に判定されることが原因だそうです。もし気になる場合は、Static Mesh SpawnerのMesh Entries内で大量にスポーンしているメッシュで不要なコリジョンをオフにしておきます。

おそらくこれだけでもかなり軽くなるはずです。

ぜひPCGを使ってレベルデザイン作業をもっともっと効率的に行ってみましょう!

おまけ