AnimNotifyTick 사이의 타이밍 오차로 인해 공격이 중복 실행되거나 튀는 현상을 해결한 코드입니다. 논리적 플래그(bIsAttacking) 확인에 앞서 IsAnyMontagePlaying()으로 실제 엔진의 애니메이션 상태를 검증하는 이중 체크(Double Check) 로직을 도입하여 전투의 안정성을 확보했습니다.

//Boss1.cpp

void ABoss1::UseNormalAttack()
{
    //이중 상태 체크 (Double State Check)
    
    //1. 엔진 레벨 검증: 실제 애니메이션 몽타주가 재생 중인지 확인
    // Notify와 Tick 사이의 미세한 갭(Gap)으로 인한 중복 실행 방지
    UAnimInstance* AnimInst = GetMesh()->GetAnimInstance();
    if (AnimInst && AnimInst->IsAnyMontagePlaying())
    {
        return;//가드 클로즈 (Guard Clause)
    }

    //2. 논리 레벨 검증: 자체 플래그 확인
    if (bIsAttacking) return;

    //검증 통과 시 공격 실행
    bCanNormalAttack = false;
    StartAttack();
}