WWolves Den

게임플레이 · 약 3분

Anim Notify와 중단 처리로 공격 상태 잠금 방지하기

공격 중복 재생을 막되 몬타지가 끝까지 가지 못한 경우에도 상태를 확실히 해제하는 흐름을 만듭니다.

Wolfgadeok · 업데이트

입력 제한과 공격 완료를 연결하기

공격 여부를 저장하는 Boolean 변수를 IsInAttack이라고 정해 봅시다. 이 값이 false일 때만 몬타지를 시작하고 공격 끝에 배치한 AttackEnd라는 Notify에서 다시 false로 바꾸면 중복 공격을 제한할 수 있습니다. 버튼을 연타할 때 이전 모션이 계속 처음으로 돌아가는 문제를 이해하기에 좋습니다. 그러나 이 구조만으로 완성했다고 보면 몬타지가 끝까지 재생되지 않는 상황에서 상태가 풀리지 않을 수 있습니다.

피격 몬타지가 공격을 중단하거나 캐릭터가 죽고 다른 상태로 전환될 수 있습니다. 몬타지 참조가 잘못돼 재생에 실패할 수도 있습니다. 이때 끝 Notify는 도달하지 않으므로 ‘끝에 반드시 이벤트가 온다’는 전제를 두면 안 됩니다. 정상 종료와 중단, 시작 실패를 모두 상태 머신의 경로로 취급해야 합니다.

세 공격 구간의 끝부분에 AttackEnd Notify를 배치한 몬타지 타임라인
각 공격 끝에 AttackEnd Notify를 둔 예입니다. 공격이 중단되면 이 지점에 도달하지 않을 수 있으므로, 종료 Notify와 별도로 중단·재생 실패 경로에서도 상태를 정리해야 합니다. 이전 버전의 에디터 화면으로, 현재 버전과 메뉴 배치가 다를 수 있습니다. 이미지를 누르면 크게 볼 수 있습니다.

Notify는 의미 있는 시간 창에 사용하기

Notify는 공격 판정을 켜는 순간, 효과음을 내는 순간, 다음 입력을 받을 수 있는 순간처럼 애니메이션 안의 의미 있는 시점에 유용합니다. 공격 상태 전체의 수명과 타격 가능 구간은 다릅니다. 검을 휘두르기 전 준비 동작에서는 공격 중이지만 데미지 판정은 꺼져 있을 수 있습니다. 이를 하나의 Boolean에 모두 담으면 판정과 입력 허용 시점이 얽힙니다.

Play Montage 노드의 완료·중단 이벤트나 AnimInstance의 적절한 종료 통지를 이용해 마무리 함수를 한 곳으로 모읍니다. 어떤 노드를 사용하는지에 따라 콜백 종류가 다르므로 일반 Skeleton Notify와 Montage Notify 콜백을 무조건 같은 것으로 취급하지 않습니다. Animation Blueprint가 캐릭터를 참조할 때에는 유효성을 검사하고 필요한 게임 상태 변경은 명확한 함수로 요청합니다.

중복 완료에도 안전한 정리

정리 함수는 여러 번 호출돼도 피해가 없도록 만듭니다. 이미 닫힌 공격 판정을 다시 닫는 일은 안전해야 하며, 공격이 중단된 뒤 도착한 옛 콜백이 새 공격까지 해제하지 않도록 현재 공격의 식별자를 비교할 수 있습니다. 게임 규모가 작더라도 이 원칙은 중요합니다. 연타와 피격이 같은 프레임에 겹치는 경우가 평소 플레이보다 상태 버그를 잘 드러냅니다.

  1. 짧게 누르기·길게 누르기·연타에서 요청 횟수를 확인합니다.
  2. 공격의 준비·타격·회복 단계에서 각각 중단시켜 봅니다.
  3. 재생 실패·사망·메시 교체 후에도 상태와 판정이 정리되는지 확인합니다.
  4. 정상 완료와 중단이 같은 정리 함수를 사용하되 현재 공격인지 검사합니다.

예제 · text

TryAttack
  현재 상태가 공격 가능하지 않으면 반환
  유효한 몬타지와 섹션을 선택
  현재 공격 ID를 새로 발급
  공격 중 상태 설정 후 재생 시도
  재생 실패라면 FinishAttack(현재 ID)

Notify: 타격 구간 열기 / 닫기
Montage 완료 또는 중단: FinishAttack(해당 공격 ID)

FinishAttack(id)
  id가 현재 공격과 다르면 반환
  타격 판정 닫기
  공격 상태 해제
  현재 공격 ID 무효화

참고 자료

예제는 학습용이며, 모든 환경에서 실행 검증된 완성 프로젝트는 아닙니다. 적용 전 사용 중인 버전과 프로젝트 환경에서 동작을 확인하세요.