Chapter 13-10. 미니 RPG : 레벨업

Date:     Updated:

카테고리:

태그:

인프런에 있는 Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click

Chapter 13. 미니 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만큼 올려준다!



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 2 카테고리 내 다른 글 보러가기

댓글 남기기