컴퓨터 및 게임 관련 전공인이 아닌 문외한 일반인이 언리얼 엔진을 배우면서 정리한 내용입니다.
그날그날 배웠던 내용을 제가 나중에 보기 위해 정리한 것으로, 지금 당장 보기에 부족한 점이 아주아주 많고 추후에 수정이 될 수도 있습니다.
오탈자 및 잘못 기재된 내용 지적, 부족한 내용 설명은 언제든지 환영입니다.
본글은 언리얼 엔진 5.5.4 버전 영문판을 기준으로 합니다.
----------------------------------------------------------------------------------------------------------------
43일차 학습 내용
- PCG
Building
Intersection
- Landscape에서 PCG 활용
Water - Lake
Water - River
PCG를 사용하여 오브젝트에 오브젝트 배치
Grid
Pathfinding
- Fracture
Chaos Cache Collection
PCG
41일 차에 이어서 "Physics Constraint" 와 관련된 것들을 몇 가지 더 응용해보도록 하겠다.
Building
이번에는 빌딩 모양의 오브젝트를 제작해보도록 하겠다.
새로운 액터 BP와 PCG Graph를 생성해준다.

생성한 액터 BP에 위 그림과 같이 Box Collision과 PCG를 추가해준다.

생성한 PCG Graph로 가서 위 그림과 같이 노드를 생성해주고 이어준다.
Box Collision을 사용하기에 "Volume Sampler" 노드를 사용하였고, 건물을 제작할 때 사용할 외벽 오브젝트의 크기가 200보다 조금 더 크기에, 위 그림과 같이 '210' 으로 설정해주었다.

위 그림과 같이 추가로 노드를 생성하고 이어준다.
위쪽의 "Transform Points" 노드의 z축 Offset 값을 '300' 으로 주고, 아래쪽의 "Transform Points" 노드의 z축 Offset 값은 '0' 으로 주었다.
이렇게 해줄 경우, "Difference" 노드를 사용하였기에 '300' 만큼 z축 위로 띄워서 생성된 것에서 띄우지 않은 것을 빼서 남는 '300' 만큼의 공간에서 오브젝트가 생성되게 된다.

그리고 마지막에는 "Static Mesh Spawner" 노드를 연결해줘서, 삽입하고 싶은 오브젝트를 설정해주면 된다.
이렇게 하여 건물의 천장을 설정해주었다.

벽의 경우도 천장과 비슷하게 위 그림과 같이 노드를 연결해주면 된다.
벽의 경우는 "Transform Points" 노드의 z축 값에 변화를 주는게 아닌 x, y축의 Offset 값에 변화를 줘야한다.
"Union" 노드는 한꺼번에 묶어주는 기능을 하는데, 위 그림 같은 경우는 앞뒤, 좌우의 벽을 서로 묶어주었다.

위 그림과 같이 사방의 벽을 묶어줘도 상관은 없다.

그러면 위 그림과 같이 빌딩 모양의 건물을 생성할 수 있다.
*PCG를 이용하여 오브젝트를 배치할 때, 딱 맞게 끼워맞추려면 Pivot의 위치가 오브젝트의 정중앙에 있어야함


Pivot의 위치가 정중앙이 아닐 경우, 위 그림과 같이 "Modeling" 모드로 이동하여 "XForm" 탭의 "Edit Pivot" 를 통해 Pivot 위치 수정 가능
Intersection
PCG에서 "Intersection" 노드를 활용하여 벽에 문을 삽입해주는 것도 가능하다.

건물에서 사용하였던 벽 오브젝트 뒤쪽에 위 그림과 같이 노드를 생성하고 연결해주면 된다.
"Get Actor Data" 에서 위 그림과 같이 "Must Overlap Self" 와 "Select Multiple" 을 체크해주고, "Actor Selection" 을 "By Tag" 로 바꿔준 뒤 "Actor Selection Tag" 에 'Gate' 를 적어주면 된다.
"Intersection" 노드는 두 개의 영역이 겹치는 부분에 오브젝트를 생성해주는 역할을 한다.
위 그림 같은 경우는 건물의 외벽에 "Gate" 액터가 겹치면 해당 부분의 건물 외벽은 없애고 문 오브젝트를 생성하도록 하는 것이다.

위 그림과 같이 겹친 부분에 문이 생성되는 것을 확인할 수 있다.
Landscape에서 PCG 활용
9일 차에서 배웠던 Landscape와 PCG를 같이 활용해서 지형을 한 번 제작해보도록 하겠다.
우선 "PCG Graph" 를 새로 생성해주고, 좌측 상단에서 "Landscape" 모드로 진입해서 지형을 생성해준다.

