EerieVillage/Assets/Scripts/Progression/LevelUpManager.cs

101 lines
3.6 KiB
C#
Raw Normal View History

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
using System.Collections.Generic;
using UnityEngine;
using Platformer.Mechanics;
namespace EerieVillage.Progression
{
/// <summary>
/// 레벨업 발화 시 일시정지 + UI 호출 + 카드 선택 결과 수령.
/// PlayerProgression.OnLevelUp 구독.
///
/// Phase 2-A 영역 — UI 호출 placeholder (Debug.Log).
/// Phase 2-B 영역 — SkillSelectionUI 영역 통합.
/// </summary>
public class LevelUpManager : MonoBehaviour
{
public static LevelUpManager Instance { get; private set; }
[SerializeField] SkillCardPlaceholderPool _pool;
// Phase 2-B 영역 — SkillSelectionUI 영역 부착
// [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;
if (_pool == null) _pool = GetComponent<SkillCardPlaceholderPool>();
}
void OnDestroy()
{
if (_progression != null) _progression.OnLevelUp -= HandleLevelUp;
if (Instance == this) Instance = null;
}
void HandleLevelUp(int newLevel)
{
if (_isLevelUpActive) return;
_isLevelUpActive = true;
// 일시정지 + 입력 차단
Time.timeScale = 0f;
if (_player != null) _player.controlEnabled = false;
// 카드 3장 무작위 추출
List<SkillCardPlaceholder> cards = _pool != null
? _pool.Draw3Random()
: new List<SkillCardPlaceholder>();
// Phase 2-A 영역 placeholder — UI 호출 영역 Phase 2-B 영역 통합
Debug.Log($"[LevelUpManager] LevelUp Lv.{newLevel} — 카드 {cards.Count}장 영역 (UI placeholder·Phase 2-B 통합 예정)");
for (int i = 0; i < cards.Count; i++)
{
var c = cards[i];
Debug.Log($" [{i + 1}] {c.displayName} ({c.rarity}·Lv.{c.currentLevel}{(c.IsMaxLevel ? "·" : "")})");
}
// Phase 2-A 영역 임시 — 즉시 첫 카드 자동 확인 + 게임 재개
// Phase 2-B 영역 = SkillSelectionUI.Show + 사용자 클릭·확인 후 콜백
HandleCardConfirmed(cards.Count > 0 ? cards[0] : null);
}
void HandleCardConfirmed(SkillCardPlaceholder selected)
{
// 차기 BT12-Dev 영역 = PlayerSkillInventory.AddSkillByCardId(selected.id)
// BT12-MVP-A 영역 = UI 닫기·게임 재개만
Debug.Log($"[LevelUpManager] 카드 확정 영역 — {(selected != null ? selected.displayName : "NONE")} (효과 적용 X·BT12-Dev 본격 영역)");
Time.timeScale = 1f;
if (_player != null) _player.controlEnabled = true;
_isLevelUpActive = false;
}
}
}