Projext/Assets/Scripts/Player/Stats/PlayerLevelSystem.cs
2026-02-13 00:23:25 +09:00

70 lines
4.9 KiB
C#

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}"; // 텍스트를 바꿀거에요 -> 현재 레벨로
}
}