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;
|
|
|
|
|
|
}
|