게임에서 적과 플레이어가 충돌할 때마다 HIT 애니메이션이 반복적으로 실행되고, 캐릭터의 health가 0 이하로 떨어져도 Dead 애니메이션이 제대로 실행되지 않는 문제가 발생했다.
HIT 애니메이션 반복 실행: 충돌 시마다 OnHit()이 호출되면서 HIT 애니메이션이 계속 반복되었다. 이를 방지하려면 일정 시간 동안은 추가로 OnHit()이 호출되지 않도록 해야 했다.
Dead 애니메이션 미실행: DeadState로 전환하는 코드가 있었지만, 죽음 상태에서도 충돌 처리가 계속 발생해 Dead 애니메이션이 제대로 전환되지 않았다. 충돌이 계속 발생하면서 DeadState로 넘어가지 못하고, 이전 상태에서 애니메이션이 반복됐다.
HIT 애니메이션 문제 해결: isHit 플래그와 Coroutine을 사용해 HIT 애니메이션이 한 번 실행된 후 0.5초 동안 추가로 실행되지 않도록 처리했다. 이를 통해 일정 시간 동안 OnHit()가 다시 호출되지 않도록 막았다.
private bool isHit = false;
if (!isHit)
{
OnHit();
isHit = true;
StartCoroutine(ResetHitAfterDelay(0.5f));
}
private IEnumerator ResetHitAfterDelay(float delay)
{
yield return new WaitForSeconds(delay);
isHit = false; // 0.5초 후 다시 HIT이 가능하도록 설정
}
Dead 애니메이션 문제 해결: isDead 플래그를 추가하여 캐릭터가 죽은 이후에는 충돌 처리가 더 이상 발생하지 않도록 제어했다. isDead 플래그 덕분에 죽은 이후에는 상태 전환이 중복으로 이루어지지 않아 DeadState로 정확히 넘어가도록 했다.
private bool isDead = false;
if (GameManager.Instance.health <= 0 && !isDead)
{
GameManager.Instance.health = 0;
stateMachine.SetState(new DeadState(stateMachine, animator, gameObject));
isDead = true; // Dead 상태를 한 번만 실행하게 하기
}
애니메이션이나 상태 전환이 반복적으로 실행되는 문제를 해결할 때는 상태를 추적하는 플래그(isHit, isDead 등)를 적절히 사용하여 조건을 제어하는 것이 중요하다. 특히 충돌이 지속적으로 발생하는 상황에서는 플래그를 통해 상태 전환이 한 번만 이루어지게 해야 한다는 것을 배웠다.
