언리얼 엔진의 프로시저럴 콘텐츠 제너레이션 프레임워크에서 셰이프 그래머의 일반적인 사용 사례는 시스템을 빌드하는 것입니다. 이 예시에서는 그래머를 사용하여 스플라인을 따라 여러 개의 스태틱 메시를 스폰하고 스플라인 컨트롤 포인트가 변경되면 메시를 변경하는 펜스 제너레이터를 생성합니다.
이 샘플에서는 팹에서 무료로 이용할 수 있는 프라이버시 펜스 팩(Privacy Fence Pack, 손상된 섹션 포함)을 사용합니다. 하지만, 이 예시는 원하는 스태틱 메시를 사용하여 만들 수 있습니다.
전제 조건
이 하우투 가이드에서는 다음 문서에서 설명한 용어와 개념을 사용합니다.
프로젝트 구성
언리얼 엔진에서 새 프로젝트를 생성(Create a new Project)합니다.
기본(Basic) 레벨 템플릿을 사용하여 새 레벨을 생성(Create a new Level)합니다. 레벨을 저장합니다.
편집(Edit) > 플러그인(Plugins)을 열고 다음 플러그인이 활성화되어 있는지 확인합니다.
프로시저럴 콘텐츠 제너레이션 프레임워크(Procedural Content Generation Framework (PCG))
프로시저럴 콘텐츠 제너레이션 프레임워크 지오메트리 스크립트 인터롭(Procedural Content Generation Framework (PCG) Geometry Script Interop)
스플라인 생성하기
PCG 그래프는 새 블루프린트 클래스에 포함된 PCG 컴포넌트와 스플라인에 연결됩니다. 다음 단계에 따라 블루프린트 클래스를 생성합니다.
콘텐츠 드로어(Content Drawer) 또는 콘텐츠 브라우저(Content Browser)에서 우클릭하고 블루프린트 클래스(Blueprint Class)를 선택하여 새 블루프린트 클래스를 생성합니다.
새 블루프린트 클래스 이름을 FenceSpline으로 지정합니다.
컴포넌트(Components) 탭에서 유틸리티 스플라인(Spline) 및 PCG 컴포넌트를 추가합니다.
블루프린트 클래스를 저장합니다.
PCG 그래프 에셋
PCG 그래프(PCG Graph)는 펜스 제너레이터의 기반이며 스플라인을 따라 펜스 섹션을 생성하는 데 사용되는 인스트럭션을 포함합니다. 다음 단계에 따라 새 PCG 그래프 에셋을 생성합니다.
콘텐츠 드로어 또는 콘텐츠 브라우저에서 우클릭하고 PCG로 이동한 다음 PCG 그래프를 선택합니다.
새 에셋 이름을 PCG_FenceGen으로 지정하고 Enter를 누릅니다.
PCG_FenceGen을 더블클릭하여 PCG 그래프 에디터(PCG Graph Editor)를 엽니다.
PCG 그래머 생성하기
그래머는 그래프 파라미터에 스트링으로 저장됩니다. 파라미터에 값을 저장하면 파라미터 오버라이드(Parameter Overrides)를 사용하여 레벨에 있는 펜스 제너레이터의 각 인스턴스를 커스터마이징할 수 있습니다. 그런 다음 그래머(Grammar) 어트리뷰트가 스플라인 데이터에 추가되고 Subdivide Spline 노드를 통해 스플라인을 따라 할당된 포인트에 전달됩니다.
PCG 그래프 에디터 창에서 그래프에 Get Spline Data 노드를 추가합니다.
화면 상단의 버튼을 클릭하여 그래프 세팅(Graph Settings)을 열고 새 파라미터(Parameter)를 생성합니다. 새 파라미터 이름을 Grammar로 지정하고 타입을 스트링(String)으로 변경합니다.
Grammar의 초기 값을
A*로 설정합니다. 이렇게 하면 그래프에 초기 스태틱 메시를 배치한 다음, 공간이 남지 않을 때까지 나머지 스플라인을 스태틱 메시로 채우도록 지시합니다.Get Spline Data 출력을 드래그하여 Add Attribute 노드를 생성합니다. 디테일(Details) 패널에서 출력 타깃(Output Target)을
Grammar로 변경합니다.Grammar 파라미터에 대한 Get 노드를 생성하고 Add Attribute 노드의 어트리뷰트(Attributes) 입력에 연결합니다.
불완전한 서브디비전 수락(Accept Incomplete Subdivision) 체크박스를 클릭합니다.
그래머를 어트리뷰트로(Grammar as Attribute) 체크박스를 클릭하고 그래머 어트리뷰트(Grammar Attribute)를
Grammar로 설정합니다.
그래머에 메시 할당하기
그래머의 각 심볼에는 스폰할 스태틱 메시를 할당해야 합니다. 스태틱 메시는 모듈 정보(Module Info) 및 메시 정보(Mesh Info)라는 두 개의 파라미터를 사용하여 할당합니다. 모듈 정보에는 심볼의 배열이 포함되어 있습니다. 메시 정보에는 스태틱 메시의 배열이 포함되어 있습니다. 이 정보는 나중에 어트리뷰트 세트로 Subdivide Spline 노드에 전달됩니다.
Subdivide Spline 노드를 선택하고 모듈 정보를 입력으로(Module Info as Input) 체크박스를 클릭합니다. 그러면 그래머 심볼에 모듈 정보를 할당하는 데 사용할 수 있는 어트리뷰트에 대한 입력이 추가됩니다.
그래프 세팅에서 새 파라미터를 생성하고 이름을 Module Info로 지정합니다. 타입을 PCG 서브디비전 서브모듈(PCG Subdivision Submodule)로 변경하고 타입 옆의 드롭다운 메뉴를 클릭하여 배열(Array)을 선택합니다. 여기에 심볼 정보가 저장됩니다.
+ 버튼을 클릭하여 새 배열 요소를 추가하고 Index [0] 옆의 화살표를 클릭하여 항목을 엽니다.
심볼(Symbol) 값을
A로 설정하고 스케일 가능(Scalable) 옵션 옆의 체크박스를 클릭합니다.그래프 세팅에서 새 파라미터를 생성하고 이름을 Mesh Info로 지정합니다. 타입을 스태틱 메시로 변경하고 타입 옆의 드롭다운 메뉴를 클릭하여 배열(Array)을 선택합니다. 여기에 스태틱 메시 정보가 저장됩니다.
+ 버튼을 클릭하여 메시 정보에 새 배열 요소를 추가합니다.
Index [0] 옆의 드롭다운 메뉴를 열고 Fence_17_DE 스태틱 메시를 선택합니다.
정보 추출 서브그래프 생성하기
서브디비전 프로세스에서는 각 모듈에 크기를 할당하고 바운드의 중간에 피벗 포인트를 배치합니다. 이렇게 하면 나중에 메시가 변경되는 경우나 메시 중간에 피벗이 없는 경우 문제가 발생합니다. 이 서브그래프는 선택한 메시의 바운드에서 직접 크기 정보를 추출하고 피벗 포인트가 중앙에 오도록 조정합니다.
Input 노드 구성하기
콘텐츠 드로어 또는 콘텐츠 브라우저에서 새 PCG 그래프를 생성하고 이름을 PCG_ExtractInfo로 지정합니다.
Input 노드를 클릭하고 디테일 패널에서 핀(Pins) 옵션을 엽니다. Index [0]을 열고 라벨(Label)을
Mesh Info로 변경합니다.허용된 타입(Allowed Types) 옵션을 포인트 또는 파라미터(Point or Param)로 변경합니다.
핀 상태(Pin Status) 옵션을 노멀(Normal)로 변경합니다.
툴팁(Tooltip)을
정보를 추출할 메시 목록(List of meshes to extract info from)으로 설정합니다.
메시 바운드 추출하기
그래프 세팅(Graph Settings)을 열고 새 파라미터를 생성합니다. 이름을 Mesh Attribute Name으로 지정하고 타입을 이름(Name)으로 설정합니다. 초기 값을
Mesh로 설정합니다.Input 노드의 출력에서 드래그하여 Attribute Rename 노드를 생성합니다.
디테일 패널에서 새 어트리뷰트 이름(New Attribute Name)을
Mesh로 설정합니다.Get Mesh Attribute Name 노드를 생성하고 Attribute Rename 노드의 이름을 변경할 어트리뷰트(Attribute to Rename) 입력에 연결합니다.
Attribute Rename 노드에서 드래그하여 새 Bounds From Mesh 노드를 생성합니다.
새 노드를 클릭하고 메시 어트리뷰트(Mesh Attribute) 값을
Mesh로 설정합니다.Attribute Rename 노드의 출력에서 드래그하여 Bounds From Mesh 노드의 어트리뷰트(Attribute) 입력에 연결합니다. 그래프가 자동으로 적절한 입력을 생성하기 위한 필터를 생성합니다.
ALT 키를 누른 상태로 새 필터 노드의 출력을 클릭하여 연결을 끊습니다.
연결이 끊어진 필터 노드에서 드래그하여 Attribute Set To Point 노드를 생성합니다. 해당 노드의 출력을 Bounds From Mesh 노드의 입력에 연결합니다. 이렇게 하면 그래프가 포인트 및 어트리뷰트 세트 데이터 타입을 모두 지원할 수 있게 됩니다.
Bounds From Mesh 노드를 클릭하고 메시 어트리뷰트(Mesh Attribute) 옵션의 값을
메시(Mesh)로 설정합니다.
피벗 포인트 조정하기
스태틱 메시의 피벗 포인트를 스플라인에 올바르게 표시되도록 조정해야 합니다. Bounds From Mesh 노드에서 드래그하여 Multiply 노드를 생성합니다.
새 노드를 클릭하고 입력 소스 1(Input Source 1) 값을
$Extents.X로 설정합니다. 그러면 바운드 데이터에서 X 범위가 추출됩니다.In B 입력에서 드래그하여 Create Attribute 노드를 생성합니다. 더블 값(Double Value)을
2.0으로 변경합니다.Multiply 노드를 다시 클릭하고 출력 타깃(Output Target) 값을
크기(Size)로 변경합니다. 이렇게 하면 전체 X 값에 2를 곱한 값이 출력되어 크기(Size)라는 어트리뷰트에 저장됩니다.Multiply 노드에서 드래그하여 Copy Attributes 노드를 생성합니다. Multiply 출력에서 다시 드래그하여 새 노드의 소스(Source) 입력에 연결합니다. 이 노드는 바운드 데이터에서 Z 범위를 추출하고 필요한 경우 향후 스케일 조절에 사용할 수 있도록 어트리뷰트에 저장합니다.
Copy Attributes 노드를 클릭하고 입력 소스(Input Source)를
$Extents.Z로 설정합니다.출력 타깃(Output Target)을
ExtentsZ로 설정합니다.Copy Attributes 노드의 출력에서 드래그하여 또 다른 Multiply 노드를 생성합니다. 이 노드는 메시의 피벗을 중앙으로 이동하는 데 도움이 됩니다.
In B 입력에서 드래그하여 Create Attribute 노드를 생성합니다. 더블 값(Double Value)을
-1.0으로 변경합니다.다시 Multiply 노드를 클릭합니다. 디테일 패널에서 입력 소스 1(Input Source 1) 값을
$LocalCenter로 설정합니다.출력 타깃(Output Target) 값을
PivotOffset으로 설정합니다.
Output 노드 구성하기
Output 노드를 클릭하고 그래프 끝에 배치합니다.
디테일 패널에서 핀(Pins) 옵션을 엽니다. Index [0]을 열고 허용된 타입(Allowed Types)을 어트리뷰트 세트(Attribute Set)로 변경합니다.
핀 상태(Pin Status) 옵션을 노멀(Normal)로 변경합니다.
Multiply 노드의 출력에서 드래그하여 새 Point to Attribute Set 노드를 생성합니다.
새 노드의 출력을 Output 노드의 Out 핀에 연결합니다.
완성된 그래프를 저장합니다.
PCG_FenceGen 그래프 에디터 창으로 돌아갑니다. 콘텐츠 드로어 또는 콘텐츠 브라우저에서 뷰포트로 PCG_ExtractInfo 그래프 에셋을 드래그 앤 드롭하고 PCG_ExtractInfo 서브그래프 노드 생성(Create PCG_ExtractInfo Subgraph Node)을 선택합니다.
모듈 및 메시 정보 적용하기
PCG_FenceGen 그래프로 돌아가 Add Attribute 노드를 생성하고 Subdivide Spline 노드 근처에 배치합니다.
Get Module Info 노드를 생성하고 Add Attribute 노드의 In에 연결합니다.
Get Mesh Info 노드를 생성하고 Add Attribute 노드의 어트리뷰트 입력에 연결합니다.
Add Attribute 노드의 Out을 PCG_ExtractInfo 서브그래프 노드의 메시 정보(Mesh Info) 입력에 연결합니다.
서브그래프 노드의 출력을 Subdivide Spline 노드의 모듈 정보(Modules Info) 입력에 연결합니다.
Subdivide Spline 노드의 출력에서 드래그하여 새 Match and Set Attributes 노드를 생성합니다. 서브그래프 노드의 출력을 데이터 매치(Match Data) 입력에 연결합니다. 이 노드는 Subdivide Spline 노드에서 포인트 데이터와 그래머를 가져와 해당 파라미터의 모듈 정보 및 메시 정보와 매치합니다.
Match and Set Attributes 노드를 클릭하고 다음 옵션을 설정합니다.
일치 어트리뷰트(Match Attributes) 옆의 체크박스를 클릭합니다.
입력 어트리뷰트(Input Attribute) 및 일치 어트리뷰트(Match Attribute) 값을
심볼(Symbol)로 설정합니다.
피벗 오프셋 트랜스폼 적용하기
Match and Set Attribute 노드의 출력에서 드래그하여 Multiply 노드를 생성합니다. 이 노드는 PCG_ExtractInfo 서브그래프의 데이터를 사용하여 각 메시의 피벗 스케일을 조절합니다.
Match and Set Attribute 노드의 출력에서 드래그하여 Multiply 노드의 In B 입력에 연결합니다.
Multiply 노드를 클릭합니다. 입력 소스 1(Input Source 1) 값을
PivotOffset으로, 입력 소스 2(Input Source 2) 값을$Scale로 설정합니다.Multiply 노드에서 드래그하여 Vector: Transform Direction 노드를 생성합니다. 이 노드는 피벗을 회전하여 스플라인의 포인트에 일치시킵니다.
Multiply 노드의 출력에서 드래그하여 Vector: Transform Direction 노드의 트랜스폼(Transform) 입력에 연결합니다.
새 노드를 클릭하고 작업(Operation)을 트랜스폼 방향(Transform Direction)으로 설정합니다.
입력 소스 1(Input Source 1) 값을
PivotOffset으로, 입력 소스 2(Input Source 2) 값을$Transform으로 설정합니다.Vector: Transform Direction 노드에서 드래그하여 새 Add 노드를 생성합니다. 이 노드는 메시의 피벗 위치에 최종 피벗 오프셋을 추가합니다.
Vector: Transform Direction 노드의 출력에서 드래그하여 Add 노드의 In B 입력에 연결합니다.
입력 소스 1(Input Source 1) 값을
$Position으로, 입력 소스 2(Input Source 2) 값을PivotOffset으로 설정합니다.
스태틱 메시 스폰하기
Add 노드의 출력에서 드래그하여 새 Static Mesh Spawner 노드를 생성합니다. 이 노드는 스플라인을 따라 스태틱 메시를 스폰합니다.
디테일 패널에서 메시 선택 툴 타입(Mesh Selector Type)을 PCGMeshSelectorByAttribute로 설정합니다.
어트리뷰트 이름 값을
Mesh로 설정합니다.그래프를 저장합니다.
레벨에서 FenceSpline 액터를 클릭합니다. 디테일 패널에서 PCG 컴포넌트를 선택하고 드롭다운 메뉴를 사용하여 그래프(Graph) 옵션을 PCG_FenceGen으로 설정합니다.
결과
스플라인 길이를 따라 펜스 스태틱 메시가 일렬로 스폰되는 모습이 보일 것입니다.
그래머에 심볼을 추가하고 모듈 정보에서 정의한 다음 메시 정보에서 스태틱 메시를 할당하여 스태틱 메시를 더 다양하게 추가할 수 있습니다. 이 작업은 그래프 자체에서 수행할 수도 있고 파라미터 오버라이드(Parameter Overrides)를 사용하여 인스턴스별로 수행할 수도 있습니다.
아래 예시에서 펜스 라인에는 다음과 같은 추가적인 특징이 있습니다.
말뚝에는
P심볼 사용.문에는
G심볼 사용.길게 부서진 섹션에는
BL심볼 사용.짧게 부서진 섹션에는
BS심볼 사용.
그래머가 {[A,P]:2,[BL,P]:1,[BS,P]:1}*,[G,P], {[A,P]:2,[BL,P]:1,[BS,P]:1}*로 업데이트되었습니다.