UE5 PCG Framework — 절차적 콘텐츠 생성
PCG Framework는 UE5 5.2에서 정식 도입된 노드 그래프 기반 절차적 콘텐츠 생성 시스템입니다. 포레스트, 도시 블록, 던전 등을 규칙 기반으로 자동 배치하고 월드 파티션과 통합되어 대규모 오픈 월드에서도 효율적으로 동작합니다.
1. PCG Graph 기본 구성
섹션 제목: “1. PCG Graph 기본 구성”PCGVolume(액터) → PCGComponent → PCGGraph(에셋)에디터에서:
Content Browser → 우클릭 → Miscellaneous → PCG Graph레벨에 PCGVolume 배치 → PCG Graph 에셋 할당2. 기본 노드 흐름
섹션 제목: “2. 기본 노드 흐름”[Surface Sampler] → [Density Filter] → [Static Mesh Spawner] ↓ ↓ ↓ 포인트 생성 밀도 기반 필터 메시 배치주요 노드:
| 노드 | 역할 |
|---|---|
Surface Sampler | 지형 위에 포인트 생성 |
Landscape Layer Sampler | 랜드스케이프 레이어별 포인트 |
Point Filter | 조건으로 포인트 걸러내기 |
Transform Points | 위치/회전/스케일 랜덤화 |
Static Mesh Spawner | 포인트에 메시 배치 |
Copy Points | 포인트 복제 |
3. C++ 커스텀 PCG 노드
섹션 제목: “3. C++ 커스텀 PCG 노드”#pragma once#include "PCGSettings.h"#include "MyCPPPCGNode.generated.h"
UCLASS(BlueprintType, ClassGroup=(Custom))class UMyCPPPCGSettings : public UPCGSettings{ GENERATED_BODY()public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Settings") float HeightThreshold = 500.0f;
#if WITH_EDITOR virtual FName GetDefaultNodeName() const override { return FName("Height Filter Node"); }#endif
virtual TArray<FPCGPinProperties> InputPinProperties() const override; virtual TArray<FPCGPinProperties> OutputPinProperties() const override;
protected: virtual FPCGElementPtr CreateElement() const override;};
// Element 클래스 (실제 실행 로직)class FMyCPPPCGElement : public FSimplePCGElement{protected: virtual bool ExecuteInternal( FPCGContext* Context) const override;};bool FMyCPPPCGElement::ExecuteInternal(FPCGContext* Context) const{ const UMyCPPPCGSettings* Settings = Context->GetInputSettings<UMyCPPPCGSettings>();
TArray<FPCGTaggedData> Inputs = Context->InputData.GetInputs();
TArray<FPCGTaggedData>& Outputs = Context->OutputData.TaggedData;
for (const FPCGTaggedData& Input : Inputs) { const UPCGPointData* PointData = Cast<UPCGPointData>(Input.Data); if (!PointData) continue;
UPCGPointData* OutputData = NewObject<UPCGPointData>(); OutputData->InitializeFromData(PointData);
TArray<FPCGPoint>& OutPoints = OutputData->GetMutablePoints();
// 높이 임계값 이하 포인트만 통과 for (const FPCGPoint& Point : PointData->GetPoints()) { if (Point.Transform.GetLocation().Z < Settings->HeightThreshold) OutPoints.Add(Point); }
FPCGTaggedData& Output = Outputs.Add_GetRef(Input); Output.Data = OutputData; }
return true;}4. 런타임 PCG 생성
섹션 제목: “4. 런타임 PCG 생성”// PCG 그래프를 런타임에 트리거UCLASS()class AProceduralForest : public AActor{ GENERATED_BODY()
UPROPERTY(VisibleAnywhere) UPCGComponent* PCGComponent;
UPROPERTY(EditAnywhere) UPCGGraph* ForestGraph;
public: void RegenerateForest() { PCGComponent->SetGraph(ForestGraph); PCGComponent->GenerateLocal(false); // true = 비동기 }
void CleanForest() { PCGComponent->CleanupLocal(false); }};5. 랜드스케이프 레이어 연동
섹션 제목: “5. 랜드스케이프 레이어 연동”[Landscape Layer Sampler] Layer: Grass (레이어 이름) Points Per Square Meter: 2.0 ↓[Transform Points] Scale: Random (0.8 ~ 1.2) Rotation: Random Z ↓[Static Mesh Spawner] Mesh Entries: - GrassMesh_01 (weight 0.6) - GrassMesh_02 (weight 0.4)6. 성능 최적화
섹션 제목: “6. 성능 최적화”// PCGComponent 설정PCGComponent->bActivated = true;PCGComponent->GenerationTrigger = EPCGComponentGenerationTrigger::GenerateOnDemand; // 요청 시만 생성
// 월드 파티션 연동 (대규모 오픈 월드)PCGComponent->bIsPartitioned = true;콘솔 변수:
pcg.DebugGraph 1 ; 노드별 실행 시간 표시pcg.GraphCache.Enable 1 ; 그래프 결과 캐시PCG Framework는 반복 배치 작업을 노드 그래프로 자동화하고 월드 파티션과 통합해 대규모 오픈 월드 콘텐츠 생성에 적합합니다. 기본 노드 조합만으로도 포레스트, 암석 분포 등 대부분의 자연 배치가 가능하며, C++ 커스텀 노드로 게임 특화 규칙을 추가할 수 있습니다.