Character 클래스 구현
Pawn과 Character Class 정의
1️⃣ Pawn 클래스란?
- Pawn은 플레이어 혹은 AI가 “소유( Possess )”할 수 있는 가장 상위 클래스입니다. 즉, 엔진에서 “무언가를 조종한다”라고 할 때 기본이 되는 형태가 Pawn이 됩니다.
- Pawn에는 이동 로직이나 충돌 처리, 중력, 네트워크 이동을 위한 기능들이 기본적으로 포함되어 있지 않습니다.
- 보행 (걷기, 달리기, 점프 등)에 필요한 시스템 (캡슐 콜리전, 중력, 지형 따라가기)을 모든 단계에서 직접 구현해야 하므로, 사람 캐릭터를 처음부터 Pawn으로 만들기에는 다소 부담이 큽니다.
- 그 대신 비행기, 드론, 카메라처럼 기존 Character의 이동 방식을 벗어난 특수한 로직을 완전히 자유롭게 구현할 때 유용합니다.
2️⃣ Character 클래스란?
- Character는 Pawn을 상속받아 만들어진 자식 클래스 중 하나로, 기본적으로 UCharacterMovementComponent를 포함하고 있습니다.
- 이동, 회전, 점프, 중력, 지형 따라가기, 네트워크 동기화 등 보행형 캐릭터에게 필요한 기능이 이미 구현되어 있어, 사람이 달리고 점프하는 형태의 캐릭터를 쉽게 만들 수 있습니다.
- 여기에 미리 정의된 대표적인 함수들(예: MoveForward, MoveRight, Jump)이 존재하므로, 몇 줄의 코드만 추가해도 금방 캐릭터 움직임을 테스트할 수 있습니다.
- 캐릭터를 구성하는 전형적인 요소들이 표준화되어 있어, 일반적인 인간형 캐릭터를 만드는 데 최적화되어 있습니다.
- 이족보행에 특화되어 있어서, 동물, 자동차나 비행기처럼 완전히 다른 이동 방식을 구현할 때는 Character 내부에 탑재된 기능들이 오히려 방해가 될 수 있습니다. 이런 경우에는 Pawn을 직접 확장해서 사용하는 것을 고려해야 합니다.
Character 클래스 생성하기
1️⃣ Character 클래스 생성
- 언리얼 에디터 상단 메뉴에서 Tools → New C++ Class를 클릭합니다. 부모 클래스로 Character를 선택합니다. 클래스 이름은 MainCharacter로, Public 접근 지정자로 설정한 뒤 Create Class를 클릭합니다.


