이번 주에는 언리얼 기반 게임 프로젝트에서 캐릭터 관련 로직을 컴포넌트 단위로 구조화하고 리팩토링 하는 작업을 진행했다.
주요 목표는 다음과 같다:
목표
- 캐릭터 로직의 복잡도 해소
- 전투 / 아이템 로직의 기능 분리 및 확장성 확보
- 파티 애니멀즈 스타일의 무기 획득 & 교체 시스템 구현
시스템 분리 구조
1. CombatComponent - 전투 관련 처리 전담
- 공격 실행, 애니몽타주 재생
- 데미지 계산, 넉백 처리
- GameplayEffect 적용
- GAS 태그 기반 공격 불가 상태 (State.Stunned) 대응
- AnimNotify에서 호출되는 HandleAttackNotify() 처리
2. ItemComponent - 아이템 처리 전담
- 월드에서 아이템 획득 & 장착
- 장착 중인 아이템은 무기 소켓에 부착
- 새 무기 획득 시 기존 무기는 월드에 드랍 (DropItemToWorld)
- 아이템 사용 처리 (UseEquippedItem)
- 드랍 아이템에 Physics 적용 & 충돌 활성화
게임 플레이 스타일 변화
- 기본 상태: 맨손
- 월드에서 무기를 획득하면 무기로 공격
- 새 무기 획득 시 이전 무기는 월드에 물리 오브젝트로 드랍
리팩토링 포인트
CharacterBase 단순화
- Attack(), UseItem() 등은 각각 컴포넌트로 위임
- CombatComponent와 ItemComponent 모두 BeginPlay 시 Init(this)로 캐릭터 참조 주입
- StatusEffect 위젯 처리 (ShowStatusWidget, HideStatusWidget)은 아직 CharacterBase에 유지
블루프린트 호환성 문제 해결
- C++에서 RootComponent = ItemMesh 설정했으나, 기존 블루프린트에서는 여전히 SceneComponent가 루트로 잡혀버리는 문제 발생
- 블루프린트에서 직접 루트 컴포넌트 변경 필요 (또는 새 블루프린트 생성)
마무리
이번 리팩토링을 통해 캐릭터의 전투/아이템 관리 기능을 모듈화하여 유지보수성과 확장성이 대폭 향상되었다.
GAS 기반 스테이터스 처리, 아이템 드랍 및 장착 구조, 클라이언트와 서버 간 상호작용 처리에 대해 좋은 구조적 기반을 마련한 한 주였다.