using UnityEngine; // 유니티 기본 기능을 쓰기 위해 불러올거에요 -> UnityEngine를 public class ObsessionSystem : MonoBehaviour // 클래스를 선언할거에요 -> 영구 XP/런 XP/레벨을 관리하는 ObsessionSystem을 { // 코드 블록을 시작할거에요 -> ObsessionSystem 범위를 public static ObsessionSystem instance; // 정적 변수를 선언할거에요 -> 어디서든 접근 가능한 싱글톤 instance를 [SerializeField] private int currentXP = 0; // 변수를 선언할거에요 -> 영구 XP(저장되는 진행도)를 currentXP에 [SerializeField] private int currentLevel = 1; // 변수를 선언할거에요 -> 현재 레벨을 currentLevel에 [SerializeField] private int[] xpRequirements = { 100, 300, 500, 800, 1200 }; // 배열을 선언할거에요 -> 레벨업 필요 XP 목록을 [SerializeField] private int currentRunXP = 0; // 변수를 선언할거에요 -> 이번 런에서 쌓인 임시 XP를 currentRunXP에 private void Awake() // 함수를 선언할거에요 -> 오브젝트가 켜질 때 1번 실행되는 Awake를 { // 코드 블록을 시작할거에요 -> Awake 범위를 if (instance == null) // 조건을 검사할거에요 -> 싱글톤이 아직 없으면 { // 코드 블록을 시작할거에요 -> 최초 생성 처리 instance = this; // 값을 넣을거에요 -> instance에 자신을 등록 DontDestroyOnLoad(gameObject); // 파괴하지 않을거에요 -> 씬이 바뀌어도 유지되게 } // 코드 블록을 끝낼거에요 -> 최초 생성 처리 else // 조건이 아니면 실행할거에요 -> 이미 instance가 있으면 { // 코드 블록을 시작할거에요 -> 중복 제거 처리 Destroy(gameObject); // 파괴할거에요 -> 중복 오브젝트를 } // 코드 블록을 끝낼거에요 -> 중복 제거 처리 } // 코드 블록을 끝낼거에요 -> Awake를 private void Start() // 함수를 선언할거에요 -> 시작 시 1회 실행되는 Start를 { // 코드 블록을 시작할거에요 -> Start 범위를 LoadData(); // 함수를 실행할거에요 -> 저장된 데이터 불러오기 Debug.Log($"[집착 시스템] 시작! 현재 레벨: {currentLevel}, XP: {currentXP}"); // 로그를 찍을거에요 -> 시작 상태 출력 currentRunXP = 0; // 값을 초기화할거에요 -> 새 런 시작이니 임시 XP를 0으로 Debug.Log($"[새 런 시작] 이번 런에 쌓을 임시 XP: 0"); // 로그를 찍을거에요 -> 런 XP 초기화 확인 } // 코드 블록을 끝낼거에요 -> Start를 public void AddRunXP(int amount) // 함수를 선언할거에요 -> 플레이 중 임시 XP를 더하는 AddRunXP를 { // 코드 블록을 시작할거에요 -> AddRunXP 범위를 currentRunXP += amount; // 값을 더할거에요 -> 임시 XP에 amount만큼 Debug.Log($"[런 XP 획득] +{amount}XP (이번 런 총: {currentRunXP})"); // 로그를 찍을거에요 -> 현재 런 XP 출력 } // 코드 블록을 끝낼거에요 -> AddRunXP를 public void OnDeathConvertXP() // 함수를 선언할거에요 -> 사망 시 임시 XP를 영구 XP로 바꾸는 OnDeathConvertXP를 { // 코드 블록을 시작할거에요 -> OnDeathConvertXP 범위를 Debug.Log($"[사망] 이번 런 성과: {currentRunXP}XP를 영구 XP로 전환!"); // 로그를 찍을거에요 -> 전환 안내 AddXP(currentRunXP); // 함수를 실행할거에요 -> 임시 XP만큼 영구 XP에 추가(레벨업/저장 포함) currentRunXP = 0; // 값을 초기화할거에요 -> 다음 런을 위해 임시 XP를 0으로 } // 코드 블록을 끝낼거에요 -> OnDeathConvertXP를 public void AddXP(int amount) // 함수를 선언할거에요 -> 영구 XP를 더하는 AddXP를 { // 코드 블록을 시작할거에요 -> AddXP 범위를 currentXP += amount; // 값을 더할거에요 -> 영구 XP에 amount만큼 Debug.Log($"[영구 XP 획득] +{amount}XP (현재: {currentXP})"); // 로그를 찍을거에요 -> 영구 XP 현황 출력 CheckLevelUp(); // 함수를 실행할거에요 -> 레벨업 조건 확인 SaveData(); // 함수를 실행할거에요 -> 변경된 데이터 저장 } // 코드 블록을 끝낼거에요 -> AddXP를 private void CheckLevelUp() // 함수를 선언할거에요 -> 레벨업 여부를 검사하는 CheckLevelUp을 { // 코드 블록을 시작할거에요 -> CheckLevelUp 범위를 if (currentLevel - 1 < xpRequirements.Length) // 조건을 검사할거에요 -> 요구치 배열 범위 안인지 { // 코드 블록을 시작할거에요 -> 범위 안이면 int requiredXP = xpRequirements[currentLevel - 1]; // 값을 가져올거에요 -> 현재 레벨의 필요 XP를 requiredXP에 if (currentXP >= requiredXP) // 조건을 검사할거에요 -> 영구 XP가 요구치 이상인지 { // 코드 블록을 시작할거에요 -> 레벨업 처리 currentLevel++; // 레벨을 올릴거에요 -> 현재 레벨 +1 Debug.Log($"🎉 [레벨업!] 레벨 {currentLevel - 1} → {currentLevel}"); // 로그를 찍을거에요 -> 레벨업 안내 UnlockRewards(currentLevel); // 함수를 실행할거에요 -> 레벨 보상 해금 처리 } // 코드 블록을 끝낼거에요 -> 레벨업 처리 } // 코드 블록을 끝낼거에요 -> 범위 체크 } // 코드 블록을 끝낼거에요 -> CheckLevelUp을 private void UnlockRewards(int level) // 함수를 선언할거에요 -> 레벨 보상을 해금하는 UnlockRewards를 { // 코드 블록을 시작할거에요 -> UnlockRewards 범위를 // 보상 코드는 기존과 동일 // 설명을 적을거에요 -> 보상 구현은 여기에 추가하면 됨 } // 코드 블록을 끝낼거에요 -> UnlockRewards를 private void SaveData() // 함수를 선언할거에요 -> PlayerPrefs에 저장하는 SaveData를 { // 코드 블록을 시작할거에요 -> SaveData 범위를 PlayerPrefs.SetInt("ObsessionLevel", currentLevel); // 값을 저장할거에요 -> 레벨을 ObsessionLevel 키로 PlayerPrefs.SetInt("ObsessionXP", currentXP); // 값을 저장할거에요 -> 영구 XP를 ObsessionXP 키로 PlayerPrefs.Save(); // 저장을 확정할거에요 -> PlayerPrefs.Save 호출 } // 코드 블록을 끝낼거에요 -> SaveData를 private void LoadData() // 함수를 선언할거에요 -> PlayerPrefs에서 불러오는 LoadData를 { // 코드 블록을 시작할거에요 -> LoadData 범위를 currentLevel = PlayerPrefs.GetInt("ObsessionLevel", 1); // 값을 불러올거에요 -> 저장된 레벨이 없으면 1로 currentXP = PlayerPrefs.GetInt("ObsessionXP", 0); // 값을 불러올거에요 -> 저장된 XP가 없으면 0으로 } // 코드 블록을 끝낼거에요 -> LoadData를 // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // 구분선을 적을거에요 -> 테스트/조회 섹션 시작을 // 🧪 테스트용: 현재 상태를 읽는 함수들 // 설명을 적을거에요 -> 외부 조회용 getter들 // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // 구분선을 적을거에요 -> 테스트/조회 섹션을 public int GetCurrentRunXP() // 함수를 선언할거에요 -> 현재 런 XP를 반환하는 GetCurrentRunXP를 { // 코드 블록을 시작할거에요 -> GetCurrentRunXP 범위를 return currentRunXP; // 값을 돌려줄거에요 -> 임시 XP를 } // 코드 블록을 끝낼거에요 -> GetCurrentRunXP를 public int GetCurrentXP() // 함수를 선언할거에요 -> 현재 영구 XP를 반환하는 GetCurrentXP를 { // 코드 블록을 시작할거에요 -> GetCurrentXP 범위를 return currentXP; // 값을 돌려줄거에요 -> 영구 XP를 } // 코드 블록을 끝낼거에요 -> GetCurrentXP를 public int GetCurrentLevel() // 함수를 선언할거에요 -> 현재 레벨을 반환하는 GetCurrentLevel을 { // 코드 블록을 시작할거에요 -> GetCurrentLevel 범위를 return currentLevel; // 값을 돌려줄거에요 -> 현재 레벨을 } // 코드 블록을 끝낼거에요 -> GetCurrentLevel을 } // 코드 블록을 끝낼거에요 -> ObsessionSystem을