記事ディレクトリ
主要記事
- 「UE5 "Electric Dreams" レベル PCGSettings ワークフローに基づく PCG テクノロジー分析」
- 「UE5 "Electric Dreams" プロジェクト PCG テクニカル分析 アセンブリの理解 (SplineExample を例として)」
上記のブログ投稿では、「Electric Dreams」プロジェクトのマクロ ワークフローとレベル構築の基本的な考え方について学び、次にこの「PCGDemo_Ditch」レベルを見てよく理解しました。
ファイルの場所: /Content/Levels/PCG/Breakdown_Levels/ElectricDreams_PCGDitchAssembly.umap
「PCGDemo_Ditch」レベルでは主に PCG のトリックを示します。
Points From Actor Tag
PCG のセグメンテーション ツールとしてカスタム ノードを使用する- 重ねて飾るアイデア
レベルの概要
PCGグラフ
PCG のセグメンテーション ツールとしてのアクター タグからのポイント
Points From Actor Tag
PCGDemo_Ditch レベルでは、アクター タグからの多くのポイントが使用されています。これは、独自のプロジェクトに直接移植できる非常に便利なカスタム ノードです。メイン ロジックを見てみましょう。中心となるのは、コンテキストを使用して実行することです。:
指定されたタグを持つすべてのアクタをシーン全体から取得し、その変換境界とスケール境界を使用して点群出力を形成します。GetActorBoundsPCG
もう一度具体的なロジックを見てみましょう。
GetActorBoundsPCG
FBox UPCGBlueprintHelpers::GetActorBoundsPCG(AActor* InActor, bool bIgnorePCGCreatedComponents)
{
return PCGHelpers::GetActorBounds(InActor, bIgnorePCGCreatedComponents);
}
およびそれが呼び出す GetActorBounds
FBox GetActorBounds(const AActor* InActor, bool bIgnorePCGCreatedComponents)
{
// Specialized version of GetComponentsBoundingBox that skips over PCG generated components
// This is to ensure stable bounds and no timing issues (cleared ISMs, etc.)
FBox Box(EForceInit::ForceInit);
const bool bNonColliding = true;
const bool bIncludeFromChildActors = true;
if (InActor)
{
InActor->ForEachComponent<UPrimitiveComponent>(bIncludeFromChildActors, [bNonColliding, bIgnorePCGCreatedComponents, &Box](const UPrimitiveComponent* InPrimComp)
{
// Note: we omit the IsRegistered check here (e.g. InPrimComp->IsRegistered() )
// since this can be called in a scope where the components are temporarily unregistered
if ((bNonColliding || InPrimComp->IsCollisionEnabled()) &&
(!bIgnorePCGCreatedComponents || !InPrimComp->ComponentTags.Contains(DefaultPCGTag)))
{
Box += InPrimComp->Bounds.GetBox();
}
});
}
else
{
UE_LOG(LogPCG, Error, TEXT("Actor is invalid in GetActorBounds"));
}
return Box;
}
上記のコードからわかるように、最も重要なことは、Actor
コンポーネントの BoundsBox を取得することでありUPrimitiveComponent
、それぞれはActor
複数のボリュームを保持できます。
このノードの一般的な方法は、レベルにいくつかを設定しVolume
、対応するタグを追加し、PCG で Tag によってこれらをフィルタリングしVolume
、それらのボリュームを除外することです。
下の図では、円形スプラインを使用して生成された溝があり、次にいくつかの「PCG_EXCLUDE」タグVolume
(さまざまなボリュームが使用可能) を使用して 2 つの穴を開けています。
アプリケーション例は「ElectricDreams_Env」にもあります。
層状の装飾
レイヤード装飾は PCG を構築する際の重要なアイデアです。PCGDemo_Ditch レベルでは、Ditch はプライマリからセカンダリまで次の 4 つの部分で構成されます。
-
溝の主題
-
木と石
-
溝と地面との接続
-
汚れの詳細
このレベルの PCG の階層構造のロジックは複雑ですが、理解するのは難しくありませんので、この記事では説明しません。
いくつかの知識ポイントとスキル
属性操作を使用して属性を一時属性にステージングする
衝突を発生させるかどうか
まとめ
PCGは本当に楽しいです、時間の関係、この記事は最初にここに書きます、間違いがあれば修正してください!