# PCG (Procedural Content Generation) 소개, 활용 사례 및 프로덕션 모범 사례
## 1. PCG란 무엇인가?
PCG는 단순히 "절차적 콘텐츠 생성"이라는 광범위한 개념이 아닌, 언리얼 엔진에 통합된 **특정 프로시저럴 콘텐츠 생성 프레임워크**입니다.
* **정의:**
* 엔진 내에서 사용 가능한 툴로, **세상을 구축하는 툴을 만들기 위한 툴**입니다.
* 5.7 버전부터 **프로덕션 준비 완료 (Production Ready)** 상태이며, 액티브하게 지원됩니다.
* **주요 특징:**
* 다른 엔진 시스템(인스턴스 액터, 지오메트리 스크립트 등)과 상호 운용됩니다.
* 반복 시간을 단축하여 거대 월드 제작을 지원합니다.
* 단순한 배치 작업을 넘어선 **일반화된 프레임워크**입니다.
* **오프라인 (에디트 타임)** 및 **런타임** 생성이 가능하며, 혼합 사용도 지원됩니다.
* 런타임 사용을 위해 **병렬 및 멀티스레딩**으로 설계되었습니다.
* 게임 외 분야에서도 활용 가능합니다.
* **결정성(Determinism)**, **성능 (캐싱, 멀티스레딩, 병렬 처리, 비동기 실행)** 을 지원합니다.
* 새로운 **식물 에디터**와 같은 자체 PCG 툴 구축이 가능합니다.
* **계층적 설계**, **디버깅 및 프로파일링** 기능을 제공합니다.
* **핵심 가치:**
* 향후 워크플로우에서 **머티리얼만큼이나 근본적인 역할**을 할 것으로 기대됩니다.
## 2. PCG 히스토리
PCG 프레임워크는 엔진 버전별로 발전해왔습니다.
* **Unreal Engine 5.2 (GDC 2023):**
* 실험적인 프로시저럴 콘텐츠 생성 프레임워크 출시
* "Electric Dream" 샘플 공개 (월드 자동 재생성 시연)
* 어셈블리 워크플로우 탐구 시작
* **5.4:**
* PCG **베타** 출시
* 기본 틀 구축 및 연산 라이브러리 확장
* 그래프 동적 추적 기능 추가 (입력 변경 시 자동 재생성)
* 런타임 계층적 생성, 네이티브 PCG 데이터 에셋 익스포터 추가
* 빌더 및 커스터마이징 툴 추가
* "BiomeCore V1" 플러그인 출시 (자연 환경 제작 지원)
* **5.5:**
* "Cassini" 샘플 공개
* **GPU 기능 추가** (일부 노드 GPU 실행)
* **형상 문법 (Shape Grammar)** 기능 추가 (강력한 툴)
* 지오메트리 처리, 레이캐스팅, 경로 탐색 기능 추가
* 성능 향상 (예: 전체 소행성 필드 생성 가능)
* **5.6:**
* UX 안정성 및 성능 개선
* "Witcher 4" 데모에서 GPU 처리 및 인스턴싱 활용
* 메모리 및 성능, 디버깅 개선
* **템플릿 기능** 추가
* PCG 에디터 **뷰포트** 추가
* "BiomeCore V2" 출시 (기능 개선, 로컬 바이옴 액터 및 겹침 기능 추가)
* **5.7:**
* PCG **프로덕션 준비 완료** (지원 및 안정성 보장)
* **GPU 기능 강화**:
* 씬 캡처, 텍스처 샘플링, 고속 지오메트리 지원
* GPU에서 노드 네이티브 실행
* **커스텀 타입 지원** (플러그인 개발자 대상)
* Polygon 2D 타입 및 관련 연산 추가
* 새로운 에셋 워크플로우 추가
* **Nanite 어셈블리 생성 지원** (실험적)
* Epic 내부의 거의 모든 프로젝트에서 PCG 활용 (Fortnite BR, Lego Odyssey 등)
## 3. PCG 워크플로우 기초
일반적인 PCG 워크플로우는 다음과 같은 단계를 거칩니다.
1. **PCG 그래프 생성:** (실행 흐름 그래프와 다름)
2. **PCG 컴포넌트에서 그래프 사용:**
* 콘텐츠 브라우저에서 그래프를 드래그하여 월드에 PCG 볼륨 생성
* 생성된 데이터에서 데이터를 추출
3. **그래프 내부 처리:**
* **데이터 생성/로딩:** 특정 데이터(예: 풍경)를 가져오거나 생성
* **데이터 처리:** 샘플링, 필터링 등 데이터 가공
* **메타데이터 연산:** 변환(Transform), 경계(Bounds) 등 추가 정보 연산
* **결과물 생성 (Artifacts):** 스태틱 메시 스폰, 액터 배치 등
### 예시: 잔디가 있는 풍경에 나무 스폰
* **LANDSCAPE DATA** 노드로 풍경 데이터 로드
* **SAMPLE SURFACE** 노드로 표면에서 점(Point) 생성
* **FILTER** 노드로 점의 속성(예: 잔디 비율)에 따라 필터링
* **TRANSFORM** 노드로 점의 스케일, 회전 등 변경
* **SPAWN STATIC MESHES** 노드로 나무 메쉬 스폰
### 데이터 속성 (Attributes)
* 점(Point)은 위치, 회전, 스케일, 경계 등의 **기본 속성**을 가집니다.
* `$` 기호가 붙은 속성은 데이터셋에 내장된 속성입니다.
* 풍경 샘플링 시, 각 점은 풍경의 **레이어 가중치 (Layer Weights)** 를 속성으로 가집니다 (예: 잔디, 모래 비율).
* 이를 활용하여 특정 속성에 따라 필터링할 수 있습니다.
### 디버깅
* 노드를 선택하고 **D** 키를 누르면 디버그 체크박스가 활성화되어 시각적으로 결과를 확인할 수 있습니다.
* 디버그 노드를 통해 데이터셋을 직접 연결하여 결과를 확인할 수 있습니다.
### 파라미터 노출
* 그래프의 노드 파라미터를 **노출**하여 PCG 컴포넌트에서 직접 값을 오버라이드할 수 있습니다.
* 머티리얼처럼 **PCG 그래프 인스턴스**를 생성하여 파라미터 조절이 가능합니다.
## 4. PCG 에디터 모드 및 고급 기능
* **PCG 에디터 모드:**
* 콘텐츠 크리에이터가 직접 툴을 사용하여 월드에 요소(도로, 나무 등)를 쉽게 배치하고 수정할 수 있습니다.
* 스플라인 데이터 샘플링, 인스턴스 파라미터 변경 등이 가능합니다.
* **어셈블리 워크플로우:**
* 레벨 인스턴스를 PCG 데이터 에셋으로 변환하여 활용합니다.
* 액터 태그(Actor Tags)를 속성으로 활용하여 다양한 변형 및 제어가 가능합니다.
* 예: **Clutter Tag**를 사용하여 특정 비율의 장식 요소만 스폰
* **Intensity: 숫자** 형식으로 속성 값 지정 가능
* **플러그인:**
* PCG 프레임워크 자체는 1.0 버전으로 안정화되었으나, 다른 연동 플러그인들은 실험적 또는 베타 상태일 수 있습니다.
* **Instance Actors, Fast Geometry:** 해당 엔진 기능 자체가 실험적인 경우 PCG 연동도 실험적입니다.
* **Geometry Script:** 필수적으로 사용될 것을 권장합니다.
* **BiomeCore:** 강력한 PCG 툴, 프로덕션에서는 엔진 폴더에서 프로젝트로 복사하여 사용하는 것을 권장합니다.
* **형상 문법 (Shape Grammar):**
* 스플라인을 따라 특정 규칙(문장)에 따라 다양한 메쉬를 배치하는 강력한 기능입니다.
* 예: 펜스 끝, 중간 부분에 다른 메쉬를 규칙적으로 배치
* **경로 탐색 (Pathfinding):**
* 스플라인을 활용하여 두 지점 간의 경로를 생성하고, 이를 기반으로 길 등을 생성할 수 있습니다.
* **서브그래프 (Subgraphs)** 와 연계하여 복잡한 경로 생성 가능
* **Nanite 어셈블리 생성:**
* PCG를 사용하여 Nanite 어셈블리를 생성하는 기능 (실험적)
* **프로파일링:**
* **프로파일링 패널**을 통해 병목 노드를 식별하고 성능 최적화에 활용합니다.
* **Is Partitioned 체크박스:** 월드 파티셔닝 시스템과 연계하여 대규모 월드에서 인스턴스를 효율적으로 관리합니다.
* **계층적 생성 (Hierarchical Generation):** 높은 레벨에서 시작하여 점차 세부적인 그리드 크기로 데이터를 처리하여 효율성 증대
* **런타임 생성:**
* PCG 월드 액터에서 "Use Editor Viewport as Generation Source" 옵션 활성화 필요
* GPU 전용 인스턴스 스폰 가능 (CPU 부하 감소)
* 파라미터 변경 시 자동 재생성 (에디터), 수동 트리거 필요 (런타임 POI 생성 등)
* 런타임 시 인스턴스 트랜스폼을 디스크에 저장할 필요 없음
* GPU에서 텍스처 샘플링, HLSL 코드 디버깅 가능 (Lumen 씬에는 표시되지 않음)
* **고급 생성 개념:**
* **생성 시점:**
* **On Load (기본값):** 빌드 시점에 생성
* **On Demand:** 특정 시점에 수동으로 생성 (예: "Generate" 버튼 클릭)
* **Runtime:** 런타임 시 생성
* **에디터 전용 컴포넌트:** PCG 컴포넌트가 생성 후 필요 없을 경우 에디터 전용으로 설정 가능
* **PCG 빌더 (Builders):**
* 커맨드렛을 통해 PCG 생성을 제어하는 에셋
* CI/CD 파이프라인에 통합하여 빌드 프로세스 자동화
* 소스 컨트롤 충돌 방지
## 5. 프로덕션 모범 사례
* **PCG 시스템의 요구 사항 고려:**
* 예술적 제어 수준과 수동 배치 수준을 결정해야 합니다.
* 전체 도시를 PCG로 만들 수도, 부분적으로만 사용할 수도 있습니다.
* 에디트 타임 또는 런타임 생성을 결정해야 합니다.
* 그래프 간의 복잡한 연결 또는 단순한 스태틱 메시 스폰 중 선택합니다.
* **가독성 있는 그래프:**
* 엔지니어 또는 아티스트가 이해하기 쉬운 그래프 구조를 유지합니다.
* **성능 최적화:**
* 실시간 피드백 및 쉬운 아티스트 워크플로우를 위해 성능을 주시합니다.
* 디버그 옵션을 활용하고, 미리 계산 가능한 부분과 런타임 실행 부분을 구분합니다.
* 모든 것을 파티셔닝하고, 필요에 따라 옵트아웃 기능을 제공합니다.
* **PCG 빌더 활용:**
* 프리뷰 모드를 통해 변경 사항을 확인하고, 빌드 머신에서 대규모 생성을 처리합니다.
* HLOD 생성과 연계할 수 있습니다.
* **에디터 유틸리티 위젯 (Editor Utility Widgets):**
* PCG 그래프 실행 순서를 정의하는 데 유용합니다.
* 어셈블리 워크플로우에서 액터 태그 설정을 자동화하여 오류 최소화
* **PCG 구성:**
* 캐시 크기, 에디터/런타임 프레임 시간, 최대 루프 수 등을 프로젝트 요구 사항에 맞게 조정합니다.
* **블루프린트 대신 PCG 활용:**
* 복잡한 인스턴스 생성 시 블루프린트의 Construction Script보다 PCG가 더 효율적일 수 있습니다.
* PCG는 인스턴스를 생성하지만, Construction Script는 레벨 로드 시 동적으로 생성하여 부하가 클 수 있습니다.
* 블루프린트는 PCG 컴포넌트의 범위(경계 충돌, 스플라인)를 정의하는 데 활용될 수 있습니다.
* **명확한 규칙 및 분류 체계:**
* 태그, 속성 명명 규칙 등을 일관되게 정의하여 관리합니다.
* 사용자가 입력할 수 있는 부분(수동 작업)과 PCG가 처리할 부분을 명확히 구분합니다.
## 6. 활용 사례
* **Electric Dream 샘플:** 계층적 생성, 블루프린트 속성 활용, 어셈블리 워크플로우
* **BiomeCore V2:** 복잡한 PCG 시스템 구축, 그래프 간 통신, 사용자 친화적 인터페이스 제공 (프로덕션에서는 복사 후 사용 권장)
* **Cassini 샘플:** 형상 문법, 런타임 생성, 거리 필드 빌딩, 스플라인 메쉬 활용
* **Lego Odyssey:**
* 에디터 유틸리티 위젯을 통한 어셈블리 워크플로우
* **Snap to Landscape (STL)** 태그를 활용한 지형 기반 배치
* 포인트 클라우드를 활용한 POI 생성
* 타일 기반 게임, 헥스 타일링
* 오디오 팀의 환경음 배치 활용
* **기타:**
* 던전 생성, 레벨/레벨 인스턴스 스폰
* 타일 기반 게임
* 월드 파편 흩뿌리기
* 머신러닝 기반 애플리케이션 (PCG로 머신러닝 모델 학습 데이터 생성, 머신러닝으로 PCG 정보 제공)
* 복셀화된 구름 생성
## 7. 요약 및 향후 정보
* **PCG는 프로덕션 준비 완료**되었으며, 워크플로우를 가속화하기 위해 적극적으로 사용해야 합니다.
* 에디터 및 런타임 모두에서 다양한 기능을 활용할 수 있습니다.
* 작게 시작하여 점진적으로 복잡성을 늘려가는 것을 권장합니다.
* 다양한 시스템 간의 연결성을 고려합니다.
### 추가 정보
* **Witcher 4 Unreal Engine Tech Demo 런타임 PCG:** Hugh의 발표 (8호실)
* **Technical Content Grimoire:** Tomislav의 PCG 관련 콘텐츠
* **Nanite Foliage의 미래:** Simon의 발표 (6호실)
* **Simon에게 문의:** PCG 관련 질문
**감사의 말:** Camille Kay, Chris Murphy, Jean-Claude Sebastien Kwai의 도움에 감사드립니다.
**커뮤니티:** PCG를 사용하는 모든 분들의 노고에 감사하며, 많은 영감을 얻고 있습니다.
**추가 자료:** 발표자 링크트리에서 PCG 관련 리소스 및 발표 자료 확인 가능.