"Place Actor" 탭에서 "PCG Volume" 을 검색하여 레벨에 배치하고, 크기를 많이 키워서 레벨을 덮도록 설정해준다.

그리고 "PCG Volume" 에 새로 생성한 "PCG Graph" 를 적용시켜준다.
*변경된 설정이 적용되지 않을 경우, "Generate" 버튼을 누르면 변경된 설정이 적용됨

그리고 생성한 "PCG Graph" 에서 아래 그림과 같이 노드를 생성해준다.

위 노드는 Layer에 따라 오브젝트를 생성하도록 해주는 것이다.
"Layer_5" 노드 뒤에는 나무를 넣어주었고, "Layer_1" 노드 뒤에는 꽃이나 풀을 넣어주었다.
"Layer_5" 를 Landscape에 드러나게 하면 해당 노드 뒤쪽에 연결된 오브젝트들이 생성되고, "Layer_1" 을 Landscape에 드러나게 하면 해당 노드 뒤쪽에 연결된 오브젝트들이 생성된다.

"Surface Sampler" 노드의 "Point Extents" 는 생성되는 오브젝트로부터 얼마만큼의 간격을 유지하며 생성되도록 할 것인지를 정해주는 수치이다.
수치가 클 수록 듬성듬성하게 생성되게 된다.
위쪽에 연결된 오브젝트는 나무 오브젝트이기에 "Point Extents" 수치를 크게 설정해주었다.

"Attribute Filter" 노드는 위 그림과 같이 설정해주면 된다.
"Use Constant Threhold" 를 체크해주고, "Target Attribute" 에는 오브젝트를 드러나게 하고 싶은 속성의 Layer의 이름을 적어준 뒤, "Type" 은 float 형식으로 설정해주고 "Float Value" 에 0~1 값 중 적당한 값을 설정해주면 된다.
"Operator" 에는 주로 '>' 나 '>=' 를 선택하여, 설정한 Layer의 비중이 "Float Value" 보다 크거나, 크거나 같을 경우에 오브젝트를 생성되게 하도록 해주는 것이다.

그러면 위 그림과 같이 Layer에 따라 생성되는 오브젝트가 달라지게 된다.
Water - Lake
Landscape에서 호수나 강 같은 물을 배치해줄 수도 있다.

이 경우 "Plugins" 에서 "Water" Plugin을 설치해줘야한다.

"Water" Plugin을 설치하면 "Place Actor" 에서 "Water" Plugin에 있는 것들을 Landscape에 배치할 수 있게 된다.
우선 호수를 만들어보기 위해 "Lake" 를 생성해주도록 하겠다.

위에서 사용했던 "PCG Graph" 에 위 그림과 같이 추가로 노드를 생성하고 연결해준다.
위 그림은 호수로 설정된 영역 안에서 수초 오브젝트가 생성되도록 해준 것이다.
호수는 Spline으로 설정해준 영역 안에 생성되기에 "Get Spline Data" 노드를 생성하여 연결해주었고, "Get Spline Data" 노드 설정은 위 그림과 같이 해주면 된다.

호수 영역 안을 오브젝트로 채워주는 것이기에 "Spline Sampler" 노드에서 'On Interior' 로 바꿔주면 된다.
여기서 문제는 물과 Layer 위에 생성된 오브젝트가 겹치게 되어 나무가 물 속에 있는 등 부자연스러운 풍경이 나오게 된다.

이 경우 Layer 위에 생성된 오브젝트는 제거해주는 것이 좋기에, 위 그림 같이 노드를 추가로 생성한 뒤 연결해줘서 물과 겹치는 부분에는 오브젝트가 생성되지 않도록 설정해주었다.

그러면 위 그림과 같이 물 속에서는 수초만 생성이 되고, 그 외 Layer 위에 생성되는 오브젝트들은 생성되지 않게 된다.
그리고 "Wave Attenuation Depth" 수치를 조절하여 물결을 조절해줄 수 있는데, 수치가 커질 수록 잔잔해진다.
Water - River
이번엔 호수에 이어 강을 생성해보도록 하겠다.

"Place Actor" 에서 "Water" Plugin에 있는 River를 레벨에 배치해준다.
이번에는 강을 따라 바위를 강 줄기 양 옆과 중앙에 배치해보도록 하겠다.

