[ STAC 개발일지 ] 스택 개발일지 4 - Player Skill System

2024. 8. 10. 16:17STAC 개발일지

전투 시스템 개발에 관한 글을 4번으로 쓰려했으나

너무 빨리 단시간에 많은 내용을 개발해 버려서 쓸 엄두가 나지 않아 스킵하고

다음으로 개발하는 스킬 시스템에 대한 글을 쓸 예정이다.

 

우선 구조를 좀 고민했다.

 

SO만 끼우면? 알아서 Controller가 쿨타임마다 스킬을 활성화해주고

스킬 버튼을 누르면 알아서 지정된 스킬을 사용하게끔, 그리고 교체에

용이하도록 진짜 Change함수 같은 거 하나만 실행시켜 주면 바로바로

교체가 가능한 수준의 무언가를 만들어야 한다.

 

고민해 본 결과 지금은 전투시스템 개편으로 사라졌지만.

기존에 있던 무기시스템에 영감을 받아 SO가 들어가면

스킬을 실질적으로 실행해 주는 프리팹을 생성하여 스킬을 구현하도록 구조를 짤 것이다.

 

일단 스크립트를 이렇게 3개정도 만들어 둔다

PlayerSkill은 스킬구현 프리팹에 들어갈 스킬 스크립트들의 부모클래스이고

Controller는 SO를 넣었을때 Initialize()를 실행시키고 UI와의 연결작업, 쿨타임 재기 등등을

담당할 스크립트이고, SO는 스킬의 Id, 이름, 설명, 아이콘 등등이 들어간다.

 

우선 가장 간단한 스크립트는 SO스크립트라 먼저 싹다 적어둔다.

또한 스킬 프리팹에 들어갈 스크립트를 작성해주자

 

우선 이 PlayerSkill이라는 클래스를 상위로 이 클래스를 받아서 구현하는 식으로

스킬의 구조가 짜여질 예정이다.

 

일단 필요한 것은 스킬의 강도를 전체적으로 조절할 스킬의 "Level"과

스테이터스나 각종 요소에 직접적으로 관여하기위해 필요한 Player참조 변수,

그리고 쿨타임을 외부에서 관리하기때문에 내부에서 쿨타임 조절을 건드리기 위한 coolingPower 변수

그리고 전반적으로 공격위주의 스킬이 될 것이기 때문에 타겟을 지정하기 위한 레이어를 냅다

상위에 추가할 것이다.

속성은 이게 다고 필요한 메서드는 스킬을 처음에 생성하면서 Initialize를 통해 Player를 할당해주고

외부에서는 쿨타임을 체크하고 UseSkill() 메서드로 실질적으로 스킬을 시전하게 될 것이다.

 

이제 PlayerSkillController 부분을 작성한다.

필요한 변수들은 이렇게 정리했다.

현재 장착(적용)중인 스킬의 SO와 현재 생성된 이 스킬의 프리팹을 캐싱하는 변수.

 

그리고 스킬이 적용되면 인게임 버튼에 스킬 아이콘과 쿨타임에 따른 게이지가 적용이

되어야 하는데, 이를 관리해줄 놈을 따로 빼기도 애매해서 일단은 여기다 갖다 박아놨다.

 

그리고 쿨타임 카운트를 위한 변수, 스킬이 잠겨있는지 여부, 플레이어 캐싱 변수를 들고 있다.

 

함수들을 하나씩 까보자

 

SO를 만들 때 중간에 잠깐 보였었는데

RecoveryType 이란 회복방식이다. 스킬 쿨타임을 회복함에 있어, 단순히 자연적으로 시간이 지남에 따라

회복될 것인지, 아니면 다른 방법 (공격, 피격)을 통해 회복될 것인지를 결정하는 타입으로.

따라서 각각에 맞게 이벤트를 구독해 준다.

 

사실 자연회복과 다른 방식들의 사용함수가 다른데. 이는 이걸 보면 이해된다

자연회복 함수가 1초마다 호출이 되었다면 Int버전으로 동일하게 사용할 수 있으나

얘는 Update에서 호출되는 놈이라 그게 불가능하다.

등록된 스킬을 사용할 수 있게 해주는 함수이다.

쿨타임과 스킬사용가능여부를 체크하고 쿨타임을 초기화한다.

 

얘는 단순히 쿨타임에 따라 게이지를 갱신시켜 주는 함수.

마지막으로 이벤트 함수들이다

앞서 구현된 함수들을 사용하고, 필요한 InputSystem에 구독을 해준다.

 

어쨌든 구현이 끝나면 이렇게 SO를 만들고 스킬을 구현해서 프리팹으로 빼서 넣어주기만 하면 된다.

 


이런 식으로 스킬 시스템이 돌아간다.

지금 당장에는 구조가 그렇게 불만이 있진 않지만 이게 제일 단순하고 확실한 구조라 나중에

코드를 다시 보고 뭘 느끼게 될지는 모르겠다.