프로시저럴 콘텐츠 생성(Procedural Content Generation, PCG) 프레임워크는 언리얼 엔진에서 자체 프로시저럴 콘텐츠와 툴을 제작할 수 있는 툴세트입니다. 이 프레임워크에는 PCG를 사용하여 대규모 월드를 쉽게 생성할 수 있는 여러 가지 PCG 생성 모드가 포함되어 있습니다. 생성 모드는 PCG 컴포넌트의 생성 도메인을 그리드로 분할하며, 각 셀에는 자체 로컬 PCG 컴포넌트가 포함됩니다.
비탈에 나무와 풀, 기타 지면을 덮는 요소를 스폰하는 PCG 숲 예시입니다.
큰 그리드에서는 나무와 바위처럼 시각적으로 눈에 잘 띄는 커다란 메시를 생성할 수 있습니다. 작은 그리드에서는 풀과 꽃, 돌처럼 작은 디테일을 생성할 수 있습니다. 이러한 접근 방식을 통해 PCG 툴을 더 세밀하게 제어하여 실행할 수 있으며 대규모 영역을 다루는 툴의 퍼포먼스를 미세조정할 수 있습니다.
PCG 생성 모드에는 다음과 같은 4가지가 있습니다.
파티셔닝된 생성 사용하기
기본적으로 PCG 컴포넌트에 의해 생성되는 모든 메시는 볼륨 같은 컴포넌트의 도메인 내에 포함되거나 스플라인에 묶여 있습니다. 이 모드는 작은 PCG 에셋에는 적합하지만, 대규모 영역을 덮는 에셋에 사용하면 퍼포먼스 문제가 발생할 수 있습니다. 파티셔닝된 생성(Partitioned Generation)은 사용자 정의 그리드 전체에 걸쳐 결과 메시를 생성합니다. 데이터가 각 셀 간에 분할되므로 월드 파티션 및 레벨 인스턴싱 같은 다른 시스템을 사용하여 더 쉽게 스트리밍할 수 있습니다.
파티셔닝된 PCG 컴포넌트의 예시입니다.
그래프에서 파티셔닝 활성화
PCG 컴포넌트에서 파티셔닝된 생성을 토글하는 방법은 다음과 같습니다.
PCG 볼륨 디테일 패널에서 PCG 파티셔닝된 생성을 토글합니다.
- 레벨에서 PCG 에셋을 선택합니다.
- 디테일(Details) 패널의 파티션 여부(Is Partitioned) 옆에 있는 체크박스를 클릭합니다.
파티션 그리드 크기 환경설정하기
파티션 그리드의 크기는 PCGWorldActor 의 파티션 그리드 크기(Partition Grid Size) 옵션으로 정의합니다.
PCGWorldActor에서 파티션 그리드 크기를 환경설정합니다.
그리드 크기를 환경설정하는 방법은 다음과 같습니다.
- 아웃라이너(Outliner) 에서 PCGWorldActor 를 선택합니다.
- 파티션 그리드 크기(Partition Grid Size) 옵션의 값을 조정합니다.
- 레벨에서 각 PCG 에셋을 선택하고 디테일(Details) 패널에서 정리(Cleanup) 를 선택합니다.
- 생성(Generate) 버튼을 클릭하여 결과를 재생성합니다.
계층형 생성 사용하기
계층형 생성(Hierarchical Generation)은 여러 스케일에서 PCG를 사용한 메시 생성을 지원합니다. 이 타입의 생성은 Grid Size 노드를 사용하여 파티셔닝된 생성에서 사용되는 파티션 그리드 크기를 오버라이드하며 메시 생성을 미세조정할 수 있는 기능을 제공합니다.
작은 그리드 크기로 생성된 하이라이트된 바위를 보여주는 예시입니다.
Grid Size 노드는 다운스트림에서 생성되는 모든 데이터에 대한 생성 그리드의 크기를 커스터마이징하며, 샘플러 노드 앞에 배치해야 합니다.
그래프에서 계층형 생성 활성화하기
PCG 그래프에서 계층형 생성을 활성화하는 방법은 다음과 같습니다.
PCG 그래프 세팅에서 PCG 계층형 생성을 토글합니다.
- PCG 그래프를 열고 그래프 세팅(Graph Settings)을 클릭합니다.
- 계층형 생성 사용(Use Hierarchical Generation) 옆에 있는 체크박스를 클릭합니다.
- 높은 생성 디폴트 그리드 크기(HiGen Default Grid Size)에 대한 드롭다운 박스를 열고 값을 선택합니다.
- PCG 그래프를 저장합니다.
계층형 생성을 사용하려면 PCG 컴포넌트가 파티셔닝되어야 합니다. 이 기능을 사용하기 전에 파티셔닝된 생성이 레벨에서 활성화되어 있는지 확인하세요.
그리드 크기 세팅 환경설정하기
Grid Size 노드를 사용하여 PCG 그래프에서 메시 생성을 커스터마이징하는 방법은 다음과 같습니다.
Grid Size 노드를 사용하여 계층형 생성 그리드 크기를 설정합니다.
- Grid Size 노드를 검색해 디폴트 계층형 생성 그리드 크기를 오버라이드하려는 PCG 그래프의 각 분기에서 샘플러 노드 앞에 추가합니다.
- Grid Size 노드를 클릭하고 높은 생성 그리드 크기(HiGen Grid Size) 세팅을 조정합니다.
- 그래프를 저장합니다.
- 레벨에서 결과를 재생성합니다.
메시의 크기를 사용하여 그래프에서 적절한 그리드 크기를 결정할 수 있습니다. 대형 메시는 소형 메시보다 수가 적을 때가 많으며 용이하게 스트리밍하려면 상대적으로 큰 그리드에 배치해야 합니다. 소형 메시는 수가 더 많으며 상대적으로 크기가 작은 그리드에 배치해야 합니다.
계층형 생성은 다음 실행 가이드라인을 사용합니다.
- PCG 그래프에서 Grid Size 노드를 따르지 않는 노드는 높은 생성 디폴트 그리드 크기 세팅에 정의된 값을 사용하여 데이터를 생성합니다.
- 큰 그리드 크기에서 생성된 데이터는 작은 그리드를 실행하는 동안 캐시된 데이터로 사용할 수 있습니다. 큰 그리드 크기에서 작은 그리드 크기로는 그래프를 따라 아래로 이동하지만, 작은 그리드에서 큰 그리드로는 이동하지 않습니다.
- 노드에 여러 그리드 크기의 데이터를 사용하는 입력이 여러 개 있는 경우, 출력은 가장 작은 그리드 크기를 사용하여 생성됩니다.
언바운드 그리드 크기 사용하기
아래 예시에서 Mesh Sampler 노드는 PCG 볼륨 전반에서 바위 메시를 샘플링합니다.
언바운드 그리드 크기 사용을 보여주는 예시입니다.
샘플러는 높은 생성 디폴트 그리드 크기 로 볼륨 콘텐츠를 샘플링하며 볼륨의 그리드 셀당 하나씩 네 번의 퍼포먼스 집약적인 작업을 실행합니다. 이 그래프 구성을 사용하면 볼륨 크기가 커질수록 퍼포먼스가 저하됩니다.
이런 상황에서는 언바운드(Unbounded) 그리드 크기를 사용하는 것이 좋습니다. 언바운드는 PCG 컴포넌트에 대한 그리드 제한을 없애고 한 번만 이 그리드 크기를 사용하여 노드를 실행합니다. 그런 다음, Grid Size 노드를 사용하여 그리드 제한을 적용할 수 있습니다.
PCG 서브그래프는 그리드 크기가 비활성화되어 있으며 입력 데이터 또는 부모 그래프의 그리드 크기를 사용합니다.
큰 그리드에서 작은 그리드로 데이터를 전달할 때 중복 포인트 데이터가 생성될 수 있습니다. 중복 포인트 데이터는 큰 그리드에 대해 생성된 데이터가 작은 그리드의 모든 그리드 셀에서 리플리케이트될 때 발생하며 퍼포먼스에 심각한 영향을 줍니다. Cull Points Outside Actor Bounds 노드를 사용하여 작은 그리드 셀 외부에 있는 포인트 데이터에서 포인트를 제거하면 중복 데이터를 제거할 수 있습니다.
런타임 생성 사용하기
런타임 생성(Runtime Generation)은 PCG 컴포넌트를 위한 특수 생성 모드로, PCG 생성 소스(PCG Generation Sources) 근처에서 동적으로 생성하고 정리합니다. 에디터 내, PIE, 그리고 독립형 빌드에서 사용할 수 있습니다.

