[MSW] 모험가 키우기 - 7 (수치 설정, 스킬시스템 개편)

2023. 2. 17. 16:41DIY/[개발 중][MSW] 모험가 키우기

플레이어가 스킬을 시전할 때,

이펙트의 재생속도와

스킬 동작 애니메이션의 재생속도,

사운드 재생속도,

그리고 데미지가 출력되는 4박자의 타이밍이 일치해야 한다.

그리고 그렇게 일치된 타이밍을 일괄적으로 변경하기 위해서는

기준 수치가 필요한데, 플레이어의 공격 속도 수치를 기준으로 삼을 것이다.

 

공격 속도는 느려지든 빨라지든 변화가 많은 프라퍼티이다.

최종적으로 결정된 공격 속도로 스킬의 시전시간과 나누기 연산하여

최종적인 스킬 시전 시간을 결정한다.

 

공격 속도가 빠르면(높으면) 시전 시간이 빨라진다.(짧아진다)

이를 위한 공식 == 스킬 시전 시간 / 공격 속도


4편에서 스킬 시스템 구조를 포스팅했었다.

생각해보니 스킬의 변화량을 스킬에 적용시키려면

이전의 구조로는 불가능해서 이번엔 새로 구상한 구조를 포스팅하겠다.

 

준비물은 클래스 스킬 컴포넌트와

그 프라퍼티로 스킬 정보가 담긴 행이 들어갈 테이블과,(이하 1번테이블)

그 스킬들의 변화량이 담긴 테이블이 들어갈 테이블이다.(이하 2번테이블)

먼저, 스킬의 데이터셋에서 스킬 정보가 담긴 행을 가져와 1번테이블에 insert한다.

가져오는 방식은 데이터셋의 총 행 수만큼 반복문을 돌려서 행을 가져온다.

가져오는 동시에, 스킬의 변화량을 담기 위한 2번테이블의 하위테이블을 만든다.

 

스킬의 종류는 공격형, 버프형, 디버프형, 소환형 등 여러가지가 있고,

그마다 필요한 요소들도 다르므로

(ex. 공격형은 데미지계수 필드가 들어가지만 다른 것은 그렇지 않다.)

어떤 구조의 하위테이블을 만들지 조건문을 통해 검사한다.

row:GetItem("skillType")으로 나온 값이

공격형 스킬이면,

2번테이블[index] = {

    damageRate = -0.2

}

----

(참고로 데미지 연산 공식은

(플레이어의 power * 스킬의 데미지 계수) * (1 + damageRate)이다.)

----

 

버프형 스킬이면,

2번테이블[index] = {

    attackSpeedRate = 0.2

}

----

(참고로 스킬시전시간 연산 공식은

스킬시전시간 / 공격속도지만,

플레이어의 공격속도 연산 공식은

공격속도 * 변화량이다.

그리고 위의 공격 속도 버프스킬의 변화량 연산 공식은

스킬의 기본 변화량 * (1+attackSpeedRate)이다.)

 

그렇게 모든 스킬의 정보와 변화량을 받았다면,

이제 스킬을 시전하는데,

기존에는 스킬을 시전하기 위해 row만 넘겨주었다면

이젠 그 변화량이 담긴 테이블까지 전달한다.

row:GetItem("id")로 나온 값으로 2번테이블의 하위테이블에 접근한다.

(데이터셋의 순서는 스킬 id 오름차순이고,

그 순서대로 반복문을 돌려 2번테이블의 하위테이블을 만들었으므로

스킬의 id는 2번테이블의 인덱스 역할을 할 수 있다.)

 

그렇게 전달된 공격스킬의 row와 테이블이 활용되는 예시를 한번 보자.

공격형 스킬이라는 건 SkillActivateComponent에서 구분되고,

공격형 함수를 호출하는데 이때 똑같이 row와 테이블을 넘겨준다.

calcDamage함수에서 데미지를 연산하는 식은 다음과 같다.

(_PlayerStatusLogic.power * row:GetItem("power")) * (1 + table.damageRate)

 

공격 함수에서 row와 table이 이런 식으로 사용 되었다면,

이제는 table이 생겨난 취지였던 변화량을 담기 위한 예시를 살펴보자.

 

일단 스킬의 변화량은 장비, 다른 스킬 등등 여러가지 요소에 영향을 받을 수 있다.

그 모든 요소들이 클래스마다 상이한 스킬 컴포넌트를 참조해서 접근하기는 번거로우므로

이벤트를 활용할 것이다.

 

대상 클래스 enum값, 대상 스킬 id, 필드네임, 변화량을

changeInfoTableUpdateEvent에 담아 보낸다.

 

클래스 스킬 컴포넌트가 그 이벤트를 구독하고 있다가 감지하면,

이벤트에 담긴 클래스enum값이 자신의 것과 맞는지 판별 후,

맞다면 대상 스킬 id를 통해 2번테이블의 인덱스에 접근한다.

그리고 필드네임을 통해 최종 요소에 접근한 후,

그 값에 이벤트에 담긴 변화량을 더한다.(변화량끼리는 합연산)

 

이렇게 새로 구상한 스킬 시스템 구조 포스팅을 마무리하겠다.