주요 구현 내용
- 인터페이스 구현
- IInterface_Damageable과 IInterface_EnemyAI를 상속받아, 피해 처리, 체력 관리, 공격 토큰 예약/반환, 이동 속도 제어 등 AI의 다양한 동작을 통합적으로 구현했습니다.
- 컴포넌트 구성
- AIBehaviorsComponent와 DamageSystemComponent를 생성하여 AI의 행동 로직과 피해/체력 관리 기능을 분리하여 모듈화하였습니다.
- HealthWidgetComponent를 추가하여 체력 정보를 UI로 표시할 수 있도록 했습니다.
- 애님 몽타주 재생 및 이벤트 처리
- 피해 발생 시 적절한 히트 리액션 몽타주(HitReactionMontage 또는 StaggerMontage)를 선택하여 재생했습니다.
- Montage_SetEndDelegate를 사용해 몽타주 재생이 끝났을 때(OnCompleted 혹은 OnInterrupted) 후속 처리를 진행하도록 하였습니다.
- 재생된 몽타주를 멤버 변수(LastHitResponseMontage)에 저장하고, 피해를 준 액터(PendingDamageCauser)도 임시 저장하여 몽타주 종료 후 공격 상태 전환 로직에 활용했습니다.
- 블록(방어) 처리
- 피해가 블록 가능할 경우 일정 확률(BlockChance)에 따라 블록 동작을 시작하고, BlockMontage를 재생합니다.
- 블록 종료 시 타이머를 이용해 EndBlock 함수를 호출하고, OnBlockEnded 델리게이트를 방송하여 블루프린트에서 추가 처리를 할 수 있도록 했습니다.
- 델리게이트 활용
- OnAttackEnd, OnWeaponEquipped, OnWeaponUnEquipped, OnBlockEnded 등 다양한 델리게이트를 선언하여, 공격이나 블록 상태 변화 시 이벤트를 발생시켰습니다.
구현하면서 배운 점
- 인터페이스 기반 설계
- Damage와 AI 관련 동작들을 인터페이스를 통해 표준화하면, 추후 다양한 AI 캐릭터가 일관된 방식으로 동작할 수 있다는 점을 확인했습니다.
- 애님 몽타주 이벤트 처리
- Montage_SetEndDelegate를 통해 몽타주 재생 종료 시점에 필요한 로직을 실행할 수 있으며, 이를 이용해 공격 전환이나 상태 업데이트를 깔끔하게 처리할 수 있음을 배웠습니다.
- 또한, 임시로 DamageCauser와 재생된 몽타주를 저장하여 이후 비교하는 기법을 통해, 여러 애님 몽타주가 동시에 재생될 수 있는 상황에서도 올바른 처리를 할 수 있게 되었습니다.
- 타이머와 델리게이트의 활용
- 블록 동작의 경우, 타이머를 이용해 일정 시간 후 자동으로 블록을 종료시키고, 델리게이트를 통해 상태 변경을 알리는 방식을 적용했습니다.
- 이를 통해 단순한 시간 기반 로직도 깔끔하게 구현할 수 있음을 느꼈습니다.