1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UE5 Cassini Sampleの使い方とPCG Data Assetに基づいた生成ワークフロー

1
Posted at

1 はじめに

今回は、Epic GamesのCassini Sampleプロジェクトにおける宇宙ステーションのPCGシステムの仕組みと設定を記録し、そして別のメッシュを生成に使うための、アセットの準備を含めてPCG Data Assetに関するワークフローも紹介したいと思います。

Screenshot 2026-02-26 232350.png

Screenshot 2026-02-26 170751.png

1.1 背景

Unreal EngineのCassini Exampleは、PCGフレームワークのさまざまな新機能や高度な機能の応用を展示しているサンプルですが、最初に目に留まったのは、やはりこの公式サムネイルです。

Screenshot 2026-02-26 223938.png

無重力の宇宙ステーション空間に物が散乱している様子やダイナミックなライティングは、間違いなくPCGの良い活用例です。

実際に触ってみたくてプロジェクトをダウンロードじ、Demoレベルを開いたら、確かに例の宇宙ステーションがあります。

Screenshot 2026-02-26 232112.png

ですが、中身をチェックしようと、

Screenshot 2026-02-26 231530.png

「…なんか違くない?」という感じでした。

Epic Gamesの公式サンプルは基本的にドキュメンテーションが充実していますが、このプロジェクトは珍しくあまり説明がありません。唯一のリソースは、このUnreal Fest Seattle 2024での講演です。

動画の解説に沿って、ようやくイメージ通りのシーンをセットアップできました。

講演はやや長尺なので、ここで調整手順をまとめてメモします。お役に立てれば幸いです。

また、別のアセットを生成したい場合、このサンプルのワークフローに必要なLevel InstanceとPCG Data Assetの作成やパラメータの設定の流れも紹介します。この方法により、PCGシステムにおける多種プロップの管理と生成の効率向上が期待できます。

環境

Windows 11 25H2
Unreal Engine 5.7.3

2 宇宙ステーションのセットアップ

2.1 「All Hell Break Loose」モード

結論から言うと、無重力状態をコントロールするのは、宇宙ステーションのPCG Graph「Grammar」にある「All Hell Break Loose」というBoolパラメータです。

PCG ComponentのDetails欄で「All Hell Break Loose」を有効にしてtrueに設定すると、すぐに変化が見えます。

Screenshot 2026-02-28 163222.png

Screenshot 2026-02-26 232350.png

具体的に、このBoolをtrueにすると、PCG Graphはいくつかの点で変わります。

まずはプロップ生成位置のサンプリング方式です。元の状態では、World Raycastノードを使ってステーション船体の形状を取得します。そして、床部分のポイントに対して、両サイドとの距離からウエイトを付けます(加重します)。

Screenshot 2026-03-01 130504.png
Raycast
Screenshot 2026-03-01 130645.png
Signed Distance

最後に、AttractノードとSelf Pruningノードでプロップを集め、重なったプロップを除去します。

Screenshot 2026-03-01 130743.png
Attract
Screenshot 2026-03-01 130801.png
Self Pruning

一方、All Hell Break Looseをオンにしたら、PCGポイントは船体上だけではなく、船内空間全体を埋めます。これで無重力状態を表現できます。

Screenshot 2026-03-01 132007.png
Point Grid

加えて、All Hell Break Looseモードでは、メインライティングの強さが下がり、青色と赤色の警告灯ActorとNiagara Systemが生成されます。これにより、よりダイナミックなビジュアル演出に役立ちます。

Screenshot 2026-03-01 132148.png

2.2 Shape Grammar

もう一つの違いは、Demoイメージと比べると、プロジェクト内の宇宙ステーションはサイドドアなどがなく、壁だけで構成されます。見た目はちょっと単調な感じです。

Screenshot 2026-02-26 232350.png
Screenshot 2026-02-26 170655.png
ドアなし/ドアあり

その原因は、PCG GraphのGrammar定義で全種類の構成パーツを使っていないためです。PCGシステムのShape Grammarは、特定の文法でPCGにおける生成のルールや頻度を定められる、UE5.5からの新機能です。Epic Gamesのドキュメンテーションで文法の一覧を確認できます。

現在のPCG ComponentのGrammarパラメータを確認すると、こんな感じです。

EndA,Straight*,EndB

Screenshot 2026-02-26 232420.png

つまり、両端は貫通しないパーツで、中間はドアなしのパーツを0回以上繰り返します。ドアが付いているアセットは使っていません。

Asset Zooから使用可能のアセットを選択し、「ModuleInfo」Componentから、このModuleのSymbol名を確認できます。右側ドアのDoorR、左側ドアのDoorL、両側のDoorD三種類があります。この3つをGrammar表現に追加します。

Screenshot 2026-02-27 021441.png

EndA,{Straight,DoorL,DoorR,DoorD}*,EndB

{ }」は括弧内のModuleをランダムに選択するの意味で、後ろの「*」でこのランダム配置を0回以上繰り返すことを表します。

再生成すると、全種類のModuleが生成されました。このPCG Graphはドアがある位置で自動的にSide RoomのModuleを配置する仕組みがありますので、それらも一斉に生成されました。

これで、公式サムネイルと同じビジュアル表現を再現できました。

Screenshot 2026-02-27 021734.png

3 Data Assetを使用したPCG生成

さて、これを基に、生成するアセットを変えて試しましょう。

Screenshot 2026-02-26 170751.png

従来のPCGシステムでは、使用したいアセットを変更する場合、Static Mesh Spawner/Actor Spawnerに新しいアセットを設定すればいよいです。しかし、Cassini Sampleでは、PCGの新機能であるData Assetを用いています。そのため、生成可能なModuleや、ModuleのメッシュとMaterialのオブジェクト参照などはData Assetから読み込む形なので、まずはPCG Data Assetの更新または作成が必要です。