강 줄기를 따라 배치할 것이기에 "Spline Sampler" 노드에서 "Mode" 를 'Distance' 로 바꿔준다.

"Transform Points" 노드에서는 "Uniform Scale" 을 체크 해제해주고, "Attribute Scale" 을 체크해준다.

그러면 위 그림과 같이 강가를 따라 바위가 배치되게 된다.
PCG를 사용하여 오브젝트에 오브젝트 배치
PCG를 사용하여 오브젝트 위에 오브젝트 배치하기 위해서는 우선 Plugin을 설치해줘야한다.

"Plugins" 에서 "PCG Geometry Script Interop" 을 검색하여 설치해주고, 항상 했던 것처럼 액터 BP와 PCG Graph를 생성해준다.
액터에서 만든 변수를 PCG로 가져와서 사용 가능한데, 이번에는 이 방법을 사용하여 진행을 해보도록 하겠다.

액터 BP에서 Static Mesh와 PCG를 추가해준 뒤, Construction Script에 가서 위 그림과 같이 BP를 작성해준다.
액터 BP의 Static Mesh에 "Log Mesh" 변수를 연결해주는 BP이다.

"PCG Geometry Script Interop" Plugin이 설치돼야 위 그림의 "Mesh Sampler" 노드 생성이 가능하다.
위 그림과 같이 노드를 생성하고 연결해준다.
"Get Actor Data" 노드의 설정은 위 그림과 같이 해주면 된다.
이렇게 해줄 경우 오브젝트 위에 다른 오브젝트가 배치되는데, 너무 빽빽하게 배치되게 된다.

위 그림과 같이 "Attribute Noise" 노드를 생성한 뒤 연결해주고, "Input Source" 를 "Density" 로 설정해준다.
"Density" 는 밀도를 의미하는데, 균일하게 밀집되도록 생성해주는 것이 아닌 "Density" 에 Noise 효과를 줘서 불규칙적으로 생성되도록 해주는 것이다.

그리고 위 그림과 같이 마저 노드들을 연결해준다.

그러면 위 그림과 같이 오브젝트에 오브젝트를 추가로 생성할 수 있다.
하지만 위 그림을 보면 알겠지만 오브젝트가 사방에서 생성되어 바닥과 옆면에서도 생성되어 부자연스러운 모습이 나오게 된다.

이 경우 위 그림과 같이 "Density Filter" 를 2번 사용해서 위쪽을 향한 액터만 남도록 설정해주면 된다.
수치는 위에서 사용했던 "Density Filter" 를 그대로 사용해도 괜찮다.

그러면 위 그림과 같이 위쪽에 배치된 오브젝트들만 남겨진 것을 확인할 수 있다.
생성되는 오브젝트를 Enumerator로 만들어서 생성되는 오브젝트들을 다르게 설정해줄 수도 있다.


우선 위 그림과 같이 Enumerator를 생성해주고, 액터 BP로 가서 위에서 생성한 Enumerator를 변수로 만들어준다.

"Get Actor Property" 노드를 생성하여, "Property Name" 에 'Amount_LowerBound' 를 입력해준다.

"Density Filter" 노드를 드롭다운 한 후, 위에서 생성한 "Get Actor Property" 노드를 'Amount_LowerBound' 핀에 연결해준다.
"Get Actor Property" 노드를 하나 더 생성하고, 이번엔 "Property Name" 에 위에서 생성한 Enumerator 변수인 'E_SpawnType' 을 입력해준다.

"Switch" 노드를 "Get Actor Property" 에 연결하여 각 타입 별로 분리해준 뒤, "Static Mesh Spawner" 노드에 각 타입에 맞는 오브젝트를 넣고 연결해준다.


레벨에 배치한 액터 BP에서 변수를 통한 수치 및 타입 변경을 통해 편하게 관리할 수 있다.
Grid
중심에 있는 오브젝트를 기준을 중심으로 오브젝트 생성를 생성해보도록 하겠다.
항상 했던 것처럼 액터 BP와 "PCG Graph" 를 생성해준다.

이번 액터 BP에서는 "PCG" 만 생성해주면 된다.

이번에는 "Create Points Grid" 노드를 통해 진행을 해줄 것이다.
"Get Actor Data" 노드를 생성하고 "Mode" 를 "Get Single Point" 로 설정해준다.

그리고 위 그림과 같이 노드를 생성하고 이어준다.
위쪽의 "Static Mesh Spawner" 에는 주위에 생성되도록 할 오브젝트를 넣어주었고, 아래쪽의 "Static Mesh Spawner" 에는 중심이 되는 오브젝트를 넣어주었다.

