Unity3D_MMO - 레벨

k_hyun·2022년 10월 23일
0

Unity_MMO_Project

목록 보기
32/33

Stat.cs

// 공격받은 것을 처리하는 함수
    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 += 15;
        }

        Managers.Game.Despawn(gameObject);
    }

피가 일정치 만큼 떨어지면 위의 OnDead함수를 호출한다.

MonsterController.cs & PlayerController.cs

void OnHitEvent()
    {
        if (_lockTarget != null)
        {
            Stat targetStat = _lockTarget.GetComponent<Stat>();
            targetStat.OnAttacked(_stat);

OnHitEvent()에서 데미지 처리에 해당하는 코드를 위와 같이 변경하였다.

PlayerStat.cs

public int Exp 
    { 
        get { return _exp; } 
        set 
        { 
            _exp = value;
           
            int level = Level;
            // while문을 돌면서 스탯과 경험치를 비교하여 레벨 체크
            while (true)
            {
                Data.Stat stat;
                if (Managers.Data.StatDict.TryGetValue(level, out stat) == false)
                    break;
                if (_exp < stat.totalExp)
                    break;

                level++;
            }
            // 기존 레벨과 다르다면 레벨업을 하고 스탯을 재지정
            if (level != Level)
            {
                Debug.Log("Level up");
                Level = level;
                SetStat(Level);
            }
        } 
    }

Exp 프로퍼티에 대해 값 변경이 이루어지는 경우 레벨업을 체크하는 기능을 넣었다.

// DataManager에서 Json파일을 읽은 데이터를 통해 만든 Dictionary를 가져와서 사용한다.
    public void SetStat(int level)
    {
        Dictionary<int, Data.Stat> dict = Managers.Data.StatDict;
        Data.Stat stat = dict[level];
        _hp = stat.maxHp;
        _maxHp = stat.maxHp;
        _attack = stat.attack;

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

        SetStat(_level);
    }

Start에서 Dictionary에 있는 Stat Class를 토대로 스탯을 설정하였다.

실행 결과

레벨업이 작 적용되는 것을 확인 할 수 있었다.

0개의 댓글