[MSW] 모험가 키우기 - 4 (스킬시스템 구조 설계)

2023. 1. 5. 18:15DIY/[개발 중][MSW] 모험가 키우기

핵심은 일정시간마다 스킬 테이블에서 가져 온 스킬 정보를 공격 함수에 인자로 넘겨줘서

스킬 시전을 연출하는 것이다.

이는 자동 시전방식이던 수동 시전방식이던 모두 호환이 가능해야 한다.

또한 발동패시브 타입의 스킬도 잠금 기능이 있어야 한다.

 

 

일정시간마다 자동 공격을 한다.

그리고 스킬의 쿨타임이 다 돌았을 경우에 자동으로 스킬 시전. 

(모든 공격은 동작 시간을 갖고 있고, 그 동안엔 다른 동작을 하지 못한다.

해당 시간은 공격 속도에 비례한다.)

 

스킬이 시전되면

해당 스킬 Id를 인자로 건네주고,

시스템은 테이블에서 해당 스킬 id를 찾아 공격력과 공격 대상 수, 이펙트를 처리한다.

 

1. _TimerService:SetTimer 메서드로 일정시간마다 공격 함수 실행.

SetTimer 사용 예시)

 

 

2. 큐 리스트에 실행할 스킬을 적재한다.

쿨다운을 먼저 마친 스킬부터 시전시키기 위해서이다.

또한 시전 가능하지만 아직 시전이 안 된 스킬들을 한번에 관리하려는 목적도 있다.

 

 

3. 다른 공격이 동작 중이라는 것을 어떻게 판별할 것인가?

동작시간 프로퍼티 number. 기본은 0값이지만,

스킬을 쓰면 해당 스킬의 동작 시간을 프로퍼티에 할당.

해당 프로퍼티는 프레임마다 값이 줄고, 0이 될 때까지 다른 스킬을 사용 못함.

 

 

4. 동작 시간이 공격 속도의 영향을 받게 하는 방법은 무엇인가?

 

 

 

[퀘스트]

 

1. 데이터셋(테이블)을 만들고 그 곳에 담긴 정보를 코드로 가져오기.

2. 데이터셋의 정보를 리스트에 담기.

3. 리스트에 담긴 스킬 정보를 토대로 스킬을 시전하기.

 


 

1. 데이터셋을 만들고 그 곳에 담긴 정보를 코드로 가져오기.

 

 

사용할 메서드들

해당 클래스의 스킬이 담긴 테이블을 가져오고,

 

원하는 스킬 id가 있는 행을 찾고,

 

그 행에 있는 정보 중 원하는 정보를 가져다 쓴다. (이펙트RUID, 스킬 데미지 등등의 인자들)

  

위의 코드로

1. 데이터셋을 만들고 그 곳에 담긴 정보를 코드로 가져오기.

완료!

 


 

2. 데이터셋의 정보를 리스트에 담기

 

루아에선 table로 배열, 세트, 해시 등 다양한 자료구조를 구현한다.

즉, table에 스킬 정보를 담아야 하는데,

일단 스킬 정보는 dataSet에서 가져온 row에 담겨 있다.

이 row를 그대로 테이블의 value에 담을 수 있으면 참 좋겠지만,

row를 담을 수 있는 자료형은 any 뿐이었다.

문제는 이 any가 테이블의 value값에 허용되지 않는다는 것...

그래서 이 row에 담긴 정보를 어떻게 테이블에 담을 수 있을지 질문하고 고민하던 중

메월드 공식 디스코드의 한 능력자 분이 답변을 주셨다.

답은 간단했다... 매우...

table.insert를 하면 된다.......난 왜 담으려는 시도조차 하지 않고 row의 정보를 어떤 자료형으로 취급해야 할지에 집착했지?ㅎㅎㅎㅎㅎㅎㅎ아마 table의 허용가능한 value값에 시선을 사로잡혔던 것 같다...

 

그래서 아래는 데이터셋의 스킬 정보를 table로 담는 코드이다.

그렇게 2번도 완료!

 


 

3. 리스트에 담긴 스킬 정보를 토대로 스킬을 시전하기.

 

이제 스킬 시전 함수를 만들고 스킬을 사용해보자.

스킬 시전 함수는 다른 컴포넌트에 위치해 있어서,

스킬을 시전하고자 하는 컴포넌트에서 self.Entity로 스킬을 시전하라는 이벤트를 보내줘야 한다.

 

일단 스킬 시전을 연출하려면

AttackService의 어택함수를 이용해야 하고,

사운드 리소스를 가져와 사운드 처리를 해야 하고,

이펙트 리소스를 가져와 이펙트 처리를 해주어야 최종적으로 모든 처리가 끝이 난다.

 

그러나 지금 당장은 리스트에 담긴 스킬 정보를 스킬을 시전하는 함수에 인자로 넣어 호출한다는

핵심에만 집중하기 위해 간소화하겠다.

 

특정 키를 눌렀을 때, 

table 중 임의의 스킬이 담겨 있는 인덱스를 이벤트에 담아 엔티티에 보낸다.

 

스킬시전함수가 담겨있는 컴포넌트는 엔티티 이벤트 핸들러에 그 이벤트를 구독하고 있다.

 

스킬시전함수가 담겨있는 컴포넌트는 table을 갖고 있는 컴포넌트를 참조하고 있다.

이벤트가 발생하면, 스킬시전함수가 호출되고 이벤트에 담긴 인덱스를 가지고

table에 직접 접근해서 스킬 정보를 습득한다.

 

어떻게 흘러가는 진 대강 알았으니,

이젠 실제로 스킬을 시전하도록

스킬의 이펙트, 사운드 정보를 데이터셋에 추가하고, 인게임 상에서 받아보자.

작동방식은 위에서 말했듯

테이블의 인덱스가 넘어오면

그 인덱스로 테이블에 직접 접근해, 스킬 정보를 가져와 활용하는 방식이다.

이펙트와 캐릭터 애니메이션, 효과음 기능을 추가해주었다.

 

 


 

주었다.

이렇게 스킬 구조를 설계하고, 스킬을 시전하는 연출을 해보았다.

다음 포스팅으로는 실제로 전투가 이뤄질 수 있도록 공격과 피격 처리를 구현하는 내용을 기록하겠다.