안녕하세요 '언리얼로 만들어보는 RPG'의 필자입니다. 약 2주간 장례식도 다녀오고 삽질도 하는등 시간이 순식간에 지나가 버렸습니다. 그래도 고민하던 스킬구현이 끝나서 이렇게 정리하여 글로 올리러 온것이죠.


이번글에서는 스킬이 가지고 있어야할 데이터를 구조체로 구성하고 스킬창 UI를 만드는것까지 해보겠습니다. 아마 개인적인 생각이지만 스킬창을 다 만들지는 못할 것 같습니다. 필자가 글을 쓸때마다 늘 작성했던 이야기이지만 작업을 시작하기전에는 어떤식으로 돌아갈지 전체적인 그림을 그려두어야 합니다. 뼈대를 만들고 나중에 살을 붙이는것이죠.


SkillData에는 ItemData와 기본적인건 똑같이 필요할것입니다. 필요한건 스킬의 설명, 필요레벨, 스킬의 최대레벨과 현재레벨, 그리고 실행할 애니메이션몽타주 정도면 될것 같네요. 작성해보도록 합시다.


InGameData.h

아까 이야기한것보다 뭔가 내용이 좀 많아진것 같으시다면 기분탓이 아니니 걱정하지 마세요. 스킬을 어떤 방식으로 사용하는지에 따라 타입을 나눠줄 필요가 있었습니다. 이 스킬의 범위와 데미지를 얼마나 줄지에 대한것도 필요했구요.


이건 여담이지만 무한 구조체 패턴의 폐해가 여기서 발생하게 되었습니다. 이걸 해결하려면 꽤나 대규모 작업이 필요해서 지금은 분노를 참고 다음작업할때 다시는 이런식으로 안하려고 생각중입니다.


InGameData.h

필자는 스킬의 타입을 3가지로 지정해 두었는데

Melee : 무기를 이용한 타격스킬

Scope : 사용자 중심으로부터 일정 반경의 적을 공격하는 스킬

Fire : 무언가를 발사하여 공격하는 스킬 ex) 파이어볼, 검기 등등


이를 이용해서 애니메이션몽타주의 Notify를 통해 작업할 예정입니다. 데이터가 준비되었으니까 이걸 플레이어한테 넣어줍시다.


PlayerBase.h

이번에는 배열을 만들어 두기만 하고 크기를 미리 지정해주지 않을 것입니다. 필자의 경우에는 캐릭터마다 사용할 스킬의 갯수가 다르기 때문입니다.


BpSkillTree(UMG 에디터)

<미리보는 완성본>


위 이미지가 바로 목표로 할 스킬창의 최종 모습입니다. 인벤토리나 장비창, 퀵슬롯과는 다르게 스킬창의 경우 보여줄 것도 많고 버튼을 이용해서 스킬투자를 할 수 있어야 하기때문입니다. 이를 위해서 스킬창은 Slot을 바로 쓰는게 아니라 Slot을 포함하고 있는 새로운 UI를 만들어서 그걸 담아줄 것입니다.


SkillSlot.h

SkillSlot의 경우 Slot의 Slotnum이 에디터상에서 계속 초기화 되기때문에 SkillSlot을 통해서 넘겨주어야 했습니다. 그걸 제외한 나머지는 에디터에서 생성하여 바인딩해줄 위젯들 입니다.


보시면 SkillUp, Down 함수가 있는데 해당 함수 두개는 각각 버튼에 delegate로 연결해줄 함수입니다.


SkillSlot.cpp

<Init함수 코드>


처음에 UI가 생성되어 초기화할때 플레이어의 레벨을 확인하여 스킬설명 텍스트를 초기화 하는것과 위에서 언급한 함수 두개를 delegate로 연결하는것 말고는 다른 UI와 크게 다르지 않습니다.


SkillSlot.cpp

SkillUp과 SkillDown 함수는 버튼UI를 이용해서 OnClicked 이벤트가 발생할때 실행하여 플레이어가 지니고 있는 SkillData의 Level값과 Cost를 갱신하고 UI에 반영하는 역할을 합니다.


이제 코드로 준비해야할 부분은 다 처리가 끝난것 같아 보이니 UMG에디터를 이용해서 UI를 만들어 보러 가겠습니다.


UMG 에디터를 이용해서 만드는걸 하나하나 캡쳐해서 올리기에는 너무 무리가 있다 싶어서 간략하게 만들기만 하는 영상을 찍었습니다.


이번글은 여기까지 작성하고 다음에 다시 돌아오도록 하겠습니다. 저 별거아닌 영상을 찍는데 예상치 못한 방해가 몇번 일어나고 실수 몇번이 더해지니까 너무 많은 시간을 들여서 그런가 진이 다 빠지는군요.


이건 별로 쓸데없는 여담이긴 하지만 필자는 가급적 영상을 안올리고 gif형태로 올리려고 했습니다. 그래야 글을 읽다가 흐름이 안끊길거라고 생각했기 때문입니다. 이번엔 어쩔 수 없었으니 너그러운 마음으로 이해 부탁드립니다.

Posted by 별수집가
,