티스토리 뷰

🟩 오늘의 목표

  • 공격 상태 유지로 인해 발생하는 WASD 이동 불가 버그의 원인을 완벽히 해결한다.
  • 애니메이션 몽타주와 AnimNotify를 활용하여 공격 종료 시점을 정확히 감지한다.
  • 공격 후 Idle 상태로의 복구 로직을 설계하여 캐릭터 제어권을 정상화한다.

🟧 1. 현상 분석 및 원인 파악

🟦 캐릭터 이동 입력 차단 현상

현재 마우스를 통한 시점 회전은 정상적으로 작동하나, WASD 키를 이용한 이동 입력이 무시되는 현상이 발생하였다. 이는 캐릭터의 이동 로직인 Move 함수 내에서 현재 전투 상태를 체크하는 조건문이 입력을 차단하고 있기 때문이다.

🟦 논리적 결함 발견

원인 분석 결과, CurrentCombatState가 Attacking 상태로 진입한 후 다시 Idle로 돌아오지 못하고 고정되어 있었다. 공격 애니메이션이 실행되면서 이동을 막는 설계 자체는 의도된 것이나, 애니메이션이 종료된 이후에도 상태값이 갱신되지 않아 캐릭터가 영구적인 공격 상태에 빠진 것으로 확인되었다.


🟧 2. 해결 방안 설계

🟦 AnimNotify를 활용한 상태 제어

애니메이션의 특정 시점에 이벤트를 발생시키는 AnimNotify를 도입하여 물리적인 애니메이션 종료 시점과 논리적인 상태값을 동기화한다.

// 1. 공격 종료 시 호출될 함수 (Character.cpp)
void ASpartaCharacter::OnComboEnd()
{
    // 공격 상태를 Idle로 변경하여 이동 입력 차단 해제
    CurrentCombatState = ECombatState::Idle;
    UE_LOG(LogTemp, Log, TEXT("공격 종료 : 이동 입력 활성화"));
}

🟦 애니메이션 블루프린트 연동

C++에서 정의한 OnComboEnd 함수를 애니메이션 블루프린트에서 호출할 수 있도록 구성한다. 몽타주의 마지막 프레임 부근에 커스텀 노티파이를 배치하고, 해당 신호가 들어오면 캐릭터의 상태 복구 함수를 실행시킨다.


🟧 3. 내일의 도전 과제

🟦 몽타주 기반 노티파이 구현

모든 사격 및 근접 공격 몽타주 끝부분에 EndAttack 노티파이를 추가한다. 특히 연계 공격(콤보)의 경우 마지막 타격 이후에만 상태가 풀리도록 정교하게 배치한다.

🟦 회피(Dodge) 상태 복구 검증

공격뿐만 아니라 회피 동작 중에도 이동이 차단되는 로직이 포함되어 있다. 회피 애니메이션이 끝날 때도 OnComboEnd 혹은 별도의 회피 종료 함수가 정상 작동하여 제어권이 돌아오는지 테스트를 진행한다.


🟧 핵심 요약

캐릭터의 상태 머신 설계 시 입력을 차단하는 가드 로직(Guard Logic)은 반드시 해제되는 지점(Exit Point)이 보장되어야 함을 다시 한번 확인하였다. 단순히 변수 하나를 바꾸는 작업이지만, 애니메이션 프레임과 코드 사이의 동기화가 어긋나면 사용자 경험(UX)에 치명적인 버그가 발생한다는 사실을 깨달았다. 내일은 노티파이 연동을 통해 이 상태 잠금 문제를 해결하고 매끄러운 조작감을 확보하는 데 집중한다.