この点から見ると、Data Assetの利用により、作業の手間を増やしてしまいます。それなら、なぜEpic Gamesはこのワークフローを推奨するのでしょうか?

個人的な理解でまとめると、PCG Data Assetを使用するのメリットは以下のとおりです。

1. 生成に利用するプロップの情報(アセット参照、サイズ、タグ、カスタム情報など)を一括でData Assetに保存し、後ほどPCG Graphで一括で読み取ることができます。PCGポイント上に一つ一つ手動でAttributeを追加する必要がなくなります。

2. プロップのデータを利用したPCGポイントの配置・調整ができます。従来の方法ではSpawn Static Mesh・Actorの前に、実際メッシュのサイズや形の情報が分かりません。そのため、ポイントのExtentを繰り返し調整するが必要がある可能性があります。Level InstanceからPCG Data Assetを生成すると、メッシュの情報をポイント上に予め付けられます。Cassini Sampleでは、プロップのサイズをポイントのExtentに設定し、それを使ってSelf Pruningで重なりを除去します。さらに、本サンプルのプロップは汎用のメッシュで組み立てたもの(いわゆる「キットバッシング」方式)なので、PCG Data Assetに各構成メッシュのBoundと位置まで記録しているので、より精密な計算が可能になります。

3.1 PCG Data Assetワークフローの流れ

1. Static MeshからLevel InstanceとPCG Data Assetを作成

LevelからしかPCG Data Assetを作れないので、まず最初はStatic MeshからLevel Instanceを作成します。レベル内でStatic Meshからプロップを組み合わせて(KitBash)、右クリックしてLevel→Create Level Instanceを選択し、Level Instanceアセットを保存します。

今回は展示のため、シンプルなキューブと球体のStatic Meshを使用して作成します。

Screenshot 2026-02-27 023253.png
Screenshot 2026-02-26 170104.png

そして、Content Browserで作成したLevel Instanceを右クリックし、Asset Actions→Create PCG Assets from Level(s)を選択してアセットを保存します。このアクションにより、Level Instance内にあるメッシュと配置の情報をPCGシステムが読み込める形でData Assetに書きます。つまり、PCGがこのData Assetを参照すると、Level Instanceと同じようなプロップを生成することができます。

Screenshot 2026-02-26 170308.png
Screenshot 2026-03-01 134826.png

2. Level Instance ActorにデータComponentを追加

プロップごとのData Assetを作成しましたが、PCGシステムはまだ全体的にどんなプロップが利用できるかを把握していません。そのため、もう一つ、利用したいすべてのプロップの情報とData Assetへの参照を持つData Assetが必要です。

それを作るため、Level Instanceにこれらのデータを付ける必要があります。Cassini Sampleでは、「ModuleInfo」というカスタムComponentを利用していますが、最低限の名前とPCG Data Asset参照があれば、自作のComponentで他のパラメータ情報は実際の需要に合わせても構いません。

先で作ったLevel Instanceをレベル内に配置します。これでLevel Instanceアセットを自動的にALevelInstance Actorに変換し、Componentも追加できるようになります。ActorのDetails欄でAdd→ModuleInfoでComponentを追加します。

Screenshot 2026-02-26 170202.png

追加されたComponentを選択して、Moduleの情報を記入します。SymbolにShape GrammarでこのModuleを指す用の名前を入れて、PCGData AssetでこのModuleのData Assetを選択します。PivotとTiling AxisはModuleの状況に基づいて記入します。Sizeは実際の大きさではなく、PCG Graphで生成する時このModuleの相対的出現確率を定義するパラメータです。

Screenshot 2026-02-26 170429.png
Screenshot 2026-02-26 170459.png

3. PCG VolumeとKitBuilder Graphを配置

データの入力が完成したら、次のステップはPCGを用意したプロップとそれぞれの情報をPCGに読ませ、PCG Data Assetに出力します。

レベルにPCG Volumeを追加します。使用したいプロップのLevel Instance ActorをすべてこのVolumeの中に配置します。PCG ComponentのGraphで、KitBuilderを選択します。

Screenshot 2026-03-01 150647.png
Screenshot 2026-02-28 191438.png

KitBuilder PCG Graphの処理は、基本的にVolume内のLevel Instanceを読み込んで、ModuleInfo Component上のデータを取得して、PCG Pointにするという感じです。もし別のカスタムComponentを使用したい場合は、Get Actor DataノードのComponent Selection Classも、それに合わせて変更する必要があります。

Screenshot 2026-02-28 191537.png
Screenshot 2026-02-28 191615.png

4. プロップリストData Assetを作成

KitBuilderのDetailsに、Asset Nameを設定し、Exportをオンにします。これでPCG Graphを実行したら、PCG Data Assetが生成されます。

Screenshot 2026-02-28 191657.png

5. PCG GraphでData Assetを読み取り

Grammar Graphに戻り、#6の部分にある「Load PCG Data Asset」ノードを元のPropsTableから新しく作成したData Assetに変更します。

Screenshot 2026-02-26 170717.png

新しいプロップを用いて生成したことが確認できます。

Screenshot 2026-02-26 170751.png

4 終わりに

Cassini SampleをきっかけにPCGの新機能とワークフローを触ってみました。Data AssetとShape Grammarにより、多種のアセットからルールに沿った環境づくりが効率的になり、今後も活用したいと思います。

また、Cassini Sampleでは、ジオメトリ処理とGPU計算の機能も展示されているので、そちらについて今後も学びたいと思います。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?