1. 기본 폰 클래스 설계
1.1. 부모 클래스 선정
- 액터 이상의 기능 필요: 객체를 월드에 배치하고 메시로 시각적 표현을 담기 위해서는 단순 액터보다 상위 클래스가 필요합니다.
- 폰(Pawn) 클래스 활용: 플레이어의 입력에 따라 움직여야 하므로 컨트롤러가 빙의할 수 있는 폰 클래스가 가장 적합합니다.
- 캐릭터 클래스 제외: 캐릭터 클래스는 이족보행에 특화된 캐릭터 무브먼트 컴포넌트를 포함하고 있어, 탱크 구현에는 불필요한 기능이 많습니다.
1.2. BasePawn 베이스 클래스 생성
- 공통 기능 통합: 탱크와 포탑의 공통 기능을 하나로 묶어줄 부모 역할의 BasePawn 클래스를 생성합니다.
- 기본 뼈대 구축: 이 클래스 내부에서 형태, 충돌, 발사 로직 등 두 개체가 공유하는 핵심 기능을 코딩합니다.
2. 컴포넌트 구조 이해
2.1. 필수 컴포넌트 구성 요소
- 캡슐 컴포넌트(Capsule Component): 지형이나 물체와의 물리적 충돌을 처리하기 위해 사용합니다.
- 스태틱 메시 컴포넌트(Static Mesh Component): 시각적인 외형을 위해 하단 베이스용과 상단 포탑용으로 각각 구성합니다.
- 씬 컴포넌트(Scene Component): 시각적 형태 없이 발사체가 생성될 정확한 좌표값(Transform)만 저장하는 용도로 사용합니다.
2.2. 계층적 부착 구조
- 루트 설정: 모든 폰은 기준점이 되는 루트 컴포넌트를 가지며, 캡슐 컴포넌트를 생성해 이 자리에 할당합니다.
- 베이스 메시 부착: 하단 베이스 메시는 캡슐에 부착하여 탱크의 전체적인 이동을 따르게 합니다.
- 포탑 메시 부착: 상단 포탑 메시는 하단 베이스 메시에 부착하여, 베이스를 따라다니면서도 마우스 조작에 따라 별도로 회전할 수 있게 합니다.
- 발사 포인트 부착: 발사체 스폰 포인트는 포탑 메시에 부착하여 포신이 회전할 때 발사 지점도 함께 회전하도록 구성합니다.
3. 전방 선언과 컴포넌트 초기화 코드
3.1. 전방 선언의 이점
- 컴파일 최적화: 헤더 파일에서 다른 헤더를 직접 포함하면 파일이 무거워지고 컴파일 시간이 길어집니다.
- 효율적인 선언: 포인터 변수 선언 시 전방 선언 키워드를 통해 클래스의 존재만 알리는 것이 컴파일 효율 면에서 유리합니다.
- 구현부 포함: 세부 구현이 이루어지는 .cpp 파일 내부에서만 실제 컴포넌트 헤더를 포함하여 최적화합니다.
3.2. 헤더 파일 변수 선언
class UCapsuleComponent* CapsuleComp;
class UStaticMeshComponent* BaseMesh;
class UStaticMeshComponent* TurretMesh;
class USceneComponent* ProjectileSpawnPoint;
3.3. 소스 파일 초기화 구현
CapsuleComp = CreateDefaultSubobject<UCapsuleComponent>(TEXT(CapsuleName));
RootComponent = CapsuleComp;
BaseMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(BaseName));
BaseMesh->SetupAttachment(CapsuleComp);
TurretMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(TurretName));
TurretMesh->SetupAttachment(BaseMesh);
ProjectileSpawnPoint = CreateDefaultSubobject<USceneComponent>(TEXT(SpawnPointName));
ProjectileSpawnPoint->SetupAttachment(TurretMesh);
4. 언리얼 프로퍼티 시스템과 블루프린트 연동
4.1. UPROPERTY 접근 제어 지정자
지정자 명칭 블루프린트(에디터) 개별 인스턴스(월드)
| VisibleAnywhere | 읽기 전용 | 읽기 전용 |
| EditAnywhere | 편집 가능 | 편집 가능 |
| VisibleDefaultsOnly | 읽기 전용 | 보이지 않음 |
| EditDefaultsOnly | 편집 가능 | 보이지 않음 |
| VisibleInstanceOnly | 보이지 않음 | 읽기 전용 |
| EditInstanceOnly | 보이지 않음 | 편집 가능 |
4.2. 이벤트 그래프 노출 및 변수 캡슐화
- BlueprintReadWrite: 블루프린트 이벤트 그래프에서 변수 값을 가져오고 수정할 수 있게 합니다.
- BlueprintReadOnly: 이벤트 그래프에서 값을 읽는 것만 허용합니다.
- AllowPrivateAccess: C++의 private 변수를 블루프린트 에디터에 노출시킬 때 사용합니다.
- Category: 디테일 패널에서 연관된 변수들을 그룹화하여 직관적으로 정리합니다.
5. 블루프린트 및 C++ 하위 클래스 확장
5.1. 블루프린트 클래스 파생 세팅
- 클래스 파생: BasePawn을 기반으로 탱크용과 포탑용 블루프린트를 각각 생성합니다.
- 에셋 매핑: 노출된 프로퍼티 창을 통해 탱크와 타워에 맞는 스태틱 메시 에셋을 할당합니다.
- 디테일 조정: 캡슐 컴포넌트 크기를 조정하고, 발사체 생성 지점 위치를 포신 앞부분으로 맞춥니다.
5.2. 탱크 전용 C++ 하위 클래스 생성
- Tank 클래스 구현: 플레이어 시야 제공을 위해 BasePawn을 상속받는 Tank 클래스를 별도로 생성합니다.
- 카메라 시스템: 플레이어 시점 확보를 위해 카메라 컴포넌트와 스프링 암 컴포넌트를 추가합니다.
- 부착 구조: 루트에 스프링 암을, 그 끝에 카메라를 부착하여 지형지물 충돌 시 카메라 거리가 자동 조절되도록 합니다.
- 부모 클래스 변경: 기존 탱크 블루프린트의 부모를 Tank 클래스로 변경하여 카메라 기능을 상속받습니다.
6. 플레이어 빙의 제어권 획득
6.1. 폰 컨트롤 전환
- 제어권 할당: 기본적으로 배치된 폰은 조작할 수 없으므로 제어권 할당 작업이 필요합니다.
- 자동 빙의(Auto Possess Player): 폰 인스턴스의 디테일 패널에서 이 속성을 활성화합니다.
- 권한 획득: 해당 속성을 'Player 0'으로 지정하면 게임 시작 시 해당 탱크 시점으로 전환되며 조작 권한을 얻게 됩니다.
'언리얼엔진 > 언리얼엔진 공부노트' 카테고리의 다른 글
| 언리얼 공부노트 : 트러플 슈팅 (0) | 2026.04.04 |
|---|---|
| 언리얼 공부노트 : 향상된 입력 시스템(Enhanced Input)의 이해 (0) | 2026.04.02 |
| 언리얼 공부 노트: 루멘, 포인터, 그리고 물리 상호작용의 핵심 (0) | 2026.03.25 |
| 언리얼 엔진 5 C++ 공부 과정 (2) | 2026.03.16 |
| 언리얼 공부노트: 변수 시스템, 함수 구조화 및 블루프린트 연동 핵심 요약 (0) | 2026.03.16 |