using System.Collections.Generic; using UnityEngine; using Platformer.Mechanics; using EerieVillage.MyUI; using EerieVillage.Skills; namespace EerieVillage.Progression { /// /// 레벨업 발화 시 일시정지 + UI 호출 + 카드 선택 결과 수령. /// PlayerProgression.OnLevelUp 구독. /// /// Phase 2-D 정정 (2026-05-09) — SkillRuntimeFactory.RandomDraw3() + PlayerSkillInventory.AddSkillByCardId() 정식 통합. /// Phase 2-B 영역 (2026-05-08) — SkillSelectionUI 정식 통합. /// public class LevelUpManager : MonoBehaviour { public static LevelUpManager Instance { get; private set; } [SerializeField] SkillSelectionUI _ui; PlayerController _player; PlayerProgression _progression; bool _isLevelUpActive = false; // PD 지시 2026-05-13 — Player 사망 상태 영역 LevelUp 발생 시 pending 저장·부활(IsAlive=true) 시 표시 readonly System.Collections.Generic.Queue _pendingLevels = new System.Collections.Generic.Queue(); void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; } void Start() { _player = Object.FindFirstObjectByType(); if (_player == null) { Debug.LogWarning("[LevelUpManager] PlayerController 영역 부재 — Start 시점 참조 X"); return; } _progression = _player.GetComponent(); if (_progression == null) { _progression = _player.gameObject.AddComponent(); } _progression.OnLevelUp += HandleLevelUp; } void OnDestroy() { if (_progression != null) _progression.OnLevelUp -= HandleLevelUp; if (Instance == this) Instance = null; } void Update() { // PD 지시 2026-05-13 — Player 부활 영역 pending LevelUp 영역 표시 if (_pendingLevels.Count == 0) return; if (_isLevelUpActive) return; if (_player == null || _player.health == null || !_player.health.IsAlive) return; int next = _pendingLevels.Dequeue(); ShowLevelUpUI(next); } void HandleLevelUp(int newLevel) { Debug.Log($"[LevelUpManager] HandleLevelUp 호출 Lv.{newLevel} _ui={(_ui == null ? "NULL" : _ui.name)}"); // PD 지시 2026-05-13 — Player 사망 상태 영역 pending 저장 (죽는 모션 종료·부활 후 표시) if (_player != null && _player.health != null && !_player.health.IsAlive) { _pendingLevels.Enqueue(newLevel); Debug.Log($"[LevelUpManager] Player 사망 상태 영역 LevelUp pending 저장 (Lv.{newLevel})"); return; } ShowLevelUpUI(newLevel); } void ShowLevelUpUI(int newLevel) { if (_isLevelUpActive) return; _isLevelUpActive = true; // 일시정지 + 입력 차단 Time.timeScale = 0f; if (_player != null) _player.controlEnabled = false; // Phase 2-D — SkillRuntimeFactory.RandomDraw3()로 카드 3장 추출 List cards = SkillRuntimeFactory.RandomDraw3(); Debug.Log($"[LevelUpManager] cards.Count={cards.Count}"); // Phase 2-B/D 통합 — SkillSelectionUI 정식 호출 if (_ui != null) { Debug.Log($"[LevelUpManager] _ui.Show 호출 → SkillSelectionCanvas 활성 의도"); _ui.Show(cards, newLevel, HandleCardConfirmed); } else { // UI 부재 fallback Debug.LogWarning($"[LevelUpManager] SkillSelectionUI 부재 — Lv.{newLevel} 카드 {cards.Count}장 자동 확정"); HandleCardConfirmed(cards.Count > 0 ? cards[0] : null); } } void HandleCardConfirmed(ActiveSkillData selected) { // UI 닫기 if (_ui != null) _ui.Hide(); // Phase 2-D — PlayerSkillInventory.AddSkillByCardId() 정식 호출 if (selected != null) { var inventory = _player != null ? _player.GetComponent() : null; if (inventory != null) { bool ok = inventory.AddSkillByCardId(selected.CardId); Debug.Log($"[LevelUpManager] 카드 확정 — {selected.DisplayName} (AddSkillByCardId={ok})"); } else { Debug.LogWarning("[LevelUpManager] PlayerSkillInventory 영역 부재 — 스킬 등록 X (PlayerController에 컴포넌트 확인 필요)"); Debug.Log($"[LevelUpManager] 카드 확정 — {selected.DisplayName} (인벤토리 X)"); } } else { Debug.Log("[LevelUpManager] 카드 확정 — NONE"); } // 일시정지 해제 + 입력 복원 Time.timeScale = 1f; if (_player != null) _player.controlEnabled = true; _isLevelUpActive = false; } } }