fix(BT12-Dev): HealthIsZero sender 가드 — Enemy 사망 시 Player 즉사 버그 근본 해결

근본 원인:
- Health.Decrement·Die 4곳에서 Schedule<HealthIsZero>() (sender 미구분) 발화
- HealthIsZero.Execute가 health 영역 검증 없이 무조건 Schedule<PlayerDeath>()
- BT12-Dev Phase 2-B 투사체가 사상 처음 Enemy.Health.Decrement 호출
  → Enemy의 HealthIsZero가 처음 발화 → 무차별 PlayerDeath 직결 노출

해결:
- HealthIsZero.Execute에 PlayerController 보유 Health 검증 가드 추가
- PlayerController 보유 Health만 PlayerDeath 발화 (1줄 fix·근본)

검증:
- PD Console StackTrace t=5.18 Enemy hp=0 → t=5.19 Player Die() 1ms 직결 패턴 종결 의도

PD 지시 (2026-05-09): 1 즉시 적용.
This commit is contained in:
깃 관리자 2026-05-09 21:41:12 +09:00
parent e31c34cf24
commit b37b4a660b
1 changed files with 6 additions and 1 deletions

View File

@ -5,8 +5,10 @@ using static Platformer.Core.Simulation;
namespace Platformer.Gameplay
{
/// <summary>
/// Fired when the player health reaches 0. This usually would result in a
/// Fired when the player health reaches 0. This usually would result in a
/// PlayerDeath event.
/// BT12-Dev 2026-05-09 — sender 가드 추가. Enemy.Health hp=0 시 무차별 PlayerDeath 발화 차단.
/// 근본: Health.Decrement·Die 4곳에서 Schedule<HealthIsZero>(sender 미구분) → Execute에서 PlayerDeath 직결 → 적 처치 시 Player 즉사 버그.
/// </summary>
/// <typeparam name="HealthIsZero"></typeparam>
public class HealthIsZero : Simulation.Event<HealthIsZero>
@ -15,6 +17,9 @@ namespace Platformer.Gameplay
public override void Execute()
{
if (health == null) return;
// PlayerController 보유 Health만 PlayerDeath 발화 (Enemy 등 다른 Health 영역 차단).
if (health.GetComponent<PlayerController>() == null) return;
Schedule<PlayerDeath>();
}
}