RPG용 플레이어 생성

DevBison·2025년 8월 25일

언리얼 C++ 캐릭터 직업 클래스 만들기 (전사/마법사)

게임에 직업 시스템을 넣기 위해 전사(Warrior), 마법사(Magician) 같은 캐릭터 클래스를 상속 구조로 구현하는 과정을 정리했습니다.


1. 캐릭터 클래스 생성

캐릭터 클래스 선택

캐릭터를 상속받는 C++ 클래스를 만듭니다.
언리얼의 리플렉션 시스템(UCLASS, UPROPERTY)이 들어가야 GenerateHeader가 자동 생성됩니다.

리플렉션 헤더

Intermediate 폴더에 자동 생성 파일이 들어가고,
실제 코드는 Source 폴더에 저장됩니다.

Intermediate


2. GameInfo 헤더 준비

공통적으로 쓰일 게임 상수를 모아둘 GameInfo.h를 만들어 include 합니다.

GameInfo 헤더


3. PlayerCharacter 클래스 만들기

PlatformCharacter.h에 있던 멤버들을 복사해 PlayerCharacter.h에 붙여줍니다.
단, 이 클래스는 "상속용 베이스 캐릭터"이므로 SkeletalMesh는 지정하지 않습니다.
(추상클래스는 아님 — 반드시 인스턴스 생성 가능해야 함)

PlayerCharacter 헤더

스프링암, 카메라, 콜리전 정도까지만 유지합니다.

스프링암


4. 직업 클래스 생성 (Warrior / Magician)

플레이어캐릭터를 베이스로 파생 클래스를 생성합니다.

파생 클래스 생성

Warrior, Magician 클래스를 각각 만들어줍니다.

Warrior 클래스

각 클래스의 생성자에서 SkeletalMesh를 세팅합니다.
Warrior:

Warrior 생성자

Magician:

Magician 생성자

매쉬 로드 및 캡슐 크기 세팅을 각각 다르게 합니다.
예:

GetCapsuleComponent()->InitCapsuleSize(34.f, 88.f); // 마법사 키 맞춤

5. 입력 시스템 복사 및 확장

IMC(Input Mapping Context)를 복제하고,
UPlatformInput을 기반으로 UGameInput 클래스를 새로 만듭니다.

IMC 복제

Input.cpp도 동일하게 수정합니다.

Input 클래스

PlayerCharacter.cpp의 BeginPlay에 Input Subsystem 등록 코드를 복사해 넣습니다.

#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "../Input/Input.h"

void APlayerCharacter::BeginPlay()
{
    Super::BeginPlay();

    if (APlayerController* PC = Cast<APlayerController>(GetController()))
    {
        if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
            ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PC->GetLocalPlayer()))
        {
            const UGameInput* InputCDO = GetDefault<UGameInput>();
            Subsystem->AddMappingContext(InputCDO->mContext, 0);
        }
    }
}

6. 입력 바인딩 (SetupPlayerInputComponent)

APlatformCharacter에서 쓰던 입력 함수를 PlayerCharacter에도 붙여 넣습니다.

Setup 입력

void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    if (UEnhancedInputComponent* Input = Cast<UEnhancedInputComponent>(PlayerInputComponent))
    {
        Input->BindAction(mMove, ETriggerEvent::Triggered, this, &APlayerCharacter::Input_Move);
        Input->BindAction(mRotation, ETriggerEvent::Triggered, this, &APlayerCharacter::Input_Rotation);
    }
}

7. 디폴트 게임모드 생성

게임모드 베이스를 상속받아 DefaultGameMode 클래스를 만듭니다.

게임모드 생성

GameInfo를 include 하고 Warrior를 디폴트 캐릭터로 지정합니다.

#include "../GameInfo.h"
#include "Warrior.h"
#include "Magician.h"

ADefaultGameMode::ADefaultGameMode()
{
    DefaultPawnClass = AWarrior::StaticClass();
}

게임모드 Warrior 지정

프로젝트 세팅 > 맵 & 모드에서 방금 만든 GameMode를 지정하면 실행 시 Warrior가 기본 캐릭터로 스폰됩니다.

결과


추가 팁

  • 파라곤 에셋을 UE 5.4에서 쓸 때 머티리얼 컬렉션 버그가 있으니 머티리얼 인스턴스 개별로 교체하는 것이 안전합니다.
  • 직업별 능력치(공격력, 마나 등)는 enum class EJobType { Warrior, Magician, Archer }; 같은 enum을 두고, PlayerCharacter에 멤버로 두면 직업 판별과 확장이 편해집니다.
  • 나중에 선택 UI를 붙이려면 GameInstance나 PlayerState를 통해 직업 선택값을 저장해두는 방식을 쓰면 좋습니다.

이 구조를 기본으로 전사/마법사 외에도 궁수(Archer) 등을 쉽게 추가할 수 있습니다.
핵심은 PlayerCharacter를 "공통 베이스"로 두고, 각 직업별 클래스를 파생시켜서 매쉬·스탯·스킬만 다르게 구성하는 것입니다.

profile
응애 개발자

0개의 댓글