현재 가지고 있는 재화에 따라 스탯 레벨업이 적용된다.

 

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) -> 증가폭이 점점 상승함 (현재 적용중인 함수)

 

 

+ Recent posts