Projext/Assets/Scripts/Obsession/ObsessionSystem.cs

110 lines
8.4 KiB
C#
Raw Normal View History

2026-02-12 15:23:25 +00:00
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을