프로시저럴 콘텐츠 생성 프레임워크(Procedural Content Generation Framework, PCG) 는 언리얼 엔진 내에서 자신만의 프로시저럴 콘텐츠와 툴을 제작할 수 있는 툴세트입니다. PCG는 테크니컬 아티스트, 디자이너, 프로그래머가 건물이나 생물군 생성과 같은 에셋 유틸리티에서 전체 월드에 이르기까지 복잡성에 관계없이 빠른 반복작업 툴과 콘텐츠를 빌드할 수 있도록 지원합니다.
주요 개념 및 용어
- 포인트(Points): PCG 그래프에 의해 생성되며 메시를 스폰하는 데 자주 사용되는 3D 공간상 위치입니다. 포인트에는 트랜스폼, 바운드, 색, 밀도, 경사도, 시드에 대한 정보가 포함됩니다. 포인트에 사용자 정의 어트리뷰트를 할당할 수 있습니다.
- 포인트 밀도(Point Density): 다양한 그래프 노드에 사용되는 값입니다. 디버그 뷰에서는 각 포인트의 그레이디언트로 표현되며, 해당 위치에 점이 존재할 확률을 나타냅니다. 밀도가 0이면 검은색, 밀도가 1이면 흰색입니다.
필수 셋업
프로시저럴 콘텐츠 생성 프레임워크를 사용하려면 프로젝트에서 프로시저럴 콘텐츠 생성 프레임워크(Procedural Content Generation Framework) 플러그인을 활성화해야 합니다. 플러그인 활성화에 대한 자세한 내용은 플러그인으로 작업하기를 참고하세요.
스태틱 메시에서 포인트를 샘플링하려면 프로시저럴 콘텐츠 생성 프레임워크 지오메트리 스크립트 상호운용(Procedural Content Generation Framework Geometry Script Interop) 플러그인이 필요합니다.
프로시저럴 노드 그래프
프로시저럴 노드 그래프(Procedural Node Graph)는 프로시저럴 콘텐츠 생성 프레임워크의 핵심입니다.
머티리얼 에디터와 유사한 포맷을 사용하여 공간 데이터가 레벨의 PCG 컴포넌트에서 그래프로 이동하며, 포인트 생성에 사용됩니다. 포인트는 일련의 노드를 통해 필터링 및 수정되며 출력이 실시간으로 업데이트됩니다. 결과 포인트는 다양한 에셋을 스폰하는 데 사용될 수 있습니다.
PCG 그래프 에셋 생성
PCG 그래프를 생성하려면 다음 단계를 따릅니다.
- 콘텐츠 드로어(Content Drawer) 또는 콘텐츠 브라우저(Content Browser) 에서 우클릭하여 고급 에셋 생성(Create Advanced Asset) > PCG 로 이동한 다음 PCG 그래프(PCG Graph) 를 선택합니다.
- 새 에셋의 이름을 선택하고 Enter 를 누릅니다.
PCG 그래프 편집
PCG 그래프 에디터를 사용하여 PCG 그래프 에셋을 환경설정하고 편집할 수 있습니다. 이 에디터의 사용법은 블루프린트나 머티리얼 에디터와 유사합니다. PCG 전용 툴과 패널도 일부 있습니다.
번호 | 설명 |
1 | 툴바 |
2 | 노드 팔레트 |
3 | 뷰포트 |
4 | 디테일 패널 |
5 | 디버그 트리 |
6 | 어트리뷰트 목록 |
블루프린트로 작업하는 것과 마찬가지로, 노드 팔레트에서 노드를 뷰포트로 드래그하거나 컨텍스트 메뉴를 사용하여 그래프에 노드를 추가할 수 있습니다.
PCG 그래프가 PCG 컴포넌트에 할당되어 있고 콘텐츠 생성에 사용된 경우, PCG 그래프에 적용된 변경사항은 에디터 뷰포트에서 실시간으로 업데이트됩니다.
PCG 노드
PCG 그래프는 일련의 PCG 노드로 구성되며, 각 노드는 최종 결과물에 영향을 미치는 작업을 수행합니다.
이러한 노드는 다음과 같은 카테고리로 나뉩니다.
카테고리 | 설명 |
---|---|
Blueprint | 블루프린트 관련 노드가 포함됩니다. 여기에는 PCGBlueprintElement 에서 파생된 사용자 블루프린트를 실행하는 일반 노드가 있습니다. |
Control Flow | 그래프를 통해 로직의 흐름을 제어하기 위한 노드가 포함됩니다. |
Debug | 디버깅에 도움이 되는 노드가 포함됩니다. |
Density | 포인트 밀도에 영향을 미치는 노드가 포함됩니다. |
Filter | 기준에 따라 또는 포인트별로 데이터를 필터링하는 노드가 포함됩니다. |
Generic | 공간 데이터가 아닌 데이터에 영향을 주는 노드가 포함됩니다. |
Hierarchical Generation | 계층형 생성 모드를 제어하기 위한 노드가 포함되어 있습니다. |
Input Output | Alembic 및 기타 외부 데이터를 로드하기 위한 노드가 포함됩니다. |
IO | 외부 데이터와의 상호작용을 제어하는 노드가 포함됩니다. |
Metadata | 포인트나 어트리뷰트 세트의 어트리뷰트와 상호작용하는 노드가 포함됩니다. |
Param | 액터 또는 블루프린트 변수로부터의 파라미터 획득을 제어하는 노드가 포함됩니다. |
Point Ops | 포인트와 그 프로퍼티에 영향을 주는 노드가 포함됩니다. |
Sampler | 볼륨, 표면, 메시와 같은 공간 데이터 소스에서 포인트를 생성하는 노드가 포함됩니다. |
Spatial | 데이터 간에 공간적 관계를 만들거나, 내부 공간 데이터를 변경하거나, 데이터를 얻는 노드가 포함됩니다. |
Spawner | 새 데이터를 만들거나 지정된 포인트 위치에 액터를 배치하는 노드가 포함됩니다. |
Subgraph | 서브그래프 사용을 처리하는 노드가 포함됩니다. |
Transforms | 포인트의 트랜스폼 정보를 수정하는 노드가 포함됩니다. |
블루프린트와 마찬가지로 코멘트 와 경유 노드 를 추가하여 그래프의 가독성을 향상할 수 있습니다.
어트리뷰트 및 메타데이터
어트리뷰트는 변수와 유사하며 이름과 유형으로 정의된 데이터를 저장합니다. 어트리뷰트에는 두 가지 유형이 있습니다.
- 스태틱 어트리뷰트(Static Attributes): 고정되어 항상 존재하는 속성으로
$
로 시작합니다(예:$Position
). - 다이내믹 어트리뷰트(Dynamic Attributes): 런타임에 생성되어 그래프 데이터의 메타데이터의 일부로 저장되는 어트리뷰트입니다.
어트리뷰트 선택기
일부 PCG 그래프 노드는 어트리뷰트 선택기를 통해 스태틱 어트리뷰트와 다이내믹 어트리뷰트 간의 상호 운용성을 제공할 수 있습니다.
어트리뷰트 선택기는 선택한 노드에 사용할 수 있는 어트리뷰트 목록을 제공합니다. 어트리뷰트 선택기는 다음과 같은 명명 규칙을 사용합니다.
- 이름이 $로 시작하면 스태틱, $가 없으면 다이내믹 어트리뷰트입니다.
@Last
는 이전 노드에서 마지막으로 조작한 다이내믹 어트리뷰트를 나타냅니다.
예를 들어 Math 노드는 스태틱 및 다이내믹 어트리뷰트에 대한 수학적 연산을 수행하는 데 사용됩니다.
어트리뷰트 선택기 이름 필드는 컴포넌트에서 데이터를 추출하는 데에도 사용할 수 있습니다.
위 이미지에서 $Position.ZYX는 $Position의 구성 요소의 역을 제공합니다. 아래는 이러한 방식으로 조작할 수 있는 컴포넌트와 그 유형입니다.
컴포넌트 | 타입 |
---|---|
벡터 | |
X, Y, Z, W, x, y, z, w | Double. RGBA와 혼합할 수 있습니다. |
R, G, B, A, r, g, b, a | Double. XYZW와 혼합할 수 있습니다. |
Length, Size | Double. 벡터 길이를 반환합니다. |
트랜스폼 | |
Location, Position | Vector3 |
Scale, Scale3D | Vector3 |
Rotation | Quaternion |
로테이터 | |
Pitch, Yaw, Roll | Double |
Forward, Right, Up | Vector3 |
쿼터니언 | |
벡터 추출기 지원 | Vector |
로테이터 추출기 지원 | Rotator |
C++ 세팅 오버라이드
일부 세팅은 C++ 프로퍼티 메타데이터에 PCG_Overridable 로 표시되어 있습니다. 블루프린트 노드의 경우, 표시되고 인스턴스 편집이 가능한 변수는 오버라이드할 수 있습니다.
오버라이드된 핀은 노드에 고급 핀으로 자동 추가됩니다. 핀에는 두 가지 유형이 있습니다.
- 글로벌 오버라이드(Global override): 원하는 수의 어트리뷰트를 허용하고 세팅 이름과 정확히 일치하는 각 어트리뷰트에 대한 모든 세팅을 오버라이드합니다.
- 싱글 오버라이드(Single override): 원하는 수의 어트리뷰트를 허용하고 세팅 이름과 정확히 일치하는 어트리뷰트가 있는 경우 특정 세팅을 오버라이드하거나 어트리뷰트가 하나만 있는 경우 아무 이름으로 재정의합니다.
어트리뷰트 유형은 일치해야 하지만 일부 유형은 변환할 수 있습니다.
정확한 이름이나 유형을 알고 싶으면 오버라이드 핀에서 툴팁을 사용하세요.
그래프 파라미터
머티리얼 에디터의 파라미터와 마찬가지로 PCG 그래프 파라미터는 사용자가 오버라이드 가능한 값으로, 다양한 상황에 맞는 커스터마이징 가능한 그래프를 만드는 데 도움이 될 수 있습니다. 새 파라미터를 만들려면:
- PCG 그래프 세팅을 엽니다.
- 파라미터 옆의 + 버튼을 클릭합니다. 새 파라미터가 생성됩니다.
- 새 파라미터 옆의 아래쪽 화살표를 클릭합니다. 이름을 바꾸고 유형을 선택합니다.
PCG 그래프에서 파라미터의 값을 변경하려면:
그래프 파라미터 또는 PCG 에셋의 디테일 패널에서 값을 변경합니다.
PCG 그래프 인스턴스의 파라미터 값을 변경하려면:
콘텐츠 브라우저에서 에셋을 열고 값을 변경하거나 PCG 에셋의 디테일 패널에서 변경합니다.
그래프 인스턴스
PCG 그래프 인스턴스는 머티리얼 인스턴스와 유사하게 작동하며 그래프 파라미터를 활용하여 기존 그래프를 인스턴스 또는 PCG 서브그래프로 재사용할 수 있습니다.
PCG 그래프 인스턴스를 생성하려면:
- 레벨에서 PCG 에셋을 선택합니다.
- 디테일 패널에서 PCG 컴포넌트를 선택합니다.
- 인스턴스 저장 버튼을 클릭하여 새 인스턴스를 생성합니다.
- 새 그래프 인스턴스의 이름을 지정하고 Enter 를 누릅니다.
인스턴스를 PCG 서브그래프로 사용하는 경우, 서브그래프 노드의 오버라이드 핀을 사용하여 파라미터를 오버라이드할 수 있습니다.
PCG 컴포넌트
PCG 컴포넌트 프로시저럴 노드 그래프에서 PCG 컴포넌트를 통해 레벨을 샘플링할 수 있습니다. 이 컴포넌트는 프로시저럴 노드 그래프의 인스턴스를 저장하며 에디터와 런타임 모두에서 프로시저럴 콘텐츠의 생성을 관리합니다. PCG 컴포넌트는 액터에 컴포넌트로 추가되거나, 프로시저럴 콘텐츠를 신속히 설정하는 데 유용한 기본 볼륨인 PCG 볼륨의 일부로 사용됩니다.
PCG 그래프를 PCG 컴포넌트에 연결하려면 다음 단계를 따릅니다.
- 에디터 뷰포트 또는 아웃라이너(Outliner) 에서 연결할 PCG 볼륨 또는 블루프린트 클래스 를 선택합니다.
-
디테일(Details) 패널에서 PCG 컴포넌트(PCG Component) 를 클릭합니다.
-
그래프(Graph) 드롭다운을 클릭하고 사용할 PCG 노드 그래프를 선택합니다.
-
생성(Generate) 버튼을 클릭하여 결과를 확인합니다.
PCG 디버깅
디버깅은 PCG 워크플로에서 필수적인 부분입니다.
각 노드에는 PCG 그래프의 각 단계에서 포인트 데이터를 시각화하는 데 사용할 수 있는 다양한 디버그 옵션이 있습니다.
- 디버그 렌더링
- 노드 활성화/비활성화
- 검사
노드의 디테일(Details) 패널에서 디버그(Debug) 체크박스를 선택하거나 D 를 눌러 각 노드의 디버그 렌더링을 토글합니다.
노드의 디테일(Details) 패널에서 활성화됨(Enabled) 체크박스를 선택하거나 E 를 눌러 각 노드의 활성화 상태를 토글합니다.
노드를 검사하여 해당 노드가 생성하는 모든 포인트를 어트리뷰트(Attributes) 목록에 표시할 수도 있습니다.
- 디버그 트리에서 PCG 컴포넌트를 선택합니다.
- 검사할 노드를 우클릭합니다.
- 검사(Inspect) 를 선택합니다. 그 대신 A 를 눌러도 됩니다.
간단한 숲 볼륨 만들기
프로시저럴 생성 툴의 일반적인 사용 사례는 오픈 월드 환경에서 생물군을 생성하는 것입니다.
다음 단계에 따라 기본적인 숲 생물군 생성기를 만들 수 있습니다.
이 샘플에서는 마켓플레이스를 사용하여 다운로드한 Megascans Trees: European Hornbeam 컬렉션의 머티리얼과 스태틱 메시를 사용합니다.
레벨 생성
- 언리얼 엔진에서 새 프로젝트를 생성합니다.
- 기본(Basic) 레벨 템플릿을 사용하여 새 레벨을 생성합니다. 레벨을 저장합니다.
- Floor 스태틱 메시를 삭제하고 랜드스케이프 모드를 사용하여 레벨에 새 랜드스케이프를 추가합니다.
-
스컬프팅 툴을 사용하여 랜드스케이프에 베리에이션을 추가합니다.
PCG 볼륨 생성
- 선택(Selection) 모드로 돌아가서 액터 배치(Place Actors) 창이 보이지 않는 경우 창을 활성화합니다.
-
클래스 검색(Search Classes) 박스를 사용하여 PCG 볼륨(PCGVolume) 을 찾아 레벨에 추가합니다.
- PCG 볼륨의 스케일을 X = 8.0, Y = 8.0, Z = 8.0으로 조절합니다.
PCG 그래프 에셋 생성
- 콘텐츠 드로어(Content Drawer) 또는 콘텐츠 브라우저(Content Browser) 에서 우클릭하고 고급 에셋 생성(Create Advanced Asset) > PCG 로 이동한 다음 PCG 그래프(PCG Graph) 를 선택합니다.
- 새 에셋을 PCG_ForestGen 으로 명명하고 Enter 를 누릅니다.
- PCG_ForestGen 을 더블 클릭하여 PCG 그래프 에디터를 엽니다.
PCG 컴포넌트 연결
- 에디터 뷰포트 또는 아웃라이너(Outliner) 에서 PCG 볼륨(PCG Volume) 을 선택합니다.
- 디테일(Details) 패널에서 PCG 컴포넌트(PCG Component) 를 클릭합니다.
-
그래프(Graph) 드롭다운을 클릭하고 목록에서 PCG_ForestGen 을 선택합니다.
포인트 생성
- PCG 그래프 에디터(PCG Graph Editor) 창에서 *Get Landscape Data 노드를 그래프에 추가합니다.
-
Get Landscape Data 출력에서 드래그하여 Surface Sampler 노드를 추가합니다.
- Surface Sampler를 선택하고 D 를 눌러 디버그 렌더링을 토글합니다.
- 에디터 창으로 돌아가서 PCG 볼륨을 선택하고 디테일 패널에서 생성(Generate) 버튼을 클릭합니다.
이제 에디터 뷰포트에서 생성되는 포인트를 확인할 수 있습니다. 포인트는 랜드스케이프의 모양에 맞춰집니다.
베리에이션 추가
- PCG 그래프 에디터에서 Surface Sampler를 선택합니다.
- 디테일 패널에서 Points Per Square Meter, Points Extents, Looseness 프로퍼티를 조정하여 포인트를 더 추가합니다.
- Points Per Square Meter 를 0.15 로 조정하여 공간에 포인트를 더 추가합니다.
- Points Extents 프로퍼티는 각 포인트의 바운드 크기를 제어합니다. X, Y, Z 값을 50 으로 변경합니다.
- Looseness 프로퍼티는 생성되는 포인트를 그리드 셰이프에 얼마나 가깝게 맞출지를 결정합니다. Looseness 값은 1.0 인 상태로 둡니다.
-
다음으로 Transform Points 노드를 추가합니다. 이 노드는 포인트에 일정한 범위의 이동, 회전, 스케일 변화를 추가합니다. Surface Sampler 노드의 Output 핀을 Transform Points 노드의 Input 핀에 연결합니다.
- 디버그 렌더링을 Surface Sampler 노드에서는 비활성화하고 Transform Points 노드에서는 활성화합니다.
-
회전 베리에이션을 추가하려면 Max Rotation 의 Z 값을 360 으로 변경합니다. 그러면 모든 포인트에 0~360도의 랜덤 회전값이 부여됩니다.
- PCG 그래프는 포인트를 스폰하고 랜드스케이프의 노멀 방향을 따라 회전시킵니다. Absolute Rotation 체크박스를 선택하여 이러한 추가적인 회전을 비활성화합니다.
-
크기 베리에이션을 추가하려면 X, Y, Z Scale Min 값을 0.5 로 설정합니다. X, Y, Z Scale Max 값을 1.2 로 변경합니다.
최종 결과물로, 적정량의 베리에이션이 적용된 포인트 세트가 생겼습니다.
스태틱 메시 스폰
-
PCG 그래프 에디터에서 Static Mesh Spawner 노드를 그래프 뷰포트에 추가합니다. Transform Points 노드의 Output 핀을 Static Mesh Spawner의 Input 핀에 연결합니다.
- Static Mesh Spawner를 선택합니다.
- 디테일(Details) 패널에서 Mesh Entries 옵션을 찾아 + 버튼을 클릭하여 스폰할 스태틱 메시를 추가합니다.
- Mesh Entries 옆의 아래쪽 화살표를 클릭하여 배열을 엽니다.
- 인덱스(Index) [0] 옆의 아래쪽 화살표를 클릭합니다.
- Descriptor 옆의 아래쪽 화살표를 클릭합니다.
-
Static Mesh 의 드롭다운 메뉴를 클릭하고 스폰할 나무를 선택합니다. 이 예시에서는 SM_EuropeanHornbeam_Forest_01 을 사용합니다.
스태틱 메시를 더 추가하고 배열의 메시 항목별로 가중치(Weight) 프로퍼티를 사용하여 베리에이션을 조정할 수 있습니다. 언리얼 엔진에서는 모든 스태틱 메시 항목의 가중치 값을 더하고 개별 가중치로 나누어 각 항목의 스폰 확률을 결정합니다.