PART 5 · 강의 2/3

BP 서브그래프

서브그래프 생성, Graph Instance, Graph Parameters, Execute Blueprint 노드로 PCG를 확장합니다.

01

서브그래프 기초

PCG Graph를 모듈화하여 재사용하기

서브그래프(Subgraph)는 PCG Graph 안에서 다른 PCG Graph를 호출하는 기능입니다. 복잡한 그래프를 모듈화하고, 공통 로직을 재사용하며, 팀 간 작업을 분리할 수 있습니다.

서브그래프 생성 방법

  1. Content Browser에서 별도의 PCG Graph 에셋 생성 (예: SG_ForestLayer)
  2. 서브그래프에 입력/출력 노드 배치 (Input, Output 노드)
  3. 메인 그래프에서 우클릭 → Subgraph 노드 추가
  4. Subgraph 노드의 Graph 프로퍼티에 생성한 에셋 할당
서브그래프 활용 구조
// 메인 그래프: MainForestGraph [Get Landscape Data] [Surface Sampler] [Subgraph: SG_CanopyLayer] // 수관층 서브그래프 [Subgraph: SG_UnderstoryLayer] // 중간층 서브그래프 [Subgraph: SG_GroundCover] // 지면층 서브그래프 // 각 서브그래프는 독립적으로 편집/테스트 가능 // 입력: Surface Sampler의 포인트 데이터 // 출력: 해당 레이어의 스폰된 메시
네이밍 컨벤션

서브그래프는 SG_ 접두사를 사용하는 것을 권장합니다. 예: SG_ForestLayer, SG_RoadDecoration, SG_BuildingModule. 메인 그래프와 명확히 구분되어 Content Browser에서 관리가 용이합니다.

02

Graph Instance와 Parameters

파라미터 오버라이드로 그래프 변형 만들기

Graph Parameters 정의

PCG Graph에 파라미터를 추가하면 외부에서 값을 오버라이드할 수 있습니다. 그래프 에디터 상단의 Parameters 패널에서 추가합니다.

파라미터 설계와 활용
// PCG Graph: ForestGenerator // Parameters 패널에서 정의: Parameters: TreeDensity: float = 0.05 // 나무 밀도 TreeMesh: SoftObjectPath // 나무 메시 MinScale: float = 0.8 // 최소 스케일 MaxScale: float = 1.3 // 최대 스케일 bSpawnUndergrowth: bool = true // 하층 식생 스폰 여부 // 그래프 내부에서 파라미터 참조: [Surface Sampler] Points Per Sq.Meter: $TreeDensity // 파라미터 바인딩 [Transform Points] Scale Min: ($MinScale, $MinScale, $MinScale) Scale Max: ($MaxScale, $MaxScale, $MaxScale) [Branch] Condition: $bSpawnUndergrowth

Graph Instance 활용

그래프 TreeDensity TreeMesh 용도
ForestGenerator (원본) 0.05 SM_Oak 기본 참나무 숲
GI_DenseForest 0.1 SM_Oak 밀집 참나무 숲
GI_PineForest 0.03 SM_Pine 희소한 소나무 숲
GI_TropicalForest 0.08 SM_Palm 열대 야자 숲
03

Execute Blueprint 노드

블루프린트로 커스텀 PCG 로직 구현하기

Execute Blueprint 노드는 PCGBlueprintElement를 상속한 블루프린트에서 커스텀 로직을 실행합니다. C++ 없이 블루프린트만으로 커스텀 노드를 만들 수 있습니다.

BP 커스텀 노드 생성 방법

  1. Content Browser에서 Blueprint Class 생성
  2. Parent Class로 PCGBlueprintElement 선택
  3. Execute 또는 ExecuteWithContext 함수를 오버라이드
  4. 입력 데이터를 처리하여 출력에 전달하는 로직 작성
  5. PCG 그래프에서 Execute Blueprint 노드에 해당 BP 할당
BP 커스텀 노드 구조
// Blueprint: BP_HeightClassifier // Parent: PCGBlueprintElement Function ExecuteWithContext( InContext: FPCGContext, Input: FPCGDataCollection, Output: FPCGDataCollection ) { // 입력 포인트 데이터 가져오기 PointData = Input → GetTypedInputs<PCGPointData>() // 각 포인트에 대해 높이 기반 분류 For Each Point in PointData: Height = Point.Transform.Location.Z If Height < 500: SetAttribute("Zone", 0) // 저지대 Else If Height < 1500: SetAttribute("Zone", 1) // 산림 Else: SetAttribute("Zone", 2) // 고산 // 출력에 데이터 추가 Output → AddData(PointData) }
BP 노드 성능 제한

Blueprint 기반 커스텀 노드는 C++ 노드보다 10~100배 느릴 수 있습니다. 수천 개 이하의 포인트에서는 문제없지만, 수만 개 이상의 포인트를 처리할 때는 C++ 구현을 권장합니다.

04

Graph Template

사전 구성된 그래프 패턴 재사용

Graph Template은 자주 사용되는 노드 조합을 사전 구성된 패턴으로 저장합니다. 새 그래프를 만들 때 템플릿에서 시작하면 반복적인 설정을 줄일 수 있습니다.

Forest Template

Surface Sampler → Noise → Filter → Self Pruning → Transform → Spawner 기본 패턴

Road Template

Spline Sampler → Fill → 양쪽 가드레일 + 가로등 통합 패턴

Building Template

Grid → Duplicate(층) → Partition(모듈) → 각 모듈별 Spawner 패턴

Scatter Template

Volume/Surface → Noise → Multi-layer density → Select → Multi-Spawner 패턴

팀 워크플로우

프로젝트 초기에 공통 Graph Template을 정의하면 팀 전체의 PCG 워크플로우가 일관됩니다. Template에 Graph Parameters를 충분히 노출하면 레벨 디자이너가 그래프를 열지 않고도 PCG Volume의 Details 패널에서 직접 조정할 수 있습니다.

SUMMARY

핵심 요약

  • 서브그래프로 PCG 로직을 모듈화하고 재사용할 수 있으며, SG_ 접두사 네이밍을 권장한다
  • Graph Parameters로 밀도, 메시, 스케일 등을 외부에서 오버라이드할 수 있다
  • Graph Instance는 원본 그래프의 로직을 공유하면서 파라미터만 다르게 설정한 변형이다
  • Execute Blueprint 노드로 C++ 없이 커스텀 로직을 구현할 수 있지만 성능이 제한적이다
  • Graph Template으로 자주 사용하는 노드 패턴을 사전 구성하여 팀 워크플로우를 일관화한다
  • 대규모 데이터 처리에는 C++ 커스텀 노드, 소규모 프로토타이핑에는 BP 노드를 사용한다
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 서브그래프 생성

자주 사용하는 노드 조합(Surface Sampler → Density Filter → Transform → Spawner)을 서브그래프로 묶으세요. Input/Output 핀을 설정하고, 메인 그래프에서 재사용하세요.

실습 2: 파라미터화된 서브그래프

서브그래프의 주요 파라미터(밀도, 스케일 범위, 메시 에셋)를 외부에서 오버라이드 가능하도록 노출하세요. 하나의 식생 서브그래프로 숲, 공원, 정원 3가지 변형을 만드세요.

심화 과제: 모듈식 PCG 라이브러리

재사용 가능한 서브그래프 라이브러리(숲 생성, 도로 배치, 마을 레이아웃, 강 생성)를 만드세요. 각 모듈이 표준화된 Input/Output으로 자유롭게 조합 가능하도록 설계하세요.