Projext/Assets/Scripts/Obsession/ObsessionSystem.cs

113 lines
3.3 KiB
C#
Raw Normal View History

2026-02-22 13:37:34 +00:00
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;
}