공부/인프런 - Rookiss

Part 3-13-8. 미니 RPG : 레벨업

셩잇님 2023. 9. 2. 13:19
반응형

 

 

미니 RPG

레벨업

✈ 스탯 데이터

 

📄StatData.json

{
  "stats": [
    {
      "level": "1",
      "maxHp": "200",
      "attack": "20",
      "totalExp": "0"
    },
    {
      "level": "2",
      "maxHp": "250",
      "attack": "25",
      "totalExp": "10"
    },
    {
      "level": "3",
      "maxHp": "300",
      "attack": "30",
      "totalExp": "20"
    }
  ]
}

 

각 레벨에서의 기본 스탯

 

📜Stat

	[Serializable]
	public class Stat
	{
		public int level;
		public int maxHp;
		public int attack;
		public int totalExp;
	}

 

json파일의 내용과 멤버변수 이름 일치시켜줘야 한다.

 

레벨업 처리

📜PlayerStat

public class PlayerStat : Stat
{
    [SerializeField]
	  protected int _exp;
    [SerializeField]
	  protected int _gold;

	  public int Exp { 
		  get { return _exp; } 
		  set 
      { 
			      _exp = value;
			      // 레벨업 체크
			      int level = Level;
			      while (true)
            {
				        Data.Stat stat;
				        if (Managers.Data.StatDict.TryGetValue(level + 1, out stat) == false) // 만렙이면 
					          break;
				        if (_exp < stat.totalExp) // _exp가 현재 레벨에서의 totalExp 보다 적으면 이제 레벨 증가 필요 없으므로 그만!
					          break;
				        level++;
            }

			      if (level != Level)
            {
				        Debug.Log("Level Up!");
				        Level = level;
				        SetStat(Level);
            }
		  } 
	  }
	
  public int Gold { get { return _gold; } set { _gold = value; } }

 

플레이어의 경험치를 세팅해줄 때 고려해야하는 점은, 경험치로 인한 레벨 상승이다. 경험치가 메이플스토리 재획비와 같이 한꺼번에 많이 들어온다면 level이 1 만 증가하는 것이 아니라 더 뛰어 넘을 수도 있다는 점이다. 따라서 레벨 업 과정을 while 문 내에서 진행한다.

 

위 과정을 경험치 세팅시마다 해줘야하니까 아싸리 경험치 프로퍼티의 set 에서 해주는 것이다.

 

	private void Start()
	{
		_level = 1;
		_exp = 0;
		_defense = 5;
		_moveSpeed = 5.0f;
		_gold = 0;

		SetStat(_level);
	}

	public void SetStat(int level)
    {
		Dictionary<int, Data.Stat> dict = Managers.Data.StatDict;
		Data.Stat stat = dict[level]; // level을 Key로 사용하기로 약속했었다. 레벨마다 스탯이 달라지니까!

		_hp = stat.maxHp;
		_maxHp = stat.maxHp;
		_attack = stat.attack;
	}

	protected override void OnDead(Stat attacker)
	{
		Debug.Log("Player Dead");
	}

 

📜Stat

    public virtual void OnAttacked(Stat _attacker)
    {
        int damage = Mathf.Max(0, _attacker.Attack - Defense);
        Hp -= damage;
        if (Hp <= 0)
        {
            Hp = 0;
            OnDead(_attacker);
        }
    }

    protected virtual void OnDead(Stat attacker)
    {
        PlayerStat playerStat = attacker as PlayerStat;
        if (playerStat != null)
        {
            playerStat.Exp += 100;
        }
        Managers.Game.Despawn(gameObject);
    }

 

몬스터가 플레이어한테 죽으면 플레이어의 경험치를 100만큼 올려준다! 😁

 

 

반응형