해당 코드 자동으로 완성
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MainCharacter.generated.h"
UCLASS()
class BC_CH3_ASSIGNMENT_4_API AMainCharacter : public ACharacter
{
GENERATED_BODY()
public:
// Sets default values for this character's properties
AMainCharacter();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
- C++ 클래스가 생성되면 Content Browser에서 C++ Classes 폴더 내의 MainCharacter 클래스를 우클릭하여, Create Blueprint class based on MainCharacter를 선택합니다.
- 이름을 BP_MainCharacter로 지정하고, Blueprints 폴더에 저장합니다.

2️⃣ Character 클래스 구조 살펴보기
- BP_MainCharacter를 열면, 왼쪽 컴포넌트 트리에 이미 여러 기본 컴포넌트가 포함되어 있습니다.
- CapsuleComponent (Root Component)
- 캐릭터가 벽이나 지형에 충돌하는 범위를 정의하는 콜리전 컴포넌트입니다.
- 캡슐 형태이며, Radius (반지름)와 Half Height (높이 절반)를 조정해 캐릭터의 물리적 크기를 설정할 수 있습니다.
- ArrowComponent
- 캐릭터가 어느 방향을 바라보고 있는지를 표시하기 위해 씬에 화살표를 띄워주는 컴포넌트입니다.
- 게임플레이 로직에는 직접적인 영향을 주지 않고, 주로 편집기에서 시각적 디버깅용으로 사용됩니다.
- SkeletalMeshComponent
- 캐릭터의 3D 모델과 애니메이션을 적용하는 컴포넌트입니다.
- Skeletal Mesh, Anim Blueprint 등을 여기로 할당해 캐릭터의 외형과 동작을 제어합니다.
- StaticMesh 는 고정되어있는 Mesh
- CharacterMovementComponent
- 언리얼 엔진자체에서 캐릭터의 이동, 점프, 중력, 네트워크 동기화 등 물리적 이동 로직을 담당하는 핵심 컴포넌트입니다.
- 언리얼에서 제공하는 주요 이동 함수 (MoveForward, MoveRight, Jump)가 이미 연결되어 있어, 최소한의 코드만으로 캐릭터 조작을 구현할 수 있습니다.

스켈레탈 메시 (Skeletal Mesh)
1️⃣ 스켈레탈 메시 (Skeletal Mesh) 설정
- Skeletal Mesh란?
- Skeletal Mesh는 내부에 뼈대 (Skeleton)를 갖춘 3D 모델을 의미합니다.
- 이 뼈대 (본, Bone)가 부모-자식 관계로 연결되어 있으며, 본이 움직이면 외형 (Mesh)도 함께 움직이게 됩니다.
- 예: 팔, 다리, 머리 등 신체 부위별 본이 존재.
- 본과 메시가 연동되기 때문에, 애니메이션 (Bone 움직임)에 맞춰 캐릭터가 뛰거나 걷는 동작을 구현할 수 있습니다.
- 언리얼 엔진은 물리 엔진과도 연결할 수 있어, Ragdoll(피격 후 쓰러지는) 효과 등 물리 기반 애니메이션 구현도 쉽게 가능합니다.
- Skeletal Mesh는 내부에 뼈대 (Skeleton)를 갖춘 3D 모델을 의미합니다.
- BP_MainCharacter에 Skeletal Mesh 설정
- 언리얼 에디터에서 BP_MainCharacter 를 엽니다.
- 컴포넌트 트리에서 Mesh (CharacterMesh0) 컴포넌트를 선택합니다.
- 우측 Details 패널의 Skeletal Mesh 항목에 스켈레탈 메시를 할당합니다.
- 메시를 적용하면 뷰포트에 자동으로 캐릭터 외형이 표시되고, 머티리얼도 기본으로 연결됩니다.


2️⃣ 메시 위치 및 방향 조정
- 메시 방향 조정
- 언리얼에서 일반적으로 캐릭터의 전방 방향은 X축입니다.
- 그러나 SKM_Manny나 SKM_Quinn의 모델은 Y축을 전방으로 사용하기 때문에, 적용 후 캐릭터가 옆을 보는 것처럼 보일 수 있습니다.
- 이를 해결하려면 Mesh 컴포넌트 선택 후 Details 패널에서 Rotation → Yaw(Z축) 값을 -90도로 조정합니다.
- 이렇게 하면 캐릭터가 엔진의 전방(X축)을 바라보게 됩니다.

- 캡슐 크기와 메시 위치 조정
- 언리얼의 Character 클래스는 최상위 루트로 CapsuleComponent(캡슐 형태 충돌체)를 사용합니다.
- 그 내부 중앙 부분에 Skeletal Mesh가 위치하게 됩니다.
- BP_MainCharacter 뷰포트에서 Mesh 컴포넌트를 선택한 뒤, Location 값을 조정해 캐릭터의 발이 캡슐 바닥에 정확히 닿도록 위치를 맞춥니다.
- 캡슐 충돌 범위가 너무 작거나 크면 게임 플레이 시 충돌 문제가 발생할 수 있으므로, CapsuleComponent를 선택하고 Half Height, Radius 값을 적절히 조절하세요.
- 작업을 마쳤다면 Compile 및 Save 버튼을 눌러 변경 사항을 저장합니다.

Camera
3인칭 게임에서는 플레이어가 캐릭터의 뒤쪽이나 어깨 너머 시점을 보며 이동하는 경우가 많습니다. 이를 위해 SpringArm과 CameraComponent를 추가해야합니다.
1️⃣ SpringArm 및 CameraComponent 추가
- MainCharacter.h를 열고, 아래처럼 스프링 암 (SpringArm)과 카메라(Camera) 관련 클래스를 전방 선언하고 프로퍼티를 추가합니다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MainCharacter.generated.h"
// 미리 선언
// 전방 선언(Forward Declaration)
class USpringArmComponent; // 스프링 암 관련 클래스 헤더
class UCameraComponent; // 카메라 관련 클래스 전방 선언
UCLASS()
class BC_CH3_ASSIGNMENT_4_API AMainCharacter : public ACharacter
{
GENERATED_BODY()
public:
// Sets default values for this character's properties
AMainCharacter();
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
USpringArmComponent* SpringArmComponent = nullptr;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
UCameraComponent* CameraComponent = nullptr;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
// 전방 선언
class USpringArmComponent; // 스프링 암 관련 클래스 헤더
class UCameraComponent; // 카메라 관련 클래스 전방 선언
- VisibleAnywhere, BlueprintReadOnly: 블루프린트에서 보기만 가능하고, C++ 코드 쪽에서만 수정 가능하게 하는 속성입니다.
- Forward Declaration (전방 선언)은 헤더 파일의 의존성을 줄이는 좋은 습관입니다. (필요할 때만 #include를 추가)
- SpringArmComp
- 스프링 암 컴포넌트(카메라 붐). 캐릭터와 카메라 간의 거리를 유지하고, 충돌 시 카메라가 벽 등에 박히지 않도록 위치를 자동 조정해줍니다.
- CameraComp
- 실제로 화면에 표시되는 카메라 컴포넌트입니다. 위치와 회전을 제어하면 게임 뷰가 변경됩니다.
#include "MainCharacter.h"
// 카메라, 스프링 암 실제 구현이 필요한 경우라서 include
// 전방 선언(Forward Declaration) 한것 여기서 (실질적으로 사용하는곳) 포함
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
AMainCharacter::AMainCharacter()
{
PrimaryActorTick.bCanEverTick = true;
// (1) 스프링 암 생성
SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
// 스프링 암을 루트 컴포넌트 (CapsuleComponent)에 부착
SpringArmComp->SetupAttachment(RootComponent);
// 캐릭터와 카메라 사이의 거리 기본값 300으로 설정
SpringArmComp->TargetArmLength = 300.0f;
// 컨트롤러 회전에 따라 스프링 암도 회전하도록 설정
SpringArmComp->bUsePawnControlRotation = true;
//
// (2) 카메라 컴포넌트 생성
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
// 스프링 암의 소켓 위치에 카메라를 부착
CameraComp->SetupAttachment(SpringArmComp, USpringArmComponent::SocketName);
// 카메라는 스프링 암의 회전을 따르므로 PawnControlRotation은 꺼둠
CameraComp->bUsePawnControlRotation = false;
}
- SpringArmComp->bUsePawnControlRotation = true
- 플레이어가 마우스를 움직이면 Controller의 회전 값이 변경되고, 이때 스프링 암도 같이 회전하도록 설정합니다.
- 결과적으로 카메라도 따라 회전하여 3인칭 시점을 자연스럽게 구현할 수 있습니다.
- CameraComp->bUsePawnControlRotation = false
- 이미 스프링 암이 회전을 처리하므로, 카메라 자체는 PawnControlRotation을 사용하지 않도록 합니다.
- 빌드를 마치고 언리얼 에디터로 돌아오면, BP_MainCharacter 블루프린트를 열었을 때 컴포넌트 트리에 SpringArmComp와 CameraComp가 추가된 것을 확인할 수 있습니다.
- 필요한 경우 이 컴포넌트들의 위치나 거리( TargetArmLength )를 블루프린트 레벨에서 미세 조정해도 좋습니다.
- 크게 문제없다면 Compile과 Save를 해둡니다.1️⃣ SpringArm 및 CameraComponent 추가
- SpartaCharacter.h를 열고, 아래처럼 **스프링 암 (SpringArm)**과 카메라(Camera) 관련 클래스를 전방 선언하고 프로퍼티를 추가합니다.
- VisibleAnywhere, BlueprintReadOnly: 블루프린트에서 보기만 가능하고, C++ 코드 쪽에서만 수정 가능하게 하는 속성입니다.
- Forward Declaration (전방 선언)은 헤더 파일의 의존성을 줄이는 좋은 습관입니다. (필요할 때만 #include를 추가)
- SpringArmComp
- 스프링 암 컴포넌트(카메라 붐). 캐릭터와 카메라 간의 거리를 유지하고, 충돌 시 카메라가 벽 등에 박히지 않도록 위치를 자동 조정해줍니다.
- CameraComp
- 실제로 화면에 표시되는 카메라 컴포넌트입니다. 위치와 회전을 제어하면 게임 뷰가 변경됩니다.
- SpringArmComp->bUsePawnControlRotation = true
- 플레이어가 마우스를 움직이면 Controller의 회전 값이 변경되고, 이때 스프링 암도 같이 회전하도록 설정합니다.
- 결과적으로 카메라도 따라 회전하여 3인칭 시점을 자연스럽게 구현할 수 있습니다.
- CameraComp->bUsePawnControlRotation = false
- 이미 스프링 암이 회전을 처리하므로, 카메라 자체는 PawnControlRotation을 사용하지 않도록 합니다.
- 빌드를 마치고 언리얼 에디터로 돌아오면, BP_MainCharacter 블루프린트를 열었을 때 컴포넌트 트리에 SpringArmComp와 CameraComp가 추가된 것을 확인할 수 있습니다.
- 필요한 경우 이 컴포넌트들의 위치나 거리( TargetArmLength )를 블루프린트 레벨에서 미세 조정해도 좋습니다.
- 크게 문제없다면 Compile과 Save를 해둡니다.
SpringArmComponent 공식문서:https://dev.epicgames.com/documentation/unreal-engine/API/Runtime/Engine/USpringArmComponent
추천
[Unreal Engine/UE 기초] - GameMode | [언리얼 엔진 C++ (Unreal Engine C++)]
[페이지] Unreal Engine | 언리얼 엔진