// 공격받은 것을 처리하는 함수
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함수를 호출한다.
void OnHitEvent()
{
if (_lockTarget != null)
{
Stat targetStat = _lockTarget.GetComponent<Stat>();
targetStat.OnAttacked(_stat);
OnHitEvent()에서 데미지 처리에 해당하는 코드를 위와 같이 변경하였다.
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를 토대로 스탯을 설정하였다.
레벨업이 작 적용되는 것을 확인 할 수 있었다.