UE5「Electric Dreams」プロジェクト PCG技術解析 PCGDemo_Ditchレベル詳細解説

主要記事

上記のブログ投稿では、「Electric Dreams」プロジェクトのマクロ ワークフローとレベル構築の基本的な考え方について学び、次にこの「PCGDemo_Ditch」レベルを見てよく理解しました。

ファイルの場所: /Content/Levels/PCG/Breakdown_Levels/ElectricDreams_PCGDitchAssembly.umap

「PCGDemo_Ditch」レベルでは主に PCG のトリックを示します。

  • Points From Actor TagPCG のセグメンテーション ツールとしてカスタム ノードを使用する
  • 重ねて飾るアイデア

レベルの概要

ここに画像の説明を挿入

PCGグラフ

ここに画像の説明を挿入

PCG のセグメンテーション ツールとしてのアクター タグからのポイント

Points From Actor TagPCGDemo_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 つの部分で構成されます。

  1. 溝の主題

  2. 木と石

  3. 溝と地面との接続
    ここに画像の説明を挿入

  4. 汚れの詳細

ここに画像の説明を挿入
このレベルの PCG の階層構造のロジックは複雑ですが、理解するのは難しくありませんので、この記事では説明しません。

いくつかの知識ポイントとスキル

属性操作を使用して属性を一時属性にステージングする

ここに画像の説明を挿入

衝突を発生させるかどうか

ここに画像の説明を挿入

まとめ

PCGは本当に楽しいです、時間の関係、この記事は最初にここに書きます、間違いがあれば修正してください!

おすすめ

転載: blog.csdn.net/hello_tute/article/details/131479774