MeleeState에서 animator.SetBool("IsSwing", false);를 설정했음에도 불구하고 player.SetMoveLock(false);가 바로 적용되지 않는 문제가 발생했다. 애니메이션이 끝난 후에 바로 상태가 바뀌어야 하는데, IsSwing이 false로 변경되었음에도 움직임이 즉시 허용되지 않았다.
animator.SetBool("IsSwing", false);를 호출하는 순간 애니메이션이 즉시 종료되는 것이 아니라, 애니메이션이 끝날 때까지 시간이 필요하다.
따라서 IsSwing 값이 false로 바뀌었더라도, 실제 애니메이션이 끝나기 전에 SetMoveLock(false)가 호출되면 캐릭터가 예상보다 늦게 움직이거나, 애니메이션이 끝나기 전에 움직여버릴 수 있다.
애니메이션이 실제로 끝났는지 확인한 후 SetMoveLock(false)를 호출하도록 WaitUntil을 사용했다.
IEnumerator Swing()
{
yield return new WaitForSeconds(0.1f);
weapon.meleeArea.enabled = true;
weapon.trailEffect.enabled = true;
yield return new WaitForSeconds(0.3f);
weapon.meleeArea.enabled = false;
yield return new WaitForSeconds(0.3f);
weapon.trailEffect.enabled = false;
animator.SetBool("IsSwing", false);
// 애니메이션이 실제로 종료될 때까지 대기
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f);
player.SetMoveLock(false); // 애니메이션 종료 후 움직일 수 있도록 변경
player.fireDelay = 0;
}
animator.SetBool("IsSwing", false);를 호출한다고 애니메이션이 즉시 종료되는 것이 아니다.
WaitUntil을 사용하여 애니메이션이 끝날 때까지 대기하고, 종료 후 SetMoveLock(false)를 호출하면 자연스럽게 동작한다.