룰 기반 배치
조건부 분기, Attribute Partition, 패턴 매칭으로 복잡한 규칙 기반 프로시저럴 배치를 구현합니다.
Control Flow 노드
Branch, Select, Switch로 조건부 생성 로직 구성
PCG의 Control Flow 카테고리 노드는 그래프 내에서 조건부 분기를 가능하게 합니다. 파라미터 값이나 Attribute에 따라 다른 생성 경로를 선택합니다.
| 노드 | 조건 타입 | 출력 | 용도 |
|---|---|---|---|
Branch |
Boolean | Output A / Output B | 단순 이진 분기 |
Select |
Boolean Attribute | 선택된 입력 전달 | 두 입력 중 하나 선택 |
Select (Multi) |
Integer/Enum/String | 매칭된 입력 전달 | 다중 입력 중 선택 |
Switch |
Integer/String/Enum | 다중 출력 핀 | 다중 경로 분기 |
// Graph Parameter "Season"에 따른 분기
[Graph Parameter]
Season: int32 // 0=봄, 1=여름, 2=가을, 3=겨울
↓
[Switch]
Selection: Season
↓ Output 0 (봄) → 꽃이 핀 나무 + 새싹
↓ Output 1 (여름) → 풍성한 잎 나무 + 키 큰 풀
↓ Output 2 (가을) → 단풍 나무 + 낙엽
↓ Output 3 (겨울) → 앙상한 나무 + 눈 덮인 관목
// 같은 그래프에서 파라미터만 바꿔서 4계절 변형 생성
조건부 메시 매핑
Attribute 값에 따라 다른 메시를 배치하는 패턴
// DataTable: BuildingModuleMapping
// | ModuleID | MeshPath | IsCorner | Floor |
// | 0 | SM_Wall_Plain | false | Any |
// | 1 | SM_Wall_Window | false | Upper |
// | 2 | SM_Wall_Door | false | Ground|
// | 3 | SM_Wall_Corner | true | Any |
// | 4 | SM_Wall_CornerWindow | true | Upper |
[Create Points Grid] // 건물 벽 포인트
↓
[Add Attribute] ("IsCorner") // 모서리 판별
[Add Attribute] ("Floor") // 층 번호
↓
[Load Data Table] // 모듈 매핑 테이블
↓
[Match And Set Attributes]
Match: "IsCorner" + "Floor"
→ "MeshPath" 속성이 각 포인트에 매핑됨
↓
[Attribute Partition] ("MeshPath")
→ 메시별로 분리된 데이터 → 각각 해당 메시 Spawner로
메시 매핑을 DataTable로 외부화하면 그래프를 수정하지 않고 에셋만 교체할 수 있습니다. 레벨 디자이너가 스프레드시트로 쉽게 편집하고, CSV 임포트로 빠르게 반영할 수 있습니다.
Loop와 반복 생성
Loop 노드로 데이터별 반복 처리하기
Loop 노드는 입력 데이터의 각 항목에 대해 서브그래프를 반복 실행합니다. 건물의 각 층, 방의 각 벽면 등 요소별 독립 처리에 유용합니다.
| 프로퍼티 | 설명 |
|---|---|
Subgraph |
반복 실행할 PCG Graph 에셋 |
Loop Body Input |
각 반복에서 서브그래프에 전달되는 데이터 |
Loop Index |
현재 반복 인덱스 (Get Loop Index 노드로 접근) |
// Loop를 활용한 다층 건물 생성
[Create Attribute]
NumFloors: 5 // 5층 건물
↓
[Loop]
Count: NumFloors
Subgraph: SG_BuildFloor // 한 층 생성 서브그래프
↓
// SG_BuildFloor 서브그래프 내부:
[Get Loop Index] // 현재 층 번호
↓
[Create Points Grid] // 해당 층의 벽 포인트
Z Offset = LoopIndex * 300 // 층 높이 3m
↓
[Branch] (LoopIndex == 0)
True → 1층 전용 메시 (문, 상점)
False → 일반 층 메시 (창문, 벽)
World Ray Hit Query
레이캐스트로 환경 감지 기반 배치
World Ray Hit Query는 각 포인트에서 레이캐스트를 발사하여 물리 환경을 감지합니다. 벽에 붙는 장식, 천장 높이 감지, 지면 타입 판별 등에 활용됩니다.
// 건물 내부에서 벽 방향으로 레이캐스트하여 장식 배치
[Volume Sampler] // 건물 내부 볼륨에 포인트
↓
[World Ray Hit Query]
Direction: (1, 0, 0) // X 방향으로 레이캐스트
Max Distance: 1000 // 10m 최대 거리
Output: "HitDistance", "HitNormal"
↓
[Attribute Filter Range]
"HitDistance": 50 ~ 200 // 벽에서 0.5~2m 거리
↓
[Transform Points] // 벽 법선 방향으로 회전
↓
[Spawner: 벽 장식 메시]
World Ray Hit Query는 물리 레이캐스트를 수행하므로 포인트 수가 많으면 비용이 높습니다. 반드시 사전 필터링으로 포인트 수를 줄인 후 사용하세요. 런타임에서는 특히 주의가 필요합니다.
핵심 요약
- Branch, Select, Switch로 파라미터와 Attribute 기반 조건부 분기를 구현한다
- DataTable + Match And Set으로 그래프 수정 없이 메시 매핑을 외부에서 관리한다
- Loop 노드로 층별, 면별 등 요소 단위 반복 처리가 가능하다
- Get Loop Index로 현재 반복 인덱스를 활용한 층별 차별화가 가능하다
- World Ray Hit Query로 물리 환경을 감지하여 벽면/천장 기반 배치를 구현한다
- 복잡한 구조물은 Control Flow + Partition + Loop를 조합하여 규칙 기반 시스템으로 구성한다
도전 과제
배운 내용을 직접 실습해보세요
Exclusion 영역과 Distance Check를 사용하여 건물 주변에 나무가 배치되지 않고, 도로 위에 바위가 나타나지 않는 규칙을 설정하세요. 최소 거리 간격으로 겹침을 방지하세요.
포인트의 위치와 Attribute에 따라 다른 메시를 선택하는 규칙을 만드세요. 교차로에는 신호등, 막다른 길에는 표지판, 건물 입구에는 화분이 배치되도록 구현하세요.
Shape Grammar 개념을 PCG에 적용하여 건물의 벽, 창문, 문, 지붕을 규칙 기반으로 조립하세요. 파라미터(층수, 폭, 스타일)에 따라 다양한 건물이 자동 생성되는 시스템을 만드세요.