우당탕탕 개발일지

전투시스템 설계 - StatManager 로 다양한 효과 전투에 적용하기 본문

Client

전투시스템 설계 - StatManager 로 다양한 효과 전투에 적용하기

devchop 2025. 2. 12. 19:11

 

RPG에서는 다양한 성장시스템을 통해 캐릭터를 강화한다. 이러한 효과들을 한데모아 관리하고, 실제 전투에 적용해야한다.

 

IStatManager

다양한 성장시스템을 통해 얻은 강화효과들을 한데 모아 관리하고, 전체 능력치 정보를 받아볼 수 있는 전체 매니저이다.

효과는 총 3가지이다.

  1. FlatStatEffect : 단순한 스탯증가 효과이다. 아무런 조건이 없고, 전투와 상관없는 스탯증가이다.
  2. PersistentEffect : 전투중 효과. 조건이붙거나(a타입 무기 장착 시 공격력증가). 공격데미지 계산시, 이 이펙트먼저 적용된다.
  3. OneTimeEffect : 두번 더 때린다와 같이, 한번만 적용되어야하는 효과이다.

효과를 적용할땐 StatModifier에 담아서 효과를 넣어준다. 

 

StatModifier 

어떤 강화내용인지를 저장한다.

  1. IStatCondition : abstract class.  활성화될 수 있는지 조건을 체크한다. 타입별로 상속받아 구현한다.
  2. IStatEffect : abstract class 어떤 효과인지, 효과를 적용하는 부분이다. 타입별로 상속받아 구현한다.

전투에 사용할때, StatManager.DoAttack(BattleContext context) 를 수행하여 강화된 데미지를 전달받는다.

조건을 탐색하거나, 실제 효과를 적용하기 위해서는 많은 정보들이 필요한데, 이 필요한 정보들을 BattleContext에 한데모아 인자로 전달한다.

 

BattleContext 

필요한 정보에 따라 내용이 달라질 수 있지만, 대표적으로 공격자, 공격을 받는자, 게임모드 등의 정보가 있다. battleContext는 공격마다 필요하므로, 매번 생성할 경우 GC 비율이 높아진다. 이를 방지하기 위해서 BattleConextPool을 이용해 재사용하도록 한다. 물론 굉장한 관리가 필요할 듯 하다.

 

AttackEffect

StatManager.GoAttack()을 수행하면, 타격이 몇번인지, 각 데미지가 몇인지, 그에따른 연출이 어떤지 등이 달라질 수 있다. 만약 효과가 "2번 더 타격한다" 일 경우, 총 AttackEvent는 3 개이고, 각각 N의 데미지를 준다.