EerieVillage/Assets/Scripts/Progression/LevelUpManager.cs

122 lines
4.3 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using Platformer.Mechanics;
using EerieVillage.MyUI;
using EerieVillage.Skills;
namespace EerieVillage.Progression
{
/// <summary>
/// 레벨업 발화 시 일시정지 + UI 호출 + 카드 선택 결과 수령.
/// PlayerProgression.OnLevelUp 구독.
///
/// Phase 2-D 정정 (2026-05-09) — SkillRuntimeFactory.RandomDraw3() + PlayerSkillInventory.AddSkillByCardId() 정식 통합.
/// Phase 2-B 영역 (2026-05-08) — SkillSelectionUI 정식 통합.
/// </summary>
public class LevelUpManager : MonoBehaviour
{
public static LevelUpManager Instance { get; private set; }
[SerializeField] SkillSelectionUI _ui;
PlayerController _player;
PlayerProgression _progression;
bool _isLevelUpActive = false;
void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
}
void Start()
{
_player = Object.FindFirstObjectByType<PlayerController>();
if (_player == null)
{
Debug.LogWarning("[LevelUpManager] PlayerController 영역 부재 — Start 시점 참조 X");
return;
}
_progression = _player.GetComponent<PlayerProgression>();
if (_progression == null)
{
_progression = _player.gameObject.AddComponent<PlayerProgression>();
}
_progression.OnLevelUp += HandleLevelUp;
}
void OnDestroy()
{
if (_progression != null) _progression.OnLevelUp -= HandleLevelUp;
if (Instance == this) Instance = null;
}
void HandleLevelUp(int newLevel)
{
Debug.Log($"[LevelUpManager] HandleLevelUp 호출 Lv.{newLevel} _ui={(_ui == null ? "NULL" : _ui.name)}");
if (_isLevelUpActive) return;
_isLevelUpActive = true;
// 일시정지 + 입력 차단
Time.timeScale = 0f;
if (_player != null) _player.controlEnabled = false;
// Phase 2-D — SkillRuntimeFactory.RandomDraw3()로 카드 3장 추출
List<ActiveSkillData> 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<PlayerSkillInventory>()
: 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;
}
}
}