Character 클래스 구현 | [언리얼 엔진 C++ (Unreal Engine C++)]

2026. 6. 8. 19:46·Unreal Engine/UE 기초

 

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

 

 


 

스켈레탈 메시 (Skeletal Mesh)

 

1️⃣ 스켈레탈 메시 (Skeletal Mesh) 설정

  • Skeletal Mesh란?
    • Skeletal Mesh는 내부에 뼈대 (Skeleton)를 갖춘 3D 모델을 의미합니다.
      • 이 뼈대 (본, Bone)가 부모-자식 관계로 연결되어 있으며, 본이 움직이면 외형 (Mesh)도 함께 움직이게 됩니다.
      • 예: 팔, 다리, 머리 등 신체 부위별 본이 존재.
    • 본과 메시가 연동되기 때문에, 애니메이션 (Bone 움직임)에 맞춰 캐릭터가 뛰거나 걷는 동작을 구현할 수 있습니다.
    • 언리얼 엔진은 물리 엔진과도 연결할 수 있어, Ragdoll(피격 후 쓰러지는) 효과 등 물리 기반 애니메이션 구현도 쉽게 가능합니다.
  • 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 | 언리얼 엔진

 

 

저작자표시 동일조건 (새창열림)
'Unreal Engine/UE 기초' 카테고리의 다른 글
  • 캐릭터 애니메이션 적용 | [언리얼 엔진 C++ (Unreal Engine C++)]
  • Enhanced Input System 입력 매핑 구현하기 | [언리얼 엔진 C++ (Unreal Engine C++)]
  • GameMode | [언리얼 엔진 C++ (Unreal Engine C++)]
  • UE_LOG & On-Screen Debug Message | [언리얼 엔진 C++ (Unreal Engine C++)]
DevCol
DevCol
DevCol (Development Collaboration). 함께 개발 & 공부 & IT 정보 나눔장소
  • DevCol
    DevCol (Development Collaboration)
    DevCol
  • 블로그 메뉴

    • Unreal Engine
    • TIL
    • 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
    • 분류 전체보기 (73) N
      • Unreal Engine (31) N
        • Project (2) N
        • Dev Log (0)
        • Debugging (2) N
        • Blueprint (1)
        • UE 기초 (25) N
        • UE 심화 (0)
        • TA (1) N
      • Programming Language (0)
        • C++ (0)
        • C# (0)
      • Unity Engine (0)
      • 자격증 (3)
        • 게임국가기술자격검정 [한국콘텐츠진흥원] (3)
      • Coding Test | 코딩테스트 (0)
        • 프로그래머스 기초 (0)
        • 프로그래머스 입문 (0)
      • TIL (38) N
        • Boot Camp (32) N
      • Git & Github (1)
  • 링크

    • Youtube
    • GitHub
    • itch.io
    • Blog (En)
  • 공지사항

  • 인기 글

  • 태그

    언리얼 엔진
    c
    게임개발
    C++
    cpp
    UE
    Devlog
    UE5
    til
    Programming
    Boot Camp
    내일배움캠프
    코드 카타
    Unreal engine
    프로그래밍
    기초
    코드카타
    게임 개발
    Code Kata
    Game Dev
  • 최근 글

  • GitHub Youtube itch
  • hELLO · Designed By 정상우.v4.10.6
  • DevCol
    Character 클래스 구현 | [언리얼 엔진 C++ (Unreal Engine C++)]
    상단으로

    티스토리툴바