"Density Filter" 의 "Lower Bound" 수치 조절을 통해 기준으로부터 얼마나 떨어진 곳에서부터 오브젝트를 생성할 것인지 설정해줄 수 있다.

그러면 위 그림과 같이 중심으로부터 설정한 거리만큼 떨어진 곳에서부터 오브젝트가 생성되는 것을 확인할 수 있다.
Pathfinding
"PCG" 를 활용하여 길을 자동으로 생성해줄 수 있다.
새로운 레벨을 생성하고 새로운 "PCG Graph" 를 생성해준다.


이번에도 "Create Points Grid" 노드를 사용한다.
"Create Points Grid" 노드의 설정은 위 그림과 같이 해주고, "Attribute Noise" 의 "Output Target" 을 'Density' 로 설정해준다.

"Attribute Filter" 노드를 생성하고, 위 그림과 같이 설정해준다.
"Attribute Filter" 노드를 통해 레벨 상에 존재하는 여러 포인트 중 0번 인덱스를 찾도록 도와주는 역할을 한다.

"Sort Attributes" 의 노드는 위 그림과 같이 설정해준다.
"Sort Method" 에서 "Accending" 은 속성 값이 작은 순서로 정렬하는 것이고, "Decending" 은 속성 값이 큰 순서로 정렬하는 것이다.


"Extents Modifier" 노드와 "Pathfinding" 노드는 위 그림과 같이 설정해주면 된다.

전체적인 "PCG Graph" 를 보면 위 그림과 같이 연결돼있다.

그러면 위 그림과 같이 지정된 시작점부터 목적지까지 길을 자동으로 찾고, 사이에 있는 장애물들은 피해서 길을 생성해주는 것을 확인할 수 있다.
Fracture
Chaos Cache Collection
"Chaos Cache Collection" (이하 "CCC" 라고 칭함) 은 "Fracture" 효과를 Cache로 저장하여 불러오도록 도와주는 기능을 한다.
지난 42일 차에서도 언급했지만 "Fracture" 는 컴퓨터의 자원을 많이 잡아먹기에 남용하면 안된다.
그래서 이를 최적화 하고자 "CCC" 로 저장하여 자원 소모량을 줄여주는 역할을 한다.

"Fracture" 를 효과를 하나 새롭게 생성하고 레벨에 배치해준다.

"Engine" 폴더에서 위 사진에 보이는 경로로 들어가면 "Generic" BP와 "MasterField" BP를 찾을 수 있는데, 이 두 종류의 BP를 사용할 것이다.

"Generic" BP는 오브젝트를 고정시켜주는 역할을 하기에 위 그림과 같이 상하좌우에 배치하여 벽의 가장자리가 무너지지 않도록 설정해주었다.

그리고 "Initialization Fields" 에서 4개의 배열을 생성하여, 위에서 생성한 "Generic" BP를 삽입해준다.

"MasterField" BP는 게임 실행 시 힘을 주는 역할을 하는데, 벽을 격파하는 듯한 느낌을 주기 위해 위 그림과 같이 힘을 주는 방향을 벽 뒤쪽으로 향하도록 설정해주었다.


"CCC" 를 생성하고 레벨에 배치해준 뒤, "CCC" 원본의 "Fracture" 위치를 복사하여 해당 위치로 "CCC" 의 Pivot이 이동하도록 붙여넣어준다.

"Cache Mode" 가 "Record" 인 걸 확인한 후, 게임 플레이 버튼 옆의 "Simulate" 를 눌러 녹화를 해주면 된다.
그리고 파편들이 움직이지 않을 때에 "Simulate" 를 정지시키고, "Cache Mode" 가 "Play" 로 변경시켜 제대로 녹화가 됐는지 확인이 가능하다.
*"Engine" 폴더가 보이지 않을 경우, "Contents Drawer" 의 "Settings" 에서 "Show Engine Content" 를 활성화해주면 됨

'Unreal Engine > GCC Class (5.5.4)' 카테고리의 다른 글
| Unreal Engine 5 배워보기 - 45일차 (2) | 2025.05.27 |
|---|---|
| Unreal Engine 5 배워보기 - 44일차 (0) | 2025.05.26 |
| Unreal Engine 5 배워보기 - 42일차 (1) | 2025.05.22 |
| Unreal Engine 5 배워보기 - 41일차 (0) | 2025.05.21 |
| Unreal Engine 5 배워보기 - 40일차 (1) | 2025.05.20 |