using System.Collections; // 코루틴 기능을 사용할거에요 -> System.Collections를 using System.Collections.Generic; // 리스트 기능을 사용할거에요 -> System.Collections.Generic을 using TMPro; // 텍스트메쉬프로 기능을 사용할거에요 -> TMPro를 using UnityEngine; // 유니티 엔진의 기본 기능을 불러올거에요 -> UnityEngine을 using UnityEngine.UI; // UI 기능을 사용할거에요 -> UnityEngine.UI를 public class PlayerLevelSystem : MonoBehaviour // 클래스를 선언할거에요 -> MonoBehaviour를 상속받는 PlayerLevelSystem을 { [Header("--- 참조 ---")] // 인스펙터 창에 제목을 표시할거에요 -> --- 참조 --- 를 [SerializeField] private Stats stats; // 변수를 선언할거에요 -> 스탯 스크립트인 stats를 [SerializeField] private PlayerHealth pHealth; // 변수를 선언할거에요 -> 체력 스크립트인 pHealth를 [Header("레벨 설정")] // 인스펙터 창에 제목을 표시할거에요 -> 레벨 설정 을 public int level = 1; // 변수를 초기화할거에요 -> 현재 레벨을 1로 public int currentExp = 0; // 변수를 초기화할거에요 -> 현재 경험치를 0으로 [SerializeField] private int[] expTable; // 배열을 선언할거에요 -> 레벨별 필요 경험치 테이블인 expTable을 [Header("UI")] // 인스펙터 창에 제목을 표시할거에요 -> UI 를 [SerializeField] private Image expFillImage; // 변수를 선언할거에요 -> 경험치바 이미지인 expFillImage를 [SerializeField] private TextMeshProUGUI expText; // 변수를 선언할거에요 -> 경험치 텍스트인 expText를 [SerializeField] private TextMeshProUGUI levelText; // 변수를 선언할거에요 -> 레벨 텍스트인 levelText를 public static System.Action OnLevelUp; // 이벤트를 선언할거에요 -> 레벨업 시 호출될 정적 이벤트 OnLevelUp을 private int RequiredExp // 프로퍼티를 선언할거에요 -> 필요 경험치를 반환하는 RequiredExp를 { get { int index = level - 1; // 인덱스를 계산할거에요 -> 레벨에서 1을 뺀 값으로 if (index >= expTable.Length) return expTable[expTable.Length - 1]; // 조건이 맞으면 반환할거에요 -> 만렙이면 마지막 필요 경험치를 return expTable[index]; // 반환할거에요 -> 현재 레벨의 필요 경험치를 } } private void OnEnable() { MonsterClass.OnMonsterKilled += GainExp; UpdateExpUI(); } // 함수를 실행할거에요 -> 몬스터 처치 이벤트 구독과 UI 갱신을 private void OnDisable() { MonsterClass.OnMonsterKilled -= GainExp; } // 함수를 실행할거에요 -> 몬스터 처치 이벤트 구독 해제를 void GainExp(int amount) // 함수를 선언할거에요 -> 경험치를 획득하는 GainExp를 { currentExp += amount; // 값을 더할거에요 -> 획득한 경험치를 현재 경험치에 while (currentExp >= RequiredExp) { currentExp -= RequiredExp; LevelUp(); } // 반복할거에요 -> 경험치가 꽉 찼다면 레벨업을 UpdateExpUI(); // 실행할거에요 -> UI 갱신 함수를 } void LevelUp() // 함수를 선언할거에요 -> 레벨업 처리를 하는 LevelUp을 { if (level >= expTable.Length + 1) { currentExp = 0; return; } // 조건이 맞으면 중단할거에요 -> 최대 레벨이라면 경험치만 비우고 리턴 level++; // 값을 증가시킬거에요 -> 레벨을 1만큼 // ✨ 힘 대신 공격력(+10) 증가 if (stats != null) stats.AddBaseLevelUpStats(1000f, 10f); // 실행할거에요 -> 스탯 증가 함수를 (체력 1000, 공격력 10) if (pHealth != null) pHealth.RefreshHealthUI(); // 실행할거에요 -> 체력 UI 갱신을 StartCoroutine(DelayedCardPopup()); // 코루틴을 시작할거에요 -> 카드 선택 팝업 지연 실행을 } private IEnumerator DelayedCardPopup() // 코루틴 함수를 선언할거에요 -> 카드 팝업을 지연시키는 DelayedCardPopup을 { yield return new WaitForSeconds(1.5f); // 기다릴거에요 -> 1.5초 동안 OnLevelUp?.Invoke(); // 이벤트를 실행할거에요 -> 레벨업 알림 이벤트를 } void UpdateExpUI() // 함수를 선언할거에요 -> 경험치 UI를 갱신하는 UpdateExpUI를 { float fill = (float)currentExp / RequiredExp; // 비율을 계산할거에요 -> 현재 경험치 나누기 필요 경험치로 if (expFillImage != null) expFillImage.fillAmount = fill; // 값을 설정할거에요 -> 게이지 채움 정도를 if (expText != null) expText.text = $"{currentExp} / {RequiredExp}"; // 텍스트를 바꿀거에요 -> 현재/필요 경험치 수치로 if (levelText != null) levelText.text = $"Lv. {level}"; // 텍스트를 바꿀거에요 -> 현재 레벨로 } }