본문 바로가기
언리얼엔진/언리얼엔진 공부노트

언리얼 공부노트: BasePawn 설계와 탱크 컴포넌트 구조 잡기

flyon 2026. 4. 1.

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'으로 지정하면 게임 시작 시 해당 탱크 시점으로 전환되며 조작 권한을 얻게 됩니다.
profile
작심삼일을 무한으로 반복하는 지식세포 키우기
✏️ ⚙️