카메라 락온 컴포넌트 분리
BPC_Combat 컴포넌트에 카메라 락온 기능도 섞여있어 God Object가 될 싹수가 보임 즉시 BPC_TargetLock으로 분리
분리하려고 보니 락온할 Target이 어떤 상태인지를 알 필요가 있어짐 → Enemy의 설계가 필요해짐
EnemyBase 설계
소울라이크 구조를 답습할 것이기에 일단 적 계층도 비슷하게 가져가기로 함
- 휴머노이드형
- 동물형
- 기타(용, 상상속의 동물 등) 외형 분류로 나누려다가 더 중요한 상위 계층이 있었음
- 보스(Bosses)
- 쫄몹, 일반몹(Minions) 그래서 아래와 같이 가기로 결정
/Enemies∟ BP_EnemyBase∟ EEnemyState∟ /Bosses∟ /Minions견본 프로젝트 옮기기할 때 주의사항
- Project Settings → Maps & Modes 에서 Default Game Mode를 내가 만든 GameMode BP로 바꿔줘야함
- World Settings → GameMode Override를 내가 만든 GameMode BP로 바꿔줘야 함
- GameMode BP를 열어서 내가 만든 Character, Controller를 연결해줘야 함
구조 설계
- 플레이어 뿐만 아니라 보스도 공격/방어가 가능해야 함
- 공격 주체의 상태, 공격 성질, 공격 판정,
- 타겟 락온 기능은 플레이어 귀속 기능
- 오브젝트의 스탯 관리는 캐릭터와 몬스터보다 상위에 있어야 함
Characters/ ├─ Player/ │ ├─ BP_PlayerCharacter │ ├─ Components/ │ │ ├─ BPC_TargetLock │ │ └─ BPC_PlayerInputBridge │ ├─ Camera/ │ │ ├─ BP_PlayerCameraManager │ │ └─ BP_CameraShake... │ └─ Animations/ │ └─ Enemies/ ├─ BP_EnemyBase ├─ Bosses/ ├─ Minions/ └─ Animations/Gameplay/ └─ Combat/ ├─ Components/ │ ├─ BPC_CombatCore │ └─ BPC_Health ├─ Data/ │ └─ DA_AttackSet ├─ Types/ │ ├─ E_CombatState │ └─ DT_AttackData └─ Interfaces/ ├─ BPI_Targetable └─ BPI_DamageableUI/ └─ TargetLock/ └─ BP_TargetLockMarker이렇게 구조를 설계하니 너무 깔끔하게 확장성이 확보됐다. GPT Free와 Plus 격차도 이런데 Pro 플랜을 사용하면 얼마나 잘해줄까?
공용 Combat 시스템 구현
1. Combat/Types: 단일 공격에 대한 구조체 생성
S_AttackData 공격 데이터 구조체:
- 공격 이름, 무기 이름, 종류
- 대미지, 스테미너 비용, 피격 타입, 회전 가능 여부
- 콤보 공격 데이터(다음 공격 여부, 다음 공격 인덱스)
- 애니메이션 관련(몽타주, 루트 모션 여부)
E_CombatState전투 상태 Enum: - Idle, Attacking, Dodging, HitStun, Dead
E_HitReactionType피격 타입 Enum: - None, Light, Heavy, Knockback
2. Combat/Data: 구조체 기반 공격 콤보
DA_AttackSetBase:
- Attacks 배열, WeaponName, WeaponType, bIsTwoHanded 가지고 있는 클래스
DA_Sword_Longsword: - 실제 롱소드 공격 시퀀스 데이터 에셋.
- S_AttackData 구조의 공격들을 배열로 만들고 관리할 수 있음
- 애니메이션 몽타주만 있으면 손쉽게 확장 가능
3. Combat/Components: 전투 시스템 규칙 컴포넌트
BPC_CombatCore:
- 공격 시작, 종료, 피격 상태 진입, 닷지 시도 등 실제 공격 수행에 대한 공통 로직 제공
- 주로 유효성 검사(공격 DA 존재 여부, 다음 공격 존재 여부, 액터 상태 체크)
BPC_Health: - 대미지 반영, 체력 회복, 사망 처리 로직 제공
4. Combat/Interfaces: 전투 대상 인터페이스
BPI_Damageable:
- 피격 가능한 오브젝트를 위한 틀
- ReceiveHit, IsDead 등 꼭 필요한 공통 로직 명세서 제공
BPI_Targetable: - 타게팅 가능 대상에 대한 인터페이스
- CanBeTargeted, GetTargetLocation 제공
사용방법은 Player나 Enemy에 가서 CombatCore 컴포넌트를 추가해주기만 하면 된다
완전 개꿀딱