2-1. Character 클래스를 활용한 캐릭터 구현하기
1. GameMode 이해하기
GameMode
- 게임의 전반적인 규칙과 흐름을 총괄 관리 역할을 하는 클래스
GameMode의 주요 기능과 책임
플레이어 Pawn/Character 스폰
- 게임이 시작될 때, 플레이어가 리스폰될 때 → DefaultPawnClass, 지정한 Pawn 클래스를 자동으로 스폰
PlayerController 지정
- 플레이어의 입력을 전달 및 처리
- 어떤 클래스로 동작할지 설정
- 캐릭터에 빙의
게임 규칙 관리
- 게임 전반의 규칙을 정의하고 유지
- 승리/패배를 결정하는 조건을 관리
GameState / PlayerState 사용
- GameState : 전체 게임 흐름 (타이머, 전역 변수 등)
- PlayerState : 플레이어별 정보 (체력, 점수 등)를 관리
- 상태 저장과 관리를 좀 더 체계적으로 하고 싶을 때 유용함
2. GameMode 클래스 생성하기
GameModeBase / GameMode
GameModeBase
- 좀 더 단순화된 형태로, 멀티플레이 관련 로직이 거의 포함하지 않음
- 간단한 싱글 플레이 게임 또는 직접 멀티플레이 로직을 구현하고 싶을 때 사용
GameMode
- 언리얼에서 제공하는 멀티플레이 기능을 일부 포함
- 싱글 플레이에서도 문제없이 사용
- 필요에 따라 GameState, PlayerState 등 연동이 활성화 가능
C++ 클래스 GameMode 생성
Tools → New C++ Class → Common Classes 목록 or 검색창 → GameMode 선택
- 클래스 접근 수준 Public으로 설정
- 클래스 이름 지정 ( 예시: SpartaGameMode)
GameMode 클래스 적용
직접 만든 C++ GameMode 클래스를 게임에서 활용하려면 일반적으로 블루프린트 클래스로 한 번 더 감싸는 방식을 권장
→ 에디터에서 세부 파라미터를 수정하기 훨씬 편리함
Content Browser → SpartaGameMode 우클릭 → Create Blueprint Class based on SpartaGameMode 선택
이름 지정 후(BP_SpartaGameMode), Blueprints 폴더 생성
이 프로젝트에서 만든 모든 레벨에 총괄 관리자가 이 클래스로 설정하겠다는 의미
GameMode를 적용하는 방법
1) 프로젝트 전역 설정
- Edit → Project Settings → Maps & Modes
- Default GameMode를 BP_SpartaGameMode로 지정
- → 이 프로젝트의 모든 레벨에 대해 기본 GameMode가 BP_SpartaGameMode가 됨
2) 레벨 별 설정
- Window → World Settings → GameMode Override를 BP_SpartaGameMode로 지정
- 이 특정 레벨은 프로젝트 전역 설정 대신 BP_SpartaGameMode 를 사용하게 됨
프로젝트 전역 설정과 레벨 별 설정이 충돌할 경우
- 레벨 별 설정 (World Settings)이 우선 적용
- 레벨에서 오버라이드된 GameMode가 존재한다면 그 레벨에서는 해당 GameMode를 사용
- 그렇지 않은 레벨은 전역에 설정된 GameMode를 사용
GameMode 기본 설정 확인
Default Pawn Class
- 레벨 시작 시 플레이어가 조종하게 될 Pawn (또는 Character) 클래스 지정
HUD Class
- 게임 화면에 표시되는 HUD(UI) 요소를 관리하는 클래스 지정
Player Controller Class
- 플레이어 입력 처리와 카메라 제어, UI와의 상호작용을 담당하는 클래스 지정
Game State Class / Player State Class
- 게임의 전역 상태나 플레이어별 상태를 추적할 때 사용
Spectator Class
- 관전자 모드에서 사용할 Pawn 클래스 지정
- 일반 플레이어와 다른 이동 방식이나 카메라 제어가 필요할 때 활용

게임 실행 시, 기본 설정이 자동으로 스폰
BP_SpartaGameMode (내부적으로 SpartaGameMode)가 게임의 규칙을 총괄하는 GameMode로 동작

