프로시저럴 콘텐츠 생성(Procedural Content Generation, PCG) 프레임워크는 언리얼 엔진에서 자체 프로시저럴 콘텐츠와 툴을 제작할 수 있는 툴세트입니다. PCG는 테크니컬 아티스트, 디자이너, 프로그래머가 건물이나 생물군 생성과 같은 에셋 유틸리티에서 전체 월드에 이르기까지 복잡성에 관계없이 빠른 반복작업 툴과 콘텐츠를 빌드할 수 있도록 지원합니다.
중요 개념 및 용어
포인트: PCG 그래프에 의해 생성되는 3D 스페이스 내 위치로, 종종 메시를 스폰하는 데 사용됩니다. 포인트에는 트랜스폼, 바운드, 색, 밀도, 경사도, 시드에 대한 정보가 포함됩니다. 포인트에 사용자 정의 어트리뷰트를 할당할 수 있습니다.
포인트 밀도: 다양한 그래프 노드에서 사용되는 값입니다. 이는 디버그 뷰에서 각 포인트의 그레이디언트로 표시되며, 해당 위치에 포인트가 존재할 확률을 나타냅니다. 밀도가 0이면 검은색, 밀도가 1이면 흰색입니다.
필수 설정
프로시저럴 콘텐츠 생성 프레임워크를 사용하려면 프로젝트에서 프로시저럴 콘텐츠 생성 프레임워크(Procedural Content Generation Framework) 플러그인을 활성화해야 합니다. 플러그인 활성화에 대한 자세한 내용은 플러그인으로 작업하기를 참조하세요.
스태틱 메시에서 포인트를 샘플링하려면 프로시저럴 콘텐츠 생성 프레임워크 지오메트리 스크립트 인터롭(Procedural Content Generation Framework Geometry Script Interop) 플러그인이 필요합니다.
프로시저럴 노드 그래프
프로시저럴 노드 그래프(Procedural Node Graph)는 프로시저럴 콘텐츠 생성 프레임워크의 핵심입니다.
머티리얼 에디터와 유사한 포맷을 사용하여 공간 데이터가 레벨의 PCG 컴포넌트에서 그래프로 이동하며, 포인트 생성에 사용됩니다. 포인트는 일련의 노드를 통해 필터링 및 수정되며 출력이 실시간으로 업데이트됩니다. 결과 포인트는 다양한 에셋을 스폰하는 데 사용될 수 있습니다.
PCG 그래프 에셋 생성
PCG 그래프를 생성하려면 다음 단계를 따릅니다.
콘텐츠 드로어 또는 콘텐츠 브라우저에서 우클릭하고 고급 에셋 생성(Create Advanced Asset) > PCG로 이동하여 PCG 그래프(PCG Graph)를 선택합니다.
새 에셋의 이름을 선택하고 Enter를 누릅니다.
PCG 그래프 템플릿
PCG 그래프를 생성한 후, 해당 그래프를 템플릿으로 설정할 수 있습니다. 이렇게 지정한 템플릿은 새 그래프를 생성할 때 컨텍스트 메뉴에서 선택할 수 있습니다. 나이아가라 템플릿과 마찬가지로, 빈 그래프에서 시작하는 대신 PCG 그래프 템플릿을 사용하여 워크플로를 더 신속하게 진행할 수 있습니다.
PCG 그래프를 템플릿으로 설정
PCG 그래프를 템플릿으로 정의하려면 그래프를 열고 다음 단계에 따라 진행합니다.
툴바에서 그래프 세팅(Graph Settings) 버튼을 클릭하여 디테일 패널을 해당 그래프 세팅으로 채웁니다.
디테일 패널의 에셋 정보(Asset Info) 섹션으로 이동하여 템플릿 여부(Is Template) 프로퍼티를 활성화합니다.
이제 그래프가 템플릿 그래프로 정의되었습니다.
템플릿을 사용하여 새 그래프 생성하기
이제 새 그래프를 생성할 때 에셋 이름과 위치를 선택한 다음에 템플릿에서 그래프 생성하기(Create Graph From Template) 창에서 그래프 템플릿을 선택할 수 있습니다. 사용하려는 그래프 템플릿을 선택한 다음 템플릿에서 초기화하기(Initialize From Template) 버튼을 클릭하면 템플릿을 사용하여 새 그래프를 생성할 수 있습니다.
새 PCG 그래프를 생성할 때 템플릿 프롬프트를 비활성화하려면 메뉴 바에서 편집(Edit) > 에디터 개인설정(Editor Preferences)으로 이동합니다. 그런 다음, 검색창을 사용하거나 프로퍼티의 PCG 에디터(PCG Editor) 섹션으로 이동하여 새 그래프에서 템플릿 선택기 표시(Show Template Picker on New Graph) 프로퍼티를 비활성화합니다.
이 프로퍼티를 비활성화하면 새 PCG 그래프를 생성할 때 템플릿에서 그래프 생성하기(Create Graph From Template) 창이 표시되지 않습니다.
PCG 그래프 편집하기
PCG 그래프 에디터를 사용하여 PCG 그래프 에셋을 환경설정하고 편집할 수 있습니다. 이 에디터의 사용법은 블루프린트나 머티리얼 에디터와 유사합니다. PCG 전용 툴과 패널도 일부 있습니다.
번호 | Description |
---|---|
1 | 툴바 |
2 | 노드 팔레트 |
3 | 뷰포트 |
4 | Details panel(디테일 패널) |
5 | 디버그 트리 |
6 | 어트리뷰트 목록 |
블루프린트로 작업하는 것과 마찬가지로, 노드 팔레트에서 노드를 뷰포트로 드래그하거나 컨텍스트 메뉴를 사용하여 그래프에 노드를 추가할 수 있습니다.
PCG 그래프가 PCG 컴포넌트에 할당되어 콘텐츠 생성에 사용된 경우, 해당 그래프에 대한 변경사항은 에디터 뷰포트에서 실시간으로 업데이트됩니다.
PCG 노드
PCG 그래프는 일련의 PCG 노드로 구성되며, 각 노드는 최종 결과물에 영향을 미치는 작업을 수행합니다.
이러한 노드는 다음과 같은 카테고리로 나뉩니다.
카테고리 | Description |
---|---|
블루프린트 | 블루프린트 관련 노드를 포함합니다. 여기에는 PCGBlueprintElement에서 파생된 사용자 블루프린트를 실행하는 일반 노드가 포함됩니다. |
컨트롤 플로(Control Flow) | 그래프를 통해 로직의 흐름을 제어하기 위한 노드를 포함합니다. |
디버그(Debug) | 디버깅에 도움이 되는 노드를 포함합니다. |
밀도(Density) | 포인트 밀도에 영향을 주는 노드를 포함합니다. |
필터(Filter) | 기준에 따라 또는 포인트별로 데이터를 필터링하는 노드를 포함합니다. |
일반(Generic) | 공간 데이터가 아닌 데이터에 영향을 미치는 노드를 포함합니다. |
계층형 생성(Hierarchical Generation) | 계층형 생성(Hierarchical Generation) 모드를 제어하기 위한 노드를 포함합니다. |
입력 출력(Input Output) | Alembic 및 기타 외부 데이터를 로드하기 위한 노드를 포함합니다. |
IO | 외부 데이터와의 상호작용을 제어하는 노드를 포함합니다. |
메타데이터(Metadata) | 포인트 또는 어트리뷰트 세트의 어트리뷰트와 상호작용하는 노드를 포함합니다. |
파라미터(Param) | 액터 또는 블루프린트 변수에서 파라미터 검색을 제어하는 노드를 포함합니다. |
포인트 연산(Point Ops) | 포인트와 해당 프로퍼티에 영향을 주는 노드를 포함합니다. |
샘플러(Sampler) | 볼륨, 서피스 및 메시와 같은 공간 데이터 소스에서 포인트를 생성하는 노드를 포함합니다. |
공간(Spatial) | 데이터 간의 공간 관계를 생성하거나, 해당 내부 공간 데이터를 변경하거나, 데이터를 검색하는 노드를 포함합니다. |
스포너(Spawner) | 새 데이터를 생성하거나 지정된 포인트 위치에 액터를 배치하는 노드를 포함합니다. |
서브그래프(Subgraph) | 서브그래프 사용을 처리하는 노드를 포함합니다. |
블루프린트와 마찬가지로, Comments와 Reroute 노드를 추가하여 그래프의 가독성을 높일 수 있습니다.
어트리뷰트 및 메타데이터
어트리뷰트는 변수와 유사하며 이름과 타입으로 정의된 데이터를 저장합니다. 두 가지 타입의 어트리뷰트가 있습니다.
스태틱 어트리뷰트(Static Attributes): 고정되어 있고 항상 존재하는 어트리뷰트입니다.
$
로 시작합니다(예:$Position
).다이내믹 어트리뷰트(Dynamic Attributes): 런타임에 생성되어 그래프 데이터 메타데이터의 일부로 저장되는 어트리뷰트입니다.
어트리뷰트 셀렉터
일부 PCG 그래프 노드는 어트리뷰트 셀렉터(Attribute Selector)를 통해 스태틱 어트리뷰트와 다이내믹 어트리뷰트 간의 상호 운용성을 제공하는 데 사용할 수 있습니다.
어트리뷰트 셀렉터는 선택한 노드와 함께 사용할 수 있는 어트리뷰트 목록을 제공합니다. 어트리뷰트 셀렉터는 다음과 같은 명명 규칙을 사용합니다.
$로 시작하는 이름은 스태틱 어트리뷰트이고, $가 없는 이름은 다이내믹 어트리뷰트입니다.
@Last
는 이전 노드에서 조작한 마지막 다이내믹 어트리뷰트를 나타냅니다.
예를 들어, Math 노드는 스태틱 및 다이내믹 어트리뷰트에 대한 수학 연산을 수행하는 데 사용됩니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
어트리뷰트 셀렉터 이름 필드는 컴포넌트에서 데이터를 추출하는 데에도 사용할 수 있습니다.
위 이미지에서 $Position.ZYX
는 $Position 컴포넌트의 반전된 값을 제공합니다. 아래는 이러한 방식으로 조작할 수 있는 컴포넌트와 그 타입입니다.
컴포넌트 | 유형(Type) |
---|---|
벡터(Vectors) | |
X, Y, Z, W, x, y, z, w | Double RGBA와 혼합할 수 없습니다. |
R, G, B, A, r, g, b, a | Double XYZW와 혼합할 수 없습니다. |
길이, 크기 | Double 벡터 길이를 반환합니다. |
트랜스폼(Transforms) | |
위치, 포지션 | Vector 3 |
스케일, 3D 스케일 | Vector 3 |
회전 | 쿼터니언 |
로테이터(Rotators) | |
피치, 요, 롤 | Double |
앞쪽, 오른쪽, 위쪽 | Vector 3 |
쿼터니언(Quaternions) | |
벡터 추출기 지원 | 벡터 |
로테이터 추출기 지원 | 로테이터 |
C++ 세팅 오버라이드
일부 세팅은 C++ 프로퍼티 메타데이터에 PCG_Overridable로 표시되어 있습니다. 블루프린트 노드의 경우, 표시되고 인스턴스 편집이 가능한 변수는 오버라이드할 수 있습니다.
오버라이드되면 노드에 핀이 자동으로 고급 핀으로 노드에 추가됩니다. 다음과 같은 두 가지 타입의 핀이 있습니다.
글로벌 오버라이드: 모든 수의 어트리뷰트를 허용하고 세팅 이름과 정확히 일치하는 각 어트리뷰트에 대한 모든 세팅을 오버라이드합니다.
단일 오버라이드: 모든 수의 어트리뷰트를 허용하고 세팅 이름과 정확히 일치하는 어트리뷰트가 발견되면 해당 특정 세팅을 오버라이드합니다. 어트리뷰트가 하나뿐인 경우에는 어떤 이름이든 세팅을 오버라이드합니다.
어트리뷰트 타입은 일치해야 하지만 일부 타입은 변환할 수 있습니다.
정확한 이름이나 타입을 알고 싶다면 오버라이드 핀의 툴팁을 확인하세요.
그래프 파라미터
머티리얼 에디터의 파라미터와 마찬가지로, PCG 그래프 파라미터는 사용자가 생성한 오버라이드 가능한 값으로, 다양한 상황에 맞게 커스터마이징 가능한 그래프를 만드는 데 도움이 됩니다. 새 파라미터를 생성하는 방법은 다음과 같습니다.
PCG 그래프 세팅을 엽니다.
파라미터 옆의 + 버튼을 클릭합니다. 그러면 새 파라미터가 생성됩니다.
새 파라미터 옆의 아래쪽 화살표를 클릭합니다. 이름을 변경하고 타입을 선택합니다.
PCG 그래프에서 파라미터 값을 변경하는 방법은 다음과 같습니다.
PCG 에셋의 디테일(Details) 패널이나 그래프 파라미터에서 값을 변경합니다.
PCG 그래프 인스턴스에서 파라미터 값을 변경하는 방법은 다음과 같습니다.
콘텐츠 브라우저에서 에셋을 열고 값을 변경하거나 PCG 에셋의 디테일 패널에서 값을 변경합니다.
그래프 인스턴스
PCG 그래프 인스턴스는 머티리얼 인스턴스와 비슷하게 작동하며 그래프 파라미터를 활용하여 기존 그래프를 인스턴스나 PCG 서브그래프로 재사용할 수 있습니다.
PCG 그래프 인스턴스를 생성하는 방법은 다음과 같습니다.
레벨에서 PCG 에셋을 선택합니다.
디테일 패널에서 PCG 컴포넌트를 선택합니다.
인스턴스 저장(Save Instance) 버튼을 클릭하여 새 인스턴스를 생성합니다.
새 그래프 인스턴스의 이름을 지정하고 Enter를 누릅니다.
PCG 컴포넌트
프로시저럴 노드 그래프에서 PCG 컴포넌트를 통해 레벨을 샘플링할 수 있습니다. 이 컴포넌트는 프로시저럴 노드 그래프의 인스턴스를 저장하며 에디터와 런타임 모두에서 프로시저럴 콘텐츠의 생성을 관리합니다. PCG 컴포넌트는 액터에 컴포넌트로 추가되거나, 프로시저럴 콘텐츠를 신속히 설정하는 데 유용한 기본 볼륨인 PCG 볼륨의 일부로 사용됩니다.
PCG 그래프를 PCG 컴포넌트에 연결하려면 다음 단계를 따릅니다.
에디터 뷰포트나 아웃라이너에서 연결하려는 PCG 볼륨(PCG Volume) 또는 블루프린트 클래스(Blueprint Class)를 선택합니다.
디테일(Details) 패널에서 PCG 컴포넌트(PCG Component)를 클릭합니다.
그래프(Graph) 드롭다운을 클릭하고 사용하려는 PCG 노드 그래프를 선택합니다.
생성(Generate) 버튼을 클릭하면 결과를 확인합니다.
World Partition Support
When PCG assets are assigned to a World Partition - Data Layer and an HLOD Layer, the PCG graph generates the actors and assigns them to the same data layer and the same HLOD layer.
For more information about using PCG with World Partition, see Using PCG with World Partition.
PCG에서 디버깅하기
디버깅은 PCG 워크플로에서 필수적인 부분입니다.
각 노드에는 PCG 그래프의 각 단계에서 포인트 데이터를 시각화하는 데 사용할 수 있는 다양한 디버그 옵션이 있습니다.
디버그 렌더링
노드 활성화/비활성화
검사
노드의 디테일(Details) 패널에서 디버그(Debug) 체크박스를 선택하거나 D 키를 눌러 각 노드에 대한 디버그 렌더링(Debug Rendering)을 토글합니다.
노드의 디테일(Details) 패널에서 활성화(Enabled) 체크박스를 선택하거나 E 키를 눌러 각 노드를 켜거나 끕니다.
노드를 검사하여 노드가 생성하는 모든 포인트를 어트리뷰트 목록에 표시할 수도 있습니다.
디버그 트리에서 PCG 컴포넌트를 선택합니다.
검사하려는 노드를 우클릭합니다.
검사(Inspect)를 선택합니다. 아니면 A 키를 눌러도 됩니다.
간단한 숲 볼륨 생성하기
프로시저럴 생성 툴의 일반적인 사용 사례는 오픈 월드 환경에서 생물군을 생성하는 것입니다.
다음 단계에 따라 기본적인 숲 생물군 생성기를 만들 수 있습니다.
이 샘플은 팹을 사용하여 다운로드한 메가스캔 나무: 유럽 서어나무(Megascans Trees: European Hornbeam) 컬렉션의 머티리얼과 스태틱 메시를 사용합니다.
레벨 생성하기
언리얼 엔진에서 새 프로젝트를 생성(Create a new Project)합니다.
기본(Basic) 레벨 템플릿을 사용하여 새 레벨을 생성(Create a new Level)합니다. 레벨을 저장합니다.
바닥(Floor) 스태틱 메시를 삭제하고 랜드스케이프 모드를 사용하여 레벨에 새 랜드스케이프를 추가합니다.
스컬프팅(Sculpt) 툴을 사용하여 랜드스케이프에 몇 가지 베리에이션을 추가합니다.
PCG 볼륨 생성하기
현재 액터 배치(Place Actors) 창이 표시되지 않으면, 선택(Selection) 모드로 돌아가서 창을 활성화합니다.
클래스 검색(Search Classes) 박스를 사용하여 PCG 볼륨을 찾아 레벨에 추가합니다.
PCG 볼륨의 스케일을 X = 8.0, Y = 8.0, Z = 8.0으로 조절합니다.
PCG 그래프 에셋 생성
콘텐츠 드로어 또는 콘텐츠 브라우저에서 우클릭하고 고급 에셋 생성(Create Advanced Asset) > PCG로 이동하여 PCG 그래프(PCG Graph)를 선택합니다.
새 에셋의 이름을 PCG_ForestGen으로 지정하고 Enter를 누릅니다.
PCG_ForestGen을 더블클릭하여 PCG 그래프 에디터를 엽니다.
PCG 컴포넌트 연결하기
에디터 뷰포트 또는 아웃라이너에서 해당 PCG 볼륨을 선택합니다.
디테일(Details) 패널에서 PCG 컴포넌트(PCG Component)를 클릭합니다.
그래프 드롭다운을 클릭하고 목록에서 PCG_ForestGen을 선택합니다.
포인트 생성하기
PCG 그래프 에디터 창에서 그래프에 Get Landscape Data 노드를 추가합니다.
Get Landscape Data 출력을 드래그하여 Surface Sampler 노드를 추가합니다.
표면 샘플러를 선택하고 D 키를 눌러 디버그 렌더링을 토글합니다.
에디터 창으로 돌아가서 PCG 볼륨을 선택하고 디테일 패널에서 생성(Generate) 버튼을 클릭합니다.
이제 에디터 뷰포트에서 생성되는 포인트를 확인할 수 있습니다. 포인트는 랜드스케이프의 모양에 맞춰집니다.
베리에이션 추가하기
PCG 그래프 에디터에서 Surface Sampler를 선택합니다.
디테일 패널에서 제곱미터당 포인트(Points Per Square Meter), 포인트 크기(Point Extents) 및 느슨함(Looseness) 프로퍼티를 조정하여 포인트를 더 추가합니다.
제곱미터당 포인트를 0.15로 조정하여 스페이스에 포인트를 더 추가합니다.
포인트 크기 프로퍼티는 각 포인트의 바운드 크기를 제어합니다. X, Y, Z 값을 50으로 변경합니다.
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 스케일 최대 값을 1.2로 변경합니다.
최종 결과물로, 적정량의 베리에이션이 적용된 포인트 세트가 생겼습니다.
스태틱 메시 스폰하기
PCG 그래프 에디터에서 그래프 뷰포트에 Static Mesh Spawner 노드를 추가합니다. Transform Points 노드의 출력 핀을 Static Mesh Spawner 노드의 입력 핀에 연결합니다.
Static Mesh Spawner를 선택합니다.
디테일(Details) 패널에서 메시 항목(Mesh Entries) 옵션을 찾은 다음 + 버튼을 클릭하여 스폰할 스태틱 메시를 추가합니다.
메시 항목(Mesh Entries) 옆의 아래쪽 화살표를 클릭하여 배열을 엽니다.
인덱스 [0](Index [0]) 옆의 아래쪽 화살표를 클릭합니다.
디스크립터(Descriptor) 옆의 아래쪽 화살표를 클릭합니다.
스태틱 메시(Static Mesh)에 대한 드롭다운 메뉴를 클릭하고 스폰할 나무를 선택합니다. 이 예시에서는 SM_EuropeanHornbeam_Forest_01을 사용합니다.
스태틱 메시를 더 추가하고 배열의 메시 항목별로 가중치(Weight) 프로퍼티를 사용하여 베리에이션을 조정할 수 있습니다. 언리얼 엔진에서는 모든 스태틱 메시 항목의 가중치 값을 더하고 개별 가중치로 나누어 각 항목의 스폰 확률을 결정합니다.