플레이어 사망 판정 및 상태 차단 구조
1. 시스템 요구 사항
플레이어의 사망은 단순히 HP가 0이 되는 이벤트가 아니라, 게임 전체 흐름을 중단시키는 결정적 상태 전환이다.
사망 이후에도 이동, 점프, 스킬, 상호작용 같은 로직이 일부라도 동작하면 게임 상태는 즉시 불안정해지고, 디버깅이 어려운 오류로 이어진다.
특히 사망 판정이 여러 스크립트에 흩어져 있거나, HP 감소 로직과 사망 처리 로직이 섞여 있으면 사망 애니메이션이 여러 번 재생되거나 UI가 중복 표시되는 문제가 발생한다.
따라서 사망 시스템은 언제 사망을 판정하는가와 사망 이후 어떤 로직을 차단하는가를 명확히 분리한 구조로 설계될 필요가 있었다.
이 시스템의 목표는 사망 판정을 단 하나의 경로로 수렴시키고, 사망 상태가 시작되는 순간 이후의 모든 플레이어 입력과 로직을 구조적으로 차단하는 것이었다.
2. 설계 목표
- 사망 판정을 단일 함수에서만 수행할 것
- 사망 상태가 되면 이후 로직이 실행되지 않도록 즉시 차단할 것
- 사망 상태가 되면 이후 로직이 실행되지 않도록 즉시 차단할 것
- 사망 처리 로직이 이동·스킬 로직과 섞이지 않도록 분리할 것
3. 흐름도

이 흐름에서 중요한 점은, 사망 판정과 사망 이후 차단이 서로 다른 단계에서 이루어진다는 것이다.
사망 여부 판단은 CheckDeath가 담당하고, 사망 이후 로직 차단은 Update 단계에서 즉시 수행된다.
4. 구현
4.1. Update 에서 상태 차단 구조
private void Update()
{
if (anim.GetBool(AnimHash.Die)) return;
HandleMovement();
skillController.HandleSkill();
CheckDeath();
}
플레이어의 Update는 가장 먼저 사망 상태를 검사한다.
사망 애니메이션 Bool이 이미 켜져 있다면, 해당 프레임에서는 어떠한 로직도 실행되지 않고 즉시 return 된다.
이 구조의 핵심은 사망 이후의 모든 행동 차단을 개별 함수에서 처리하지 않고, Update의 가장 상단에서 한 번에 막는다는 점이다.
이로 인해 이동, 점프, 스킬, 상호작용 같은 모든 로직은 사망 상태가 아닐 때만 호출될 수 있으며, 각 로직 내부에서 죽었는지를 다시 검사할 필요가 사라진다.
즉, Update는 이 프레임에 플레이어가 행동할 수 있는가를 판단하는 역할만 수행한다.
4.2. 사망 판정 단일 진입점
void CheckDeath()
{
if (playerManager.CurrentHp <= 0 &&
!anim.GetBool(AnimHash.Die) &&
!isInvincibility)
{
anim.SetBool(AnimHash.Die, true);
UI_Manager.instance.respawnUI.SetActive(true);
}
}사망 여부 판단은 CheckDeath 함수에서만 이루어진다.
이 함수는 매 프레임 호출되지만, 실제 사망 처리는 조건이 처음으로 만족되는 순간 단 한 번만 실행된다.
HP가 0 이하인지, 이미 사망 상태인지, 무적 상태가 아닌지를 동시에 검사함으로써 사망 애니메이션이 중복 실행되는 상황을 구조적으로 차단했다.
사망이 확정되면 사망 애니메이션 Bool을 활성화하고, 동시에 사망 UI를 표시한다.
이 두 처리를 같은 조건 블록 안에서 수행함으로써 화면 연출과 내부 상태가 항상 동일한 타이밍에 전환되도록 보장한다.
5. 개발 의도
이 게시글의 핵심 의도는 사망을 이벤트가 아니라 상태로 다루는 구조를 만드는 것이었다.
사망 여부를 여러 로직에서 나눠 판단하지 않고, CheckDeath라는 단일 경로로 수렴시킴으로써 사망 관련 버그의 추적 경로를 명확히 만들었다.
또한 사망 이후의 행동 차단을 각 기능 내부가 아니라 Update 최상단에서 처리함으로써, 죽었는데 움직이거나 스킬을 사용하는 등의 문제를 구조적으로 발생하지 않게 만들었다.
이 구조 덕분에 이후 기절, 대화, UI 잠금 등 다른 상태 차단 로직이 추가되더라도 Update 단계에서의 조건 분기만 확장하면 되며, 이동이나 스킬 시스템 자체는 수정할 필요가 없다.
즉, 사망 시스템은 플레이어 상태 제어의 기준점 역할을 하도록 설계되었다.
