1. 적 유닛 체력이 1로 시작하는 문제
문제 상황
공격 Anim Notify의 피해량을 검증하려고 했지만 적 유닛이 한 번의 공격에 바로 사망했다. 처음에는 적 유닛의 체력이 실제로 1로 설정된 것으로 의심했다.
원인 확인
적 유닛 스포너에는 다음 Row Name이 설정되어 있었다.
Infantry
하지만 DT_Units를 확인한 결과 Infantry라는 Row Name은 존재하지 않았다.

유닛 스탯 초기화 구조는 다음과 같다.
UnitSpawner의 Unit Row Name
→ DT_Units에서 동일한 행 검색
→ FUnitStatData 로드
→ HealthComponent 초기화
Infantry 행을 찾지 못하면서 다음 초기화가 실행되지 않았다.
HealthComponent->InitializeHealth(InRow.MaxHealth);
따라서 적 유닛에는 HealthComponent의 초기 기본값이 남았다.
Current Health = 1
Max Health = 100
해결 방향
스포너의 Unit Row Name을 실제 데이터 테이블에 존재하는 행으로 변경해야 한다.
현재 데이터 연결은 다음과 같다.
Brawler → BP_TestUnit
Berserker → BP_TestUnit2
따라서 생성되는 적 유닛 클래스에 맞춰 Brawler 또는 Berserker를 사용한다. 별도의 적 스탯이 필요하면 추후 Infantry 행을 새로 추가하는 방법도 사용할 수 있다.
배운 점
데이터 테이블 기반 초기화에 실패하면 객체의 기본값이 남기 때문에, 단순히 “체력이 잘못 설정됐다”고 판단하기보다 다음 항목을 먼저 확인해야 한다.
- 스포너의 Row Name
- 데이터 테이블에 해당 행이 존재하는지
- Row Name의 철자와 대소문자
- 실행 로그의 데이터 조회 실패 경고
2. 공격 애니메이션 한 번에 피해가 여러 번 들어가는 문제
문제 상황
공격 애니메이션은 한 번 재생됐지만 실제로는 피해가 2~3회 적용되어 적이 예상보다 빠르게 사망했다.
특히 여우 유닛은 한 공격 애니메이션에 두 번의 타격 동작이 있어서 일반 공격과 동일하게 처리하기 어려웠다.
기존 구조의 문제
기존 공격 처리는 애니메이션의 타격 프레임과 관계없이 PerformAttack() 실행 시점에 즉시 피해를 적용했다.
공격 조건 만족
→ PerformAttack 실행
→ 즉시 피해 적용
→ 공격 애니메이션 재생
이 구조에서는 공격 Tick, 쿨다운, 몽타주 재호출 등의 상황에 따라 애니메이션과 피해 횟수가 어긋날 수 있었다.
해결 방법
실제 피해 계산을 Anim Notify가 실행되는 순간으로 이동했다.
PerformAttack
→ 공격 대상 임시 저장
→ 공격 몽타주 재생
→ 타격 프레임에서 BP_AN_AttackHit 실행
→ HandleAttackHit 호출
→ 실제 피해 적용
BP_AN_AttackHit에서는 Notify를 발생시킨 Skeletal Mesh의 소유자를 찾아 UnitBase로 변환한 후 공격 피해 함수를 호출한다.

