[2026_01_06] 비대칭 디버깅(같은 로직인데 한 쪽에서만 작동)

2026. 1. 6. 20:54TIL

문제 상황

  • 적군 힐러는 정상적으로 힐을 하는데, 아군 힐러만 힐을 하지 못함
  • 같은 로직(HealSkill, UnitBase, AttackState)을 사용하는데 아군만 특이하게 작동하지 않음
  • 아군 검색, 리스트 정렬, 스킬 쿨타임은 모두 정상 작동 확인

시도한 방법

  1. FindAlliesInRadius 의심: 아군을 제대로 찾는지 확인 → 정상 작동
  2. 정렬 문제 의심: SortTargetsByPriority가 매번 다른 타겟을 선택하는지 확인 → targetPriority 설정 확인됨
  3. Heal 메서드 의심: UnitBase.Heal()이 실제로 호출되는지 확인 → 호출은 되는데 적용 안 됨
  4. 죽은 유닛 필터링: 이미 죽은 유닛을 리스트에서 제거 → 여전히 문제 지속
  5. AttackState 실행 순서 확인: Attack()과 TryUseSkill()의 순서 의심 

해결 방법

AttackState.cs의 공격 타이밍 로직 수정

 
csharp
// 문제 코드
if (attackTimer >= 1f / attackSpeed)
{
    attackTimer = 0f;
    Attack();              // ① 일반 공격 먼저 실행
    unit.TryUseSkill();    // ② 스킬 나중 실행
}

// 해결 코드
if (attackTimer >= 1f / attackSpeed)
{
    attackTimer = 0f;
    unit.TryUseSkill();    // ① 스킬 먼저 실행
    
    if (unit.CurAtk > 0)   // ② 공격력 있을 때만 공격
    {
        Attack();
    }
}

배운 점

  1. 실행 순서의 중요성: 같은 함수들이라도 호출 순서에 따라 동작이 달라질 수 있음. Attack()이 먼저 실행되면서 애니메이션/IsUsingSkill 플래그가 TryUseSkill()을 블로킹함
  2. 비대칭 디버깅: 같은 로직인데 한쪽만 작동하지 않으면 "타이밍"이나 "실행 순서" 문제를 의심해야 함
  3. 조건 체크의 중요성: 공격력이 0인 유닛(힐러, 버퍼)은 일반 공격을 스킵해야 불필요한 처리와 충돌을 방지할 수 있음
  4. 상태 충돌 주의: 여러 행동(공격, 스킬, 애니메이션)이 동시에 실행될 때 상태 플래그로 인한 충돌 가능성을 고려해야 함