언리얼 엔진

Unreal Engine - RPG 전투 상태 관리 시스템 설계 및 초기 구현

로안님 2025. 5. 8. 21:50

🎮 UE5 액션 RPG 전투 상태 관리 시스템 설계 및 초기 구현

🧩 개요

이번 작업은 언리얼 엔진 5 기반의 액션 RPG 프로젝트에서 전투 시스템의 '상태 관리' 구조를 처음으로 설계하고 테스트한 기록입니다. 다크소울류 전투 흐름을 목표로 하며, enum을 기반으로 한 전투 상태 분리 및 애니메이션 타이밍과의 연동을 중심으로 구성하였습니다.


🎯 설계 목표

  • 상태 기반 전투 흐름 구현
  • 캐릭터의 전투 행동을 명확한 상태로 구분
  • 애니메이션 타이밍과 전투 로직을 분리하여 유연한 확장 가능 구조 마련

1️⃣ 전투 상태 시스템 구축

🔸 ECharacterCombatState 열거형 정의

전투 중 캐릭터의 상태를 명확히 구분하기 위해 enum class를 도입했습니다.

UENUM(BlueprintType)
enum class ECharacterCombatState : uint8
{
    Idle            UMETA(DisplayName = "Idle"),
    Attacking       UMETA(DisplayName = "Attacking"),
    ComboWindow     UMETA(DisplayName = "Combo Window"),
    Parrying        UMETA(DisplayName = "Parrying"),
    Dodging         UMETA(DisplayName = "Dodging"),
    HitReact        UMETA(DisplayName = "Hit React"),
    Dead            UMETA(DisplayName = "Dead")
};

🔸 캐릭터 클래스 내 상태 변수 및 제어 함수

UPROPERTY(BlueprintReadWrite)
ECharacterCombatState CurrentCombatState;

UFUNCTION(BlueprintCallable)
void SetCombatState(ECharacterCombatState NewState);
  • 상태 변경은 전투 중 특정 애니메이션 타이밍에 맞춰 진행됩니다.

2️⃣ AnimNotify를 활용한 상태 전환 제어

🔹 단일 프레임 Notify 클래스

애니메이션 타이밍의 특정 순간에 상태를 바꾸기 위해 커스텀 UAnimNotify 클래스를 작성했습니다.

클래스 이름 기능

Notify_AttackStart 상태 → Attacking
Notify_AttackEnd 상태 → Idle
Notify_ComboEnable 상태 → ComboWindow
Notify_HitCheck 타격 판정 트리거

🔹 시간 기반 NotifyState 클래스

지속 시간 동안 상태 제어가 필요한 경우 UAnimNotifyState를 활용했습니다.

클래스 이름 기능

NotifyState_ParryWindow 패링 가능 타이밍 (bIsParrying on/off)
NotifyState_Invincibility 무적 타이밍 (bIsInvincible on/off)

3️⃣ 애니메이션 몽타주 구성

전투 애니메이션 실행 시 상태 전환 타이밍을 지정하기 위해 테스트용 몽타주 AM_Test를 제작했습니다.

  • Notify_AttackStart → 초반
  • Notify_ComboEnable → 중간
  • Notify_AttackEnd → 후반
  • Notify_HitCheck → 적중 타이밍
UAnimMontage* AttackMontage;

void PlayAttackMontage();
  • 상태 전환은 Notify 시점에서 SetCombatState()를 호출하는 구조로 연결됩니다.

4️⃣ 애니메이션 블루프린트에서의 연결

🔸 문제 및 해결

  • 몽타주 실행 시 애니메이션이 출력되지 않는 문제가 있었으며,
  • AnimGraph 내에 Slot 노드를 추가하고 이름을 DefaultSlot으로 설정하여 해결했습니다.
  • 노드가 적절히 연결되지 않으면 몽타주가 출력되지 않으므로 필수 설정입니다.

✅ 현재 구현 결과 요약

시스템 요소 상태

전투 상태 열거형 / 변수 / 함수 ✅ 설계 및 적용 완료
AnimNotify / NotifyState 클래스 ✅ 초기 구현 완료
몽타주 제작 및 노티파이 배치 ✅ 정상 작동 확인
애니메이션 블루프린트 Slot 설정 ✅ 문제 해결 완료
전체 테스트 결과 🎉 정상 작동 및 상태 전환 확인

이번 작업은 캐릭터의 전투 상태를 명확히 구분할 수 있는 기반 구조를 마련한 데 의의가 있습니다. 앞으로 이 상태 시스템을 기반으로 연계 공격, 리액션, 방어 시스템 등을 확장해 나갈 예정입니다.