using UnityEngine; using System; public class ObsessionSystem : MonoBehaviour { public static ObsessionSystem instance; [Header("생존 시간 기록")] private float survivalTimer = 0f; private bool isRunActive = false; [SerializeField] private int currentXP = 0; [SerializeField] private int currentLevel = 1; [SerializeField] private int[] xpRequirements = { 100, 300, 500, 800, 1200 }; [SerializeField] private int currentRunXP = 0; [SerializeField] private int clearedRoomsThisRun = 0; [Header("XP 바구니들")] [SerializeField] private int runMobKillXP = 0; [SerializeField] private int runStageClearXP = 0; [SerializeField] private int runBossKillXP = 0; [SerializeField] private int runPerfectClearXP = 0; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } private void Start() { LoadData(); ResetRunData(); } private void Update() { if (isRunActive) survivalTimer += Time.deltaTime; } public void ResetRunData() { currentRunXP = 0; clearedRoomsThisRun = 0; runMobKillXP = 0; runStageClearXP = 0; runBossKillXP = 0; runPerfectClearXP = 0; survivalTimer = 0f; isRunActive = true; } // ─── 런 XP 획득 함수들 ─── public void AddRunXP(int amount) { currentRunXP += amount; runMobKillXP += amount; } // RoomManager.cs 에러 해결용 함수들 public void NotifyRoomCleared() { clearedRoomsThisRun++; } public void AddStageClearXP(int amount) { currentRunXP += amount; runStageClearXP += amount; } public void AddPerfectClearXP(int amount) { currentRunXP += amount; runPerfectClearXP += amount; } public void AddBossKillXP(int amount) { currentRunXP += amount; runBossKillXP += amount; } // 사망 시 호출 public void OnDeathConvertXP() { isRunActive = false; if (ObsessionUI.Instance != null) { // UI에 모든 성과 전달 ObsessionUI.Instance.ShowDeathUI(survivalTimer, runMobKillXP, runStageClearXP, runBossKillXP, runPerfectClearXP, 0, currentRunXP, currentXP, xpRequirements); } AddXP(currentRunXP); ResetRunData(); } public void AddXP(int amount) { currentXP += amount; CheckLevelUp(); SaveData(); } private void CheckLevelUp() { if (currentLevel - 1 < xpRequirements.Length) { if (currentXP >= xpRequirements[currentLevel - 1]) { currentLevel++; CheckLevelUp(); // 연속 레벨업 체크 } } } private void SaveData() { PlayerPrefs.SetInt("ObsessionLevel", currentLevel); PlayerPrefs.SetInt("ObsessionXP", currentXP); PlayerPrefs.Save(); } private void LoadData() { currentLevel = PlayerPrefs.GetInt("ObsessionLevel", 1); currentXP = PlayerPrefs.GetInt("ObsessionXP", 0); } public int GetCurrentRunXP() => currentRunXP; public int GetCurrentXP() => currentXP; public int GetCurrentLevel() => currentLevel; public int GetClearedRoomsThisRun() => clearedRoomsThisRun; }