런타임 생성은 계층형 생성과 함께 사용하면 가장 효과적인데, 필요한 곳에만 더 높은 레벨 오브 디테일을 효과적으로 스캐터링할 수 있기 때문입니다.
생성 소스
생성 소스는 근처의 런타임 생성 컴포넌트가 메시를 생성하게 하는 월드의 포인트를 나타냅니다.
월드 파티션과 마찬가지로 PCG는 다음과 같은 소스를 스트리밍 소스로 사용합니다.
- 에디터 뷰포트 소스(Editor Viewport sources): PCGWorldActor 에서 에디터 뷰포트를 생성 소스로 처리(Treat Editor Viewport as Generation Source) 옵션이 켜져 있을 때 활성 또는 포커스된 에디터 뷰포트에 어태치되는 소스입니다.
- 플레이어 소스(Player sources): 레벨의 플레이어 컨트롤러에 어태치되는 소스입니다.
- 월드 파티션 스트리밍 소스(World Partition streaming sources): 플레이어 컨트롤러(PlayerController)나 월드 파티션 스트리밍 소스 컴포넌트(WorldPartitionStreamingSourceComponent) 등, 월드 파티션 시스템에서 스트리밍 소스 제공자 역할을 하는 모든 항목에 어태치되는 소스입니다.
- PCG 생성 소스 컴포넌트(PCG Generation Source Components): 어떤 액터에든 어태치할 수 있는 범용 생성 소스로 사용되는 소스입니다.
PCG 그래프의 생성 반경(Generation Radii) 세팅은 생성 소스가 PCG 컴포넌트에 영향을 미치는 범위를 결정하며 각 파티셔닝된 그리드 크기에 대해 설정됩니다. 런타임 생성 PCG 컴포넌트가 이 반경 안에 있으면 생성이 예약됩니다. 더는 이 반경(반경 배수 정리(Cleanup Radius Multiplier)에 의해 스케일 조절됨) 내에 없는 컴포넌트는 정리됩니다.
디테일 패널에서 생성 반경 오버라이드(Override Generation Radii) 세팅을 토글하여 레벨의 각 PCG 컴포넌트에 대해 생성 반경을 오버라이드할 수도 있습니다.
베이스 생성 반경(Generation Radius) 은 파티셔닝되지 않은 컴포넌트에 적용되며, 파티셔닝된 계층형 생성 컴포넌트에는 언바운드 그리드 레벨이 적용됩니다.
PCG 생성 반경 세팅은 PCG 그래프 세팅에 있습니다.
작은 그리드 크기의 생성 반경이 큰 그리드 크기의 생성 반경보다 커지지 않게 하는 것이 좋습니다. 각 생성 반경은 이전 생성 반경보다 크기가 커야 합니다.
예약 정책
예약 정책은 런타임 생성 컴포넌트 생성이 예약되는 순서에 대한 실질적인 규칙을 제공하는 데 사용됩니다. 디폴트 예약 정책에서는 거리와 뷰 방향을 사용하여 생성 소스 앞과 근처에 있는 컴포넌트를 우선적으로 생성합니다.
예약 정책은 컴포넌트별로 설정되며 PCG 컴포넌트 디테일 패널에 있습니다.
PCG 예약 정책은 PCG 에셋의 디테일 패널에 있습니다.
런타임 생성 활성화하기
PCG 그래프에서 런타임 생성을 활성화하는 방법은 다음과 같습니다.
PCG 에셋의 디테일 패널에서 생성 트리거(Generation Trigger) 를 런타임 시 생성(Generate at Runtime) 으로 변경합니다.
뷰포트에서 런타임 생성을 테스트하는 방법은 다음과 같습니다.
- 아웃라이너(Outliner)에서 PCGWorldActor 를 선택합니다.
- 에디터 뷰포트를 생성 소스로 처리(Treat Editor Viewport as Generation Sourc) 체크박스가 활성화되어 있는지 확인합니다.
뷰포트의 카메라 뷰 주변 반경 내에 생성된 메시가 보여야 합니다.
런타임 생성 환경설정하기
생성 반경은 PCG 그래프 세팅에서 각 그리드 크기 레벨에 대해 정의되며 PCG 컴포넌트의 디테일 패널에서 레벨의 필요에 맞게 설정할 수 있습니다.
생성 반경을 환경설정하는 방법은 다음과 같습니다.
- PCG 그래프 세팅(PCG Graph Settings) 을 열고 런타임 생성(Runtime Generation) > 생성 반경(Generation Radii) 을 펼칩니다.
- 각 그리드 크기에 대한 생성 반경을 조정합니다. 생선 반경 옵션은 디폴트 그리드 크기에 적용되거나 언바운드 옵션을 사용할 때 적용됩니다.
- 반경 배수 정리를 조정합니다. 이 배수는 생성 반경에 적용되어 메시가 레벨에서 제거되는 반경을 결정합니다.
- 그래프를 저장합니다.
이제 PCG 에셋이 뷰어 주변의 반경 내에서만 메시를 생성합니다.
디버깅 및 런타임 오버라이드
런타임 시 런타임 생성 디버깅에 유용한 콘솔 명령이 몇 개 있습니다.
콘솔 명령 | 설명 |
---|---|
pcg.RuntimeGeneration.Enable | 런타임 생성을 토글합니다. |
pcg.RuntimeGeneration.EnableDebugging | 런타임 생성 스케줄러에 대한 상세 로깅을 토글하여 정확한 행동에 대한 인사이트를 얻습니다. |
pcg.RuntimeGeneration.EnablePooling | 런타임 생성 파티션 액터에 대한 풀링을 토글하여 지속적 할당을 방지합니다. 이 옵션은 기본적으로 활성화됩니다. |
pcg.RuntimeGeneration.BasePoolSize | 풀의 런타임 생성 파티션 액터의 초기 수를 설정합니다. 기본값은 100 입니다. |
pcg.RuntimeGeneration.FramesBetweenGraphSchedules | 런타임 생성 스케줄러가 컴포넌트 생성 예약 사이에 대기해야 하는 틱 수를 설정합니다. 예약 정책을 디버깅하여 컴포넌트가 예약되는 정확한 순서를 관찰할 때 유용합니다. 기본값은 0이며, 이 경우 모든 생성을 단일 틱에 예약할 수 있습니다. |
pcg.FrameTime | 프레임당 PCG가 실행될 시간(밀리초)을 할당합니다. 기본값은 16.667 ms입니다. |
pcg.EditorFrameTime | PIE가 아닌 에디터에서 실행 시 프레임당 PCG가 실행될 시간(밀리초)을 할당합니다. 기본값은 50 ms입니다. |
PCG 그래프에서 그리드 크기 시각화하기
디버그 오브젝트 트리(Debug Object Tree)를 사용하여 PCG 그래프의 각 노드에서 사용되는 그리드 크기를 시각화할 수 있습니다.
PCG 그래프에서 그리드 크기를 시각화하는 방법은 다음과 같습니다.
- 왼쪽 하단에 있는 디버그 오브젝트 트리 목록에서 로컬 PCG 컴포넌트를 선택합니다. 각 컴포넌트 이름에는 그리드 크기가 포함되어 있습니다. 예를 들어,
PCGPartitionActor_12800_1_5_0/PCGComponent_1/NewPCGGraph
는 12,800cm 그리드의 일부입니다. - 컴포넌트 이름 옆에 있는 화살표를 클릭하고 컴포넌트를 선택합니다.
계층형 생성 그리드 크기의 시각화를 보여주는 예시입니다.
위의 예시에서는 나무 메시를 스폰하는 컴포넌트가 선택되었습니다(1). 바위 메시(2)와 풀 메시(3)를 스폰하는 노드는 회색으로 표시되어, 해당 노드가 더 작은 그리드 크기로 나무를 스폰하고 있으며 나무 노드 다음에 실행된다는 것을 보여줍니다. 각 노드의 그리드 크기는 오른쪽 상단에 m 단위로 표시됩니다.