
아처가 활을 쏠 때 화살이 언제 나가야 하는지가 생각보다 까다로운 문제였다. 처음엔 공격 애니메이션이 시작되는 순간 화살을 발사했는데, 비주얼이 이상했다. 활시위를 당기는 모션이 아직 진행 중인데 화살이 튀어나가 버렸다.
애니메이션 프레임과 타이밍을 맞춰야 한다
해결 방법은 애니메이션의 특정 프레임에서 화살을 발사하는 거다. AnimationPlayer의 애니메이션에 커스텀 트랙을 추가하거나, frame_changed 시그널을 연결해서 특정 프레임 번호일 때 발사 로직을 실행하면 된다.
Tiny Reign에서는 AnimatedSprite2D를 쓰고 있어서 frame_changed 시그널을 활용했다. 아처 공격 애니메이션에서 활시위가 완전히 당겨지는 프레임 번호를 찾아서, 그 프레임에서만 발사 함수를 호출하도록 했다.
구현 방법
AnimatedSprite2D의 frame_changed 시그널을 연결하고, 현재 animation이 “attack”이면서 frame 번호가 공격 판정 프레임일 때만 처리한다. 프레임 번호는 CSV에서 attack_frame으로 관리해서 유닛마다 다르게 설정할 수 있게 했다.
근거리 유닛은 같은 방식으로 Hitbox Area2D를 활성화한다. 검을 휘두르는 애니메이션에서 칼날이 닿는 프레임에 Hitbox를 켜고, 다음 프레임에 끈다. 이렇게 하면 공격 판정이 비주얼과 딱 맞아떨어진다.
여러 번 발동되는 문제
주의할 점이 있다. frame_changed는 매 프레임 호출된다. 공격 판정 프레임에서 발사 함수를 호출했는데, 같은 프레임에 시그널이 두 번 오는 경우가 있었다. 이미 발사했으면 무시하는 플래그를 두거나, attack_cooldown으로 중복 발사를 막아야 한다.
정리하자면
공격 판정을 코드 타이머로 처리하면 애니메이션 속도가 바뀔 때마다 타이밍을 다시 맞춰야 한다. 프레임 기반으로 처리하면 애니메이션 자체가 기준이 되니까 훨씬 직관적이다. 비주얼과 게임 로직이 일치하는 건 생각보다 플레이 느낌에 큰 영향을 준다.