PlayerInfoModel.cs
public void HpLevelUp(int amount)
{
//플레이어가 가지고 있는 골드가 업그레이드 코스트보다 높으면 true
if (GameManager.Instance.player.UserData.Gold >= Utils.UpgradeCost(Status.Hp))
{
//플레이어 골드 - 업그레이드 코스트 비용 적용
GameManager.Instance.player.UserData.Gold =
Mathf.Max(0, GameManager.Instance.player.UserData.Gold - BigInteger.ToInt32(Utils.UpgradeCost(Status.Hp)));
//플레이어 레벨업 => 스텟 증가량 및 스테이터스 타입을 전달하여 스탯 증가
GameManager.Instance.player.LevelUp(amount, Status.Hp);
OnHpUpgrade?.Invoke(); //View에 데이터를 전달하여 출력을 갱신함
}
}
Utils.cs에 있는 static Class
/// <summary>
/// 스텟 업그레이드시 적용되는 코스트 증가율 수식
/// </summary>
/// <param name="baseCost">초기 비용. 레벨 1에서의 기본 비용입니다.</param>
/// <param name="level">현재 레벨</param>
/// <param name="growRate">코스트 증가율 (예: 1.5~2.0 사이).</param>
/// <param name="constantIncrease">레벨마다 고정적으로 추가되는 비용 (선택 사항).</param>
/// <returns></returns>
public static BigInteger UpgradeCost(Status statType)
{
int baseCost = 0;
float growRate = 0;
int playerStatLevel = 0;
int constIncrease = 0;
switch (statType)
{
case Status.Hp:
/*필요한 데이터를 StatUpgradeDB에서 호출해서 사용 */
baseCost = DataManager.Instance.StatUpgradeDB.GetByKey(100).MaxHealthBaseCost;
growRate = DataManager.Instance.StatUpgradeDB.GetByKey(100).MaxHealthGrowRate;
/*플레이어의 스텟 레벨을 호출 */
playerStatLevel = GameManager.Instance.player.StatHandler.CurrentStat.MaxHealthLevel;
constIncrease = 20;
break;
case Status.Atk:
baseCost = DataManager.Instance.StatUpgradeDB.GetByKey(100).AtkBaseCost;
growRate = DataManager.Instance.StatUpgradeDB.GetByKey(100).AtkGrowRate;
playerStatLevel = GameManager.Instance.player.StatHandler.CurrentStat.AtkLevel;
constIncrease = 20;
break;
case Status.Def:
baseCost = DataManager.Instance.StatUpgradeDB.GetByKey(100).DefBaseCost;
growRate = DataManager.Instance.StatUpgradeDB.GetByKey(100).DefGrowRate;
playerStatLevel = GameManager.Instance.player.StatHandler.CurrentStat.DefLevel;
constIncrease = 20;
break;
case Status.ReduceDmg:
baseCost = DataManager.Instance.StatUpgradeDB.GetByKey(100).ReduceDamageBaseCost;
growRate = DataManager.Instance.StatUpgradeDB.GetByKey(100).ReduceDamageGrowRate;
playerStatLevel = GameManager.Instance.player.StatHandler.CurrentStat.ReduceDamageLevel;
constIncrease = 20;
break;
case Status.CritChance:
baseCost = DataManager.Instance.StatUpgradeDB.GetByKey(100).CriticalRateBaseCost;
growRate = DataManager.Instance.StatUpgradeDB.GetByKey(100).CriticalRateGrowRate;
playerStatLevel = GameManager.Instance.player.StatHandler.CurrentStat.CriticalRateLevel;
constIncrease = 20;
break;
case Status.CritDmg:
baseCost = DataManager.Instance.StatUpgradeDB.GetByKey(100).CriticalDamageBaseCost;
growRate = DataManager.Instance.StatUpgradeDB.GetByKey(100).CriticalDamageGrowRate;
playerStatLevel = GameManager.Instance.player.StatHandler.CurrentStat.CriticalDamageLevel;
constIncrease = 20;
break;
}
//코스트가 증가하는 기본적인 적용 수식 중 하나
int Cost = (int)(baseCost * Mathf.Pow(playerStatLevel, growRate) + (playerStatLevel * constIncrease));
return new BigInteger(Cost);
}
Cost가 레벨에 증가함에 따라 서서히 증가하는 함수가 필요 했기에 검색해보니
방치형 게임에서 주로 사용되는 수식이 하나 존재하여 사용하였다.
빠른 성장 속도의 게임 | GrowRate ▲ | BaseCost ▽ |
느린 성장 속도의 게임 | GrowRate ▽ | ConstantIncrease ▲ |
성장 속도의 커브를 조정 (제곱하는 자리에 해당 함수를 대입하면됨) |
로그함수(y = logx) 적용 -> 증가폭이 점점 줄어듬 | 지수함수(y=x^2) -> 증가폭이 점점 상승함 (현재 적용중인 함수) |