언리얼엔진5 공부

[TIL] UE5 컴포넌트 기반 스킬/아이템 슬롯 시스템 설계 및 구현

Client Side 2026. 2. 5. 21:22

🚀 요약: 컴포넌트 기반 스킬/아이템 슬롯 시스템 설계 및 구현

오늘은 유연한 전투 시스템 구축을 위해 Enhanced InputActorComponent 간의 상호작용 로직을 설계했습니다. 특히, 직업별로 달라질 수 있는 스킬 구조를 컴뱃 컴포넌트에서 통합 관리하도록 구현하여 확장성을 확보했습니다.

 


1. 시스템 구조 설계 (Architecture)

단순한 기능 구현을 넘어, 각 클래스의 역할을 명확히 분리(Decoupling)했습니다.

  • T3PlayerController: 사용자 입력을 받아 CombatComponent의 적절한 명령 함수로 전달.
  • T3CombatComponent (Control Tower): 현재 선택된 스킬/아이템/포션 슬롯 번호(State)를 관리하고, 실제 실행 주체에게 명령을 위임.
  • T3SkillComponentBase (Execution): 실제 스킬 로직(애니메이션, 투사체 스폰 등)을 수행.

2. 주요 구현 내용

① Enhanced Input을 통한 6종 입력 바인딩

전투 상황에서의 기민한 조작을 위해 스킬/소모품/포션의 슬롯 전환(Toggle)사용(Execute) 입력을 분리하여 구현했습니다.

  • Skill: Shift(전환) / Q(사용)
  • Consumable: R(전환) / E(사용)
  • Potion: 2(전환) / 1(사용)

② 슬롯 순환 로직 (Expansion-Friendly)

마법사 등 특정 직업이 3개 이상의 슬롯을 사용할 경우를 대비하여, 모듈러(Remainder) 연산을 이용한 유연한 슬롯 전환 로직을 적용했습니다.

C++
 
// 2개일 땐 1->2->1, 3개일 땐 1->2->3->1로 자동 대응
CurrentSkillSlot = (CurrentSkillSlot % MaxSkillSlots) + 1;

③ 컴포넌트 간 데이터 브릿지 (SetSkillComponent)

DataAsset에서 동적으로 생성된 직업별 스킬 컴포넌트를 CombatComponent가 인지할 수 있도록 캐싱(Caching) 및 세팅 함수를 구현했습니다.


3. 기술적 고민과 해결 (Troubleshooting)

  • 문제: 스킬 컴포넌트에서 슬롯 번호를 관리하니, 아이템 슬롯 체인지 추가 시 코드가 파편화됨.
  • 해결: ESlotType 열거형을 도입하여 CombatComponent에서 통합 관리하도록 변경. 이를 통해 UI 팀과의 인터페이스(Delegate)를 하나로 통일하여 협업 효율을 높임.
  • 발전: 문자열 기반의 태그 대신 GameplayTags를 도입하여 데이터 기반(Data-Driven) 설계의 안정성을 확보하기 시작함.

4. 핵심 코드 (T3CombatComponent - 통합 실행)

C++
 
void UT3CombatComponent::ExecuteSlotAction(ESlotType Type)
{
    switch (Type)
    {
    case ESlotType::Skill:
        if (SkillComp) SkillComp->ExecuteSkill(CurrentSkillSlot);
        break;
    case ESlotType::Potion:
        // 포션 사용 로직
        break;
    }
}

🎯 내일의 목표

  • FSkillAttributes 구조체 기반 DataTable 생성 및 데이터 바인딩.
  • 스킬 ID를 통해 데이터 테이블에서 쿨타임, 데미지, 마나 소모량 로직 연결.
  • GameplayTags를 활용한 패시브 효과(신성 게이지 등) 설계 시작.