1. 프로젝트 설정 및 레벨 디자인
1.1. 모듈식 레벨 디자인
모듈식 에셋은 동일한 규격의 타일 형태로 구성되어 자유롭게 조립할 수 있는 환경 요소입니다. 바닥, 천장, 벽면이 필수적인 기본 빌딩 블록이며 기둥이나 아치 등을 조합해 던전을 완성합니다.
- 주의 사항: 에셋마다 적용된 스케일이 다를 수 있습니다.
- 그리드 스냅: 위층 던전 벽 높이는 600유닛, 아래층은 450유닛이므로 그리드 스냅 단위를 50 혹은 100 단위로 조절하며 배치해야 합니다.
1.2. 아웃라이너 정리
수백 개의 액터가 배치되므로 아웃라이너 패널에서 폴더를 생성하여 관리하는 것이 필수적입니다.
- Courtyard: 안뜰 외부 영역
- Dungeon: 내부 메인 구조물
- Staircase: 층 사이 통로 계단
- Mausoleum: 핵심 보물 보관소 객체
2. 라이팅 및 루멘(Lumen) 시스템
2.1. 라이트의 주요 종류
언리얼 엔진 에디터에서 제공하는 주요 라이트 특징은 다음과 같습니다.
라이트 종류 시스템 특징 및 핵심 게임 용도
| Point Light | 특정 지점에서 360도로 빛을 발산하며 횃불이나 샹들리에 표현에 적합합니다. |
| Spot Light | 원뿔 형태로 뻗어나가는 빛을 방출하며 특정 객체나 보물을 강조하는 핀 조명 역할을 합니다. |
| Rect Light | 넓은 사각 면 전체에서 부드러운 빛을 발산하여 현대적인 실내 조명 구현에 유용합니다. |
| Directional Light | 평행하게 들어오는 거대한 빛으로 태양광 및 달빛을 시뮬레이션합니다. |
| Sky Light | 먼 하늘 및 구름 씬 환경을 실시간으로 캡처하여 전체 맵에 배경 조명을 제공합니다. |
2.2. 루멘 및 액터 모빌리티
루멘은 실시간 전역 조명 및 빛 반사 렌더링 시스템으로, 조명 액터의 모빌리티가 무버블 상태일 때 가장 효과적입니다.
모빌리티 타입 핵심 속성 및 렌더링 설명
| 스태틱 | 위치나 속성이 변경되지 않는 고정된 객체로 사전 라이팅 빌드 연산에 유리합니다. |
| 스테이셔너리 | 위치는 고정되나 빛의 색상이나 세기 등은 게임 플레이 중 변경이 가능합니다. |
| 무버블 | 위치와 속성 모두 런타임 중에 자유롭게 변경할 수 있어 루멘 시스템과 완벽하게 호환됩니다. |
2.3. 라이트 블리딩 해결
실내 공간을 암흑 상태로 만들려면 햇빛이 새어 들어오는 라이트 블리딩 현상을 막아야 합니다. 바닥 타일을 복사해 천장 지붕으로 활용하고, 미세한 틈새는 모서리돌 메시를 덧대어 빛을 차단합니다. 이후 횃불 액터 내부의 포인트 라이트에서 그림자 드리우기 속성을 활성화하여 분위기를 조성합니다.
3. 플레이어 캐릭터 및 C++ 아키텍처
3.1. 충돌 물리 연산(Collision)
캐릭터가 바닥을 뚫고 떨어지거나 벽을 통과하는 현상은 스태틱 메시에 물리적 콜리전 데이터가 없기 때문입니다. 스태틱 메시 에디터에서 단순 박스 형태의 콜리전을 수동으로 추가하고 크기를 조정하여 해결합니다.
3.2. 커스텀 캐릭터 폰 및 게임 모드
기본 일인칭 템플릿의 무기 및 팔 메시는 던전 분위기와 어울리지 않으므로 이를 제거한 새로운 캐릭터 블루프린트를 생성합니다. 새로운 게임 모드 에셋을 생성하여 디폴트 폰 클래스로 지정하고 프로젝트 세팅의 맵 앤 모드에 기본 모드로 등록합니다.
3.3. 상속(Inheritance)과 컴포지션(Composition)
유연한 아키텍처 설계를 위해 두 개념의 차이를 이해해야 합니다.
설계 개념 클래스 간 관계성 시스템 아키텍처 특징 및 장단점
| 상속 | Is-A 계층 구조 | 하위 클래스가 부모의 기능을 통째로 물려받아 구조 변경이나 확장이 어려울 수 있습니다. |
| 컴포지션 | Has-A 소유 구조 | 독립적인 컴포넌트를 조립하듯 부여하므로 모듈화와 재사용성이 매우 뛰어납니다. |
4. C++ 프로그래밍 핵심 개념
4.1. 포인터와 메모리
포인터는 방대한 데이터를 직접 복사하는 대신 실제 저장된 물리적인 메모리 주소 번지만을 가리키는 고효율 데이터 통신 타입입니다. 변수 타입 이름 뒤에 별표(*)를 붙여 선언합니다.
- 역참조 및 화살표 연산자: 포인터 변수 앞에 별표를 붙여 역참조하면 메모리에 직접 도달하여 값을 변경할 수 있습니다. 언리얼 C++에서는 포인터 객체에서 함수를 호출할 때 더 간결한 화살표 연산자(->)를 주로 사용합니다.
- 포인터 vs 참조: 포인터는 언제든 다른 주소를 가리킬 수 있고 널(Null) 상태가 허용되지만, 참조는 최초 생성 시에만 설정 가능하며 널 상태가 허용되지 않습니다.
4.2. 언리얼 엔진 컴파일 과정
- 언리얼 헤더 툴(UHT): 매크로 구문을 분석해 블루프린트와 통신하기 위한 코드를 자동 생성합니다.
- 전처리 단계: 인클루드 지시어를 처리하여 다른 파일 내용을 복사해 옵니다.
- 컴파일 및 링킹: 컴파일러가 오브젝트 파일로 변환하고 링커가 이를 하나로 묶어 실행 파일을 만듭니다.
5. 실전 구현 기술
5.1. 이동 및 보간 (VInterpConstantTo)
목표 위치까지 물체를 부드럽게 이동시키기 위해 수학 라이브러리를 사용합니다. 틱 컴포넌트 내부에서 함수를 호출하여 지속적으로 위치를 갱신합니다.
NewLocation = FMath::VInterpConstantTo(CurrentLocation, TargetLocation, DeltaTime, Speed);
SetActorLocation(NewLocation); [cite: 50]
5.2. 라인 트레이스와 스위프(Sweep)
월드 내의 물리적인 충돌체를 쿼리하는 탐색 기술입니다.
- 라인 트레이스: 시작점부터 끝점까지 선을 그어 경로 상의 오브젝트를 찾습니다.
- 스위프: 일정한 반경을 가진 기하학적 도형을 밀어내며 넓은 범위를 탐색합니다.
- 디버그 시각화: DrawDebugSphere 등을 사용하여 트레이스 경로를 에디터 화면에서 확인할 수 있습니다.
5.3. 물리 핸들과 상호작용
벨로시티 브릿지에서 물체를 잡고 이동시키려면 PhysicsHandle 컴포넌트가 중요합니다.
- 널 포인터 안전성: 컴포넌트 접근 시 널 여부를 검사하는 얼리 리턴 기법을 적용하여 크래시를 방지합니다.
- 물리 객체 슬립 제어: 잠든 상태의 물체는 반응하지 않으므로 잡기 직전에 WakeAllRigidBodies()를 호출해야 합니다.
- 카메라 흔들림 해결: 잡은 물체와 플레이어의 충돌을 방지하기 위해 콜리전 반응을 '차단'에서 '겹침'으로 변경합니다.
6. 데이터 관리 및 제어 흐름
6.1. TArray와 반복문
동적 배열인 TArray를 사용하여 유동적인 개수의 데이터를 관리합니다.
- GetOverlappingActors 함수로 겹친 액터들을 배열로 가져옵니다.
- 범위 기반 For 반복문을 사용하여 가독성 좋게 배열 요소를 순회합니다.
for (AActor* Actor : Actors) {
// 액터 처리 로직
}
6.2. 액터 태그(Actor Tags) 및 논리 연산
트리거가 특정 조건의 액터에만 반응하도록 태그 시스템을 사용합니다. ActorHasTag() 함수로 이를 확인할 수 있습니다. 논리 연산자 중 AND(&&) 연산자의 단축 평가 특성을 활용하면 포인터 유효성 검사와 멤버 함수 호출을 안전하게 한 줄로 작성할 수 있습니
'언리얼엔진 > 언리얼엔진 공부노트' 카테고리의 다른 글
| 언리얼 공부노트 : 향상된 입력 시스템(Enhanced Input)의 이해 (0) | 2026.04.02 |
|---|---|
| 언리얼 공부노트: BasePawn 설계와 탱크 컴포넌트 구조 잡기 (0) | 2026.04.01 |
| 언리얼 엔진 5 C++ 공부 과정 (2) | 2026.03.16 |
| 언리얼 공부노트: 변수 시스템, 함수 구조화 및 블루프린트 연동 핵심 요약 (0) | 2026.03.16 |
| 언리얼 공부노트:블루프린트 핵심 개념 및 객체 지향 프로그래밍 요약 (1) | 2026.03.14 |