3. Pawn과 Character 클래스 이해하기
Pawn 클래스
- 플레이어 또는 AI가 소유할 수 있는 가장 상위 클래스
- 엔진에서 무언가를 조종할 때 기본이 되는 형태
이동 로직, 충돌 처리, 중력, 네트워크 이동을 위한 기능들이 기본적으로 포함
보행에 필요한 시스템 (캡슐 콜리전, 중력, 지형 따라가기)을 직접 구현해야함
→ 사람 캐릭터를 처음부터 Pawn으로 만들기는 어렵고 부담됨
기존 Character의 이동 방식을 벗어난 특수한 로직을 완전히 자유롭게 구현할 때 유용 (비행기, 드론, 카메라 등)
Character 클래스
- Pawn을 상속받아 만들어진 자식 클래스
- 기본적으로 UCharacterMovementComponent를 포함
보행형 캐릭터에게 필요한 기능이 이미 구현
사람이 달리고 점프하는 형태의 캐릭터를 쉽게 만들 수 있음
자동차나 비행기처럼 완전히 다른 이동 방식을 구현할 때, Character 내부에 탑재된 기능들이 오히려 방해가 될 수 있음
4. Character 클래스 생성하기
생성 방법
- Tools → New C++ Class → 부모 클래스로 Character 선택
- 이름 설정 (예시: SpartaCharacter)
- 접근 지정자 Public
C++ 클래스가 생성되면
- Content Browser → SpartaCharacter 클래스를 우클릭 → Create Blueprint class based on SpartaCharacter
- 이름 설정 BP_SpartaCharacter
SpartaCharacter.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "SpartaCharacter.generated.h"
UCLASS()
class SPARTAPROJECT_API ASpartaCharacter : public ACharacter
{
GENERATED_BODY()
public:
ASpartaCharacter();
protected:
virtual void BeginPlay() override;
virtual void Tick(float DeltaTime) override;
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
SpartaCharacter.cpp
#include "SpartaCharacter.h"
ASpartaCharacter::ASpartaCharacter()
{
PrimaryActorTick.bCanEverTick = true;
}
void ASpartaCharacter::BeginPlay()
{
Super::BeginPlay();
}
void ASpartaCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void ASpartaCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
}
Character 클래스 구조 살펴보기
Capsule Component (콜리전 컴포넌트 라고도 함)
- 캐릭터가 벽이나 지형에 충돌하는 범위를 정의
ArrowComponent
- 캐릭터가 어느 방향을 바라보고 있는지를 표시하기 위해 씬에 화살표를 띄워주는 컴포넌트
SkeletalMeshComponent
- 캐릭터의 3D 모델과 애니메이션을 적용하는 컴포넌트 (뼈대를 중심으로 움직이는 메시)
CharacterMovementComponent
- 캐릭터의 이동, 점프, 중력, 네트워크 동기화 등 물리적 이동 로직을 담당하는 핵심 컴포넌트


5. 카메라 및 GameMode 설정하기
SpringArm, CameraComponent 추가
미리 선언 방식
헤더 파일의 상단이나 변수 선언부 앞에 class 클래스명; 을 작성
헤더 파일에서 #include 를 계속 사용하면, 해당 클래스가 수정될 때마다 그 헤더를 포함한 모든 파일이 다시 컴파일
전방 선언을 사용하면 헤더 간의 의존성이 줄어들어 컴파일 속도가 훨씬 빨라짐
SpartaCharacter.h

SpartaCharacter.cpp

VisibleAnywhere, BlueprintReadOnly
- 블루프린트에서 보기만 가능
- C++ 코드 쪽에서만 수정 가능하게 하는 속성
SpringArmComp
- 캐릭터와 카메라 간의 거리를 유지
- 충돌 시 카메라가 벽 등에 박히지 않도록 위치를 자동 조정을 해줌
SpringArmComp->bUsePawnControlRotation = true
- 레이어가 마우스를 움직이면 Controller의 회전 값이 변경 → 스프링 암도 같이 회전하게 설정
- 카메라도 따라 회전하여 3인칭 시점을 자연스럽게 구현
CameraComp->bUsePawnControlRotation = false
- 이미 스프링 암이 회전을 처리하기 때문에 카메라 자체는 PawnControlRotation을 사용하지 않도록 설정
빌드 이후 에디터에 추가된 모습

필요한 경우 컴포넌트들의 위치나 거리를 블루프린트 레벨에서 미세 조정하기
GameMode에서 DefaultPawnClass 설정
SpartaGameMode.h

SpartaGameMode.cpp

DefaultPawnClass =
- 설계도를 지정하는 곳
- (어떤 집을 지을지 물어볼 때, 집을 보여주는 게 아니라 설계도를 건주는 것과 같음)
ASpartaCharacter
- 클래스 이름
StaticClass()
이 클래스에 대한 메타 정보 (설계도면)를 호출하는 정적 함수
클래스 정보를 넘겨서 반환해야될 때 많이 쓰임
DefaultPawnClass = ASpartaCharacter::StaticClass();
- 정보를 언리얼 엔진에게 전달하는 과정
- (앞으로 만들 캐릭터들은 ASpartaCharacter 라는 설계도를 따를 것)
위에 코드가 있다면
- 게임 시작 시 SpartaCharacter가 자동으로 스폰
- PlayerController와 연결되어 플레이어가 조작 가능
BP_SpartaCharacter 로 한번 더 감싼 클래스로 캐릭터를 구현했기 때문에
GameMode Default Pawn Class를 BP_SpartaCharacter로 다시 설정하기
'C++와 Unreal Engine으로 3D 게임 개발' 카테고리의 다른 글
| C++와 Unreal Engine으로 3D 게임 개발 2-3 (0) | 2026.06.10 |
|---|---|
| C++와 Unreal Engine으로 3D 게임 개발 2-2 (0) | 2026.06.10 |
| C++와 Unreal Engine으로 3D 게임 개발 1-7 (0) | 2026.06.08 |
| C++와 Unreal Engine으로 3D 게임 개발 1-6 (0) | 2026.06.08 |
| C++와 Unreal Engine으로 3D 게임 개발 1-5 (0) | 2026.06.07 |