DamageRatio 적용
같은 Notify 블루프린트를 일반 공격과 2연타 공격에서 공통으로 사용하기 위해 DamageRatio 변수를 추가했다.
Received Notify
→ Get Owner
→ Cast To UnitBase
→ HandleAttackHit(DamageRatio)
→ Return True
공격 방식별 설정은 다음과 같다.
| 휴먼 일반 공격 | 1개 | 1.0 | 공격력의 100% |
| 여우 2연타 | 2개 | 각각 0.5 | 공격력의 50% + 50% |
예를 들어 공격력이 10인 여우 유닛은 한 공격 주기에서 5 + 5의 피해를 적용한다.
추가 안전장치
Notify가 실수로 중복 배치되어도 피해가 무한히 적용되지 않도록 유닛별 AttackHitCount를 사용했다.
- 휴먼: AttackHitCount = 1
- 여우: AttackHitCount = 2
배운 점
Anim Notify의 개수는 애니메이션의 실제 타격 횟수와 일치시켜야 한다. 또한 다단 공격에서는 각 타격 피해의 합이 데이터 테이블의 최종 공격력과 일치하는지 확인해야 한다.
3. 공격 중 후퇴 명령이 적용되지 않는 문제
문제 상황
유닛이 적을 공격하는 도중 뒤쪽을 클릭해도 공격을 중단하지 않고 계속 같은 적을 공격했다.
원인
일반 우클릭 이동도 현재 구조에서는 AttackMove로 처리된다. 공격을 취소해도 바로 다음 Tick에서 가까운 적을 다시 탐색하면서 같은 적과 다시 교전했다.
단순히 명령을 Move로 바꾸면 후퇴는 가능하지만, 기존 요구사항인 다음 기능이 사라지는 문제가 있었다.
이동 중 적 발견
→ 자동으로 이동 중단
→ 적 공격
해결 방법
AttackMove는 유지하면서 새로운 이동 명령 직후에만 짧은 재탐색 유예시간을 적용했다.
공격 중 뒤쪽 클릭
→ 기존 공격 대상 해제
→ 공격 몽타주 중단
→ 남아 있는 Notify 대상 제거
→ 0.3초 동안 이동 우선
→ 유예시간 종료
→ 적 자동 탐색 재개
이를 위해 CommandAttackMoveGraceRemaining을 추가하고 Tick에서 감소시켰다.
if (CommandAttackMoveGraceRemaining > 0.f)
{
CommandAttackMoveGraceRemaining =
FMath::Max(
0.f,
CommandAttackMoveGraceRemaining - DeltaSeconds
);
}
유예시간 동안에는 공격 이동 명령이어도 목적지 이동을 우선하도록 조건을 변경했다.
if (bHasCommandedDestination &&
(!bCommandIsAttackMove ||
CommandAttackMoveGraceRemaining > 0.f))
배운 점
입력 문제처럼 보여도 실제 원인은 상태 머신이 다음 Tick에서 명령을 덮어쓰는 것일 수 있다. 기존 자동 전투 기능을 제거하지 않고 사용자의 새 명령에 우선권을 주려면 짧은 상태 전환 유예시간을 사용할 수 있다.
트러블 슈팅 결과
오늘 확인한 문제들은 서로 연결되어 있었다.
잘못된 Row Name
→ 체력 초기화 실패
→ 적 유닛이 즉시 사망
→ 공격 Notify 피해량 검증 불가능
즉시 피해 방식
→ 애니메이션과 타격 횟수 불일치
→ Notify 기반 피해 처리로 변경
AttackMove의 즉각적인 재탐색
→ 후퇴 명령 무시
→ 0.3초 이동 우선시간 적용
다음 작업에서는 BP_AN_DeathPose를 사망 몽타주의 완전히 누운 프레임에 배치하고, HandleDeathPose()와 연결하여 다시 일어나는 사망 애니메이션 문제를 처리할 예정이다.
'StrikForge 프로젝트 > 트러블슈팅' 카테고리의 다른 글
| 유닛 이동 불량 문제 해결: 부착 무기의 Collision 설정 (0) | 2026.09.23 |
|---|---|
| Scene Capture Component와 3D 애니메이션 적용 (0) | 2026.08.24 |
| StrikForge 11일차 - 트러블슈팅 (0) | 2026.08.21 |
| StrikForge 10일차 - 트러블슈팅 (0) | 2026.08.20 |
| StrikForge 9일차 - 트러블슈팅 (0) | 2026.08.18 |