EerieVillage/Assets/Scripts/Gameplay/EnemyDeath.cs

59 lines
3.2 KiB
C#
Raw Normal View History

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)
fix(BT12-Dev): EnemyDeath 근본 fix — Animator transition 5 + UnscaledTime + 진단 회수 근본 원인 (본 PM MCP 직접 진단): - Enemy.controller 영역 Idle/Run/Hurt → Death/Hurt transition 부재 → death Trigger 호출 영역 transition X - Animator updateMode = Normal·Time.timeScale = 0 (LevelUp 카드 선택) → Animator.Update 정지 → transition 영역 X 해결 (본 PM 자율 결정 + MCP 직접 적용): - Enemy.controller transition 5 추가 (Idle→Death, Idle→Hurt, Run→Death, Run→Hurt, Hurt→Death) → manage_animation controller_add_transition 영역 직접 호출 - EnemyDeath.cs animator.updateMode = AnimatorUpdateMode.UnscaledTime 추가 → Time.timeScale = 0 영역 영역 Animator 영역 정상 진행 → death animation 재생 + transition 발동 - 진단 Debug.Log 회수: Projectile (8 분기)·AttackHitbox (1줄)·EnemyDeath (1줄) → 사망 원인 확정 영역 회수 의무 정합 본 PM MCP 직접 진단 절차: 1. read_console — Console 직접 읽기 (Health@Enemy·Projectile 출력 검증) 2. controller_get_info — Enemy.controller parameters·states·transitions 직접 검증 3. execute_code — Player·Enemy 위치·Schedule<EnemyDeath> 직접 호출·Animator state 검증 4. manage_animation controller_add_transition — Animator transition 5 직접 추가 5. anim.SetTrigger("death") + anim.Update(0.5f) → Baddie-Death 진입 정합 검증 PD 결정 (2026-05-10): "MCP 활용해서 네가 직접 체크해" — 본 PM 자율 진단·fix·검증. PD 자성 #13: PD에게 작업 떠넘기기 금지·MCP 능동 활용 의무.
2026-05-09 16:09:17 +00:00
// 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 정합 발동.
var animator = enemy.GetComponent<Animator>();
fix(BT12-Dev): EnemyDeath 근본 fix — Animator transition 5 + UnscaledTime + 진단 회수 근본 원인 (본 PM MCP 직접 진단): - Enemy.controller 영역 Idle/Run/Hurt → Death/Hurt transition 부재 → death Trigger 호출 영역 transition X - Animator updateMode = Normal·Time.timeScale = 0 (LevelUp 카드 선택) → Animator.Update 정지 → transition 영역 X 해결 (본 PM 자율 결정 + MCP 직접 적용): - Enemy.controller transition 5 추가 (Idle→Death, Idle→Hurt, Run→Death, Run→Hurt, Hurt→Death) → manage_animation controller_add_transition 영역 직접 호출 - EnemyDeath.cs animator.updateMode = AnimatorUpdateMode.UnscaledTime 추가 → Time.timeScale = 0 영역 영역 Animator 영역 정상 진행 → death animation 재생 + transition 발동 - 진단 Debug.Log 회수: Projectile (8 분기)·AttackHitbox (1줄)·EnemyDeath (1줄) → 사망 원인 확정 영역 회수 의무 정합 본 PM MCP 직접 진단 절차: 1. read_console — Console 직접 읽기 (Health@Enemy·Projectile 출력 검증) 2. controller_get_info — Enemy.controller parameters·states·transitions 직접 검증 3. execute_code — Player·Enemy 위치·Schedule<EnemyDeath> 직접 호출·Animator state 검증 4. manage_animation controller_add_transition — Animator transition 5 직접 추가 5. anim.SetTrigger("death") + anim.Update(0.5f) → Baddie-Death 진입 정합 검증 PD 결정 (2026-05-10): "MCP 활용해서 네가 직접 체크해" — 본 PM 자율 진단·fix·검증. PD 자성 #13: PD에게 작업 떠넘기기 금지·MCP 능동 활용 의무.
2026-05-09 16:09:17 +00:00
if (animator != null)
{
animator.updateMode = AnimatorUpdateMode.UnscaledTime;
animator.SetTrigger("death");
}
// 사운드
if (enemy._audio != null && enemy.ouch != null)
enemy._audio.PlayOneShot(enemy.ouch);
fix(BT12-Dev): EnemyDeath 근본 fix — Animator transition 5 + UnscaledTime + 진단 회수 근본 원인 (본 PM MCP 직접 진단): - Enemy.controller 영역 Idle/Run/Hurt → Death/Hurt transition 부재 → death Trigger 호출 영역 transition X - Animator updateMode = Normal·Time.timeScale = 0 (LevelUp 카드 선택) → Animator.Update 정지 → transition 영역 X 해결 (본 PM 자율 결정 + MCP 직접 적용): - Enemy.controller transition 5 추가 (Idle→Death, Idle→Hurt, Run→Death, Run→Hurt, Hurt→Death) → manage_animation controller_add_transition 영역 직접 호출 - EnemyDeath.cs animator.updateMode = AnimatorUpdateMode.UnscaledTime 추가 → Time.timeScale = 0 영역 영역 Animator 영역 정상 진행 → death animation 재생 + transition 발동 - 진단 Debug.Log 회수: Projectile (8 분기)·AttackHitbox (1줄)·EnemyDeath (1줄) → 사망 원인 확정 영역 회수 의무 정합 본 PM MCP 직접 진단 절차: 1. read_console — Console 직접 읽기 (Health@Enemy·Projectile 출력 검증) 2. controller_get_info — Enemy.controller parameters·states·transitions 직접 검증 3. execute_code — Player·Enemy 위치·Schedule<EnemyDeath> 직접 호출·Animator state 검증 4. manage_animation controller_add_transition — Animator transition 5 직접 추가 5. anim.SetTrigger("death") + anim.Update(0.5f) → Baddie-Death 진입 정합 검증 PD 결정 (2026-05-10): "MCP 활용해서 네가 직접 체크해" — 본 PM 자율 진단·fix·검증. PD 자성 #13: PD에게 작업 떠넘기기 금지·MCP 능동 활용 의무.
2026-05-09 16:09:17 +00:00
// 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 Phase 2-A: 경험치·레벨업 시스템 코드 + JSON 테이블 PD 직접 지시 2026-05-08 — (b) 채택 + JSON 테이블 영역 관리. 신규 영역 (8 파일): - Assets/Resources/Progression/level_xp_table.json — Lv 1~30 EXP 테이블 (balance-designer SOT) - Assets/Scripts/Progression/LevelXPTableLoader.cs — Resources.Load + JsonUtility 캐시 - Assets/Scripts/Progression/PlayerProgression.cs — Level·EXP 진행도 (BT12-Dev v1 PlayerStats와 직무 분리) - Assets/Scripts/Progression/ExperienceSystem.cs — EXP 발급 정적 게이트웨이 - Assets/Scripts/Progression/SkillCardPlaceholder.cs — placeholder ScriptableObject - Assets/Scripts/Progression/SkillCardPlaceholderPool.cs — 카드 풀·Draw3Random - Assets/Scripts/Progression/LevelUpManager.cs — 레벨업 발화·일시정지·UI placeholder (Phase 2-B 통합) 기존 파일 수정 (2 파일): - EnemyDeath.cs Execute 마지막 영역 ExperienceSystem.OnEnemyKilled 호출 - PlayerController.cs Awake PlayerProgression 자동 부착 회귀 위험: - BT5-Dev 발판/몬스터 영역 영향 X (EnemyDeath 호출 마지막·PlayerController 자동 부착) - BT7-Dev VS 순수형 영향 X (Schedule 영역 변경 X) - BT12-Dev v1 영역 충돌 X (PlayerStats 분리·신규 namespace EerieVillage.Progression) Phase 2-A 영역 검증: - 적 처치 → EXP 누적 → Lv 임계점 → Console [LevelUpManager] 영역 출력 확증 - Phase 2-B 영역 = SkillSelectionUI prefab + 5 placeholder asset + Scene 통합
2026-05-08 08:53:39 +00:00
// BT12-MVP-A 영역 신규 (2026-05-08) — 적 처치 시 EXP 발급
var player = Object.FindFirstObjectByType<PlayerController>();
EerieVillage.Progression.ExperienceSystem.OnEnemyKilled(enemy, player);
}
}
}