EerieVillage/Assets/Scripts/Gameplay/EnemyDeath.cs

62 lines
3.4 KiB
C#

using Platformer.Core;
using Platformer.Mechanics;
using UnityEngine;
namespace Platformer.Gameplay
{
/// <summary>
/// Fired when the health component on an enemy has a hitpoint value of 0.
/// BT104 (PD 명시 2026-05-08): Enemy 사망 시 patrol·시각 영역 비활성 + 1초 후 GameObject Destroy
/// </summary>
public class EnemyDeath : Simulation.Event<EnemyDeath>
{
public EnemyController enemy;
public override void Execute()
{
if (enemy == null) return;
// PD 지시 2026-05-13 — 불태우기 (EnemyDoTState) 즉시 정리·fxInstance 영역 OnDestroy 영역 자동 영역
var dot = enemy.GetComponent<EerieVillage.Skills.Effectors.EnemyDoTState>();
if (dot != null) Object.Destroy(dot);
// 충돌·이동·patrol 영역 비활성
if (enemy._collider != null) enemy._collider.enabled = false;
if (enemy.control != null) enemy.control.enabled = false;
enemy.enabled = false; // EnemyController patrol 영역 정지
// BT105 — 제자리 사망 (PD 명시 2026-05-08): Rigidbody2D simulated = false → gravity X·물리 미참여
var body = enemy.GetComponent<Rigidbody2D>();
if (body != null) body.simulated = false;
// death 애니메이션 트리거 (Enemy.controller 영역의 'death' parameter)
// BT12-Dev 2026-05-10 — Enemy.controller 영역 Idle/Run/Hurt → Death transition 추가 후 정합 발동.
// BT12-Dev 2026-05-10 근본 fix — Time.timeScale = 0 (카드 선택 모드) 영역 Animator Update Mode = Normal 정지 회피.
// updateMode = UnscaledTime 영역 → timeScale 영향 X · death animation 정합 재생 + transition 정합 발동.
// PD 지시 2026-05-13 — 사망 모션 시각 위치 보정 y -0.5 (Animator death 영역 sprite 위로 떠 보이는 현상 정정)
enemy.transform.position += new Vector3(0f, -0.5f, 0f);
var animator = enemy.GetComponent<Animator>();
if (animator != null)
{
animator.updateMode = AnimatorUpdateMode.UnscaledTime;
animator.SetTrigger("death");
}
// 사운드
if (enemy._audio != null && enemy.ouch != null)
enemy._audio.PlayOneShot(enemy.ouch);
// BT12-Dev 2026-05-10 근본 fix — Time.timeScale = 0 (카드 선택 모드) 영역 Object.Destroy(1f) 적용 X 영역 회피.
// (1) MonoBehaviour Coroutine 영역 X — 본 Event는 일반 객체. 직접 Destroy 영역 즉시 호출.
// (2) death 애니메이션 영역 GameObject 활성 영역 의무 — SetActive(false) 영역 X·Destroy 1.5f 영역 timeScale 영향 영역.
// (3) 안전 영역 — destroyOnLoad 정합·timeScale=0 영역 영역 영역 — Destroy 영역 다음 frame 영역 적용 영역 (Time.timeScale=0 영역 영역 적용 X).
// → 핵심: timeScale=1 시점 영역 LevelUpManager 카드 선택 종료 후 Time.timeScale=1 영역 → Destroy 영역 정합 적용.
Object.Destroy(enemy.gameObject, 1f);
// BT12-MVP-A 영역 신규 (2026-05-08) — 적 처치 시 EXP 발급
var player = Object.FindFirstObjectByType<PlayerController>();
EerieVillage.Progression.ExperienceSystem.OnEnemyKilled(enemy, player